martes, 4 de enero de 2011

Kernighan_Ritchie_1.1 Hola Mundo en C (Usando Linux)

1.1 Ejecute el programa "hola, mundo" en su sistema. Experimente con la omisión de partes del programa, para ver qué mensajes de error se obtienen.
Imprimir la expresión "Hola, Mundo!", se ha convertido en el primer programa para todos los lenguajes de programación. Desde luego, una de las  primeras cosas que hay que hacer para programar es saber imprimir un mensaje en la pantalla; saludar al mundo es una buena opción. También es una buena opción aprender a programar en C, un lenguaje que ha ganado buena fama a lo largo de casi  cuarenta años debido a diversos factores:

Sus creadores lo usaron para programar el sistema operativo Unix, del cual se han desprendido linux con todas sus distribuciones; darwin, base del MacOs y, por lo menos hasta hace poco, y hasta donde sé, windows. Si está interesado en los sistemas operativos, y todos los estudiantes de ingeniería en sistemas lo están, aprender C le conviene. 

C es bastante poderoso por estar muy cercano a el "lenguaje máquina". Se trata de un lenguaje de relativo "bajo nivel", en donde bajo no es un adjetivo peyorativo. Sólo hace referencia a su capacidad para aceptar lenguaje conveniente para las computadoras, aunque no para el humano.

A pesar de no ser un lenguaje "fácil", ha llegado a sustituir a Pascal como el lenguaje con el cual los estudiantes tienen el primer contacto con la programación. Generaciones enteras están escribiendo sus primeras líneas de código usando C. En los comparativos de lenguajes del año o lenguajes más usados siempre aparece en las primeras posiciones, y esta popularidad no parece disminuir con el tiempo, más bien al contrario, se incrementa, ante el carácter pasajero de muchos otros.

C también le está ganando terreno a Fortran como lenguaje de programación de métodos numéricos. Y muchos investigadores y estudiantes prefieren migrar el software de Fortran a C, a pesar de la existencia de lenguajes especializados como Mathematica, Maple y Matlab.

El lenguaje es relativamente pequeño, y un programador puede de manera sensata decir que domina todos sus aspectos, algo que se antoja bastante más difícil en, digamos, Java.

La inversión en el aprendizaje es aún más valiosa, si cabe, en la medida que C es la puerta para otros lenguajes, como C++, C# y Java. Un usuario de  C puede, con relativa facilidad, migrar a esos lenguajes un poco más "altos". La conexión entre C, C++ y Java es tal que H. y P. Deitel, conocidos autores de varios libros de programación, han dedicado uno sólo a esos tres lenguajes (C/C++ y Java, Cómo Programar, Editorial Prentice Hall).

C es un lenguaje compilado, no interpretado, lo cual tiene como gran ventaja que las ejecuciones son rápidas, algo muy conveniente si se quiere ahorrar tiempo en el cálculo numérico.

Los creadores confiaron en que el usuario sabe lo que hace, y por lo tanto el lenguaje le otorga bastante poder al programador.

El lenguaje tiene ganada una muy buena fama entre programadores "serios", así que si esa razón superficial le importa, puede estar seguro que nadie pensará que es usted un mal programador porque usa C, al contrario.


Antes de hablar del programa en sí, también convienen unas palabras referentes al entorno en el que programaremos. Lo normal en la mayoría de las escuelas es usar un compilador comercial, como Borland, o alguna IDE (un ambiente que genera de manera automática la estructura del programa, resalta la sintaxis, compila, ejecuta y depura; entre muchas cosas más). Esas opciones son válidas y estoy seguro que la mayoría de sus usuarios están bastante satisfechos. Sin embargo, no tengo dinero para pagar  licencias y no soy usuario de Windows, así que no me gustan los compiladores comerciales, dicho sea de paso, me parecen inferiores a los libres, pero puede ser un juicio condicionado. El asunto con las IDES es un poco distinto. Según entiendo, es preferible hacer las cosas por uno mismo, por lo menos cuando se está empezando, aunque sólo sea la tarea de escribir encabezados. El problema con las IDES es que traen muchas cosas prefabricadas y uno puede fácilmente volverse un experto en el ambiente, cuando debería serlo en el lenguaje. Por otro lado pienso que son de gran ayuda en proyectos grandes; pero Hola Mundo, y la mayoría de los programas que uno hace en la escuela, no son particularmente extensos y siempre es posible usar varios archivos. Creo que es cuestión de gustos y de ninguna manera critico a quienes las usan. Sin embargo yo prefiero los editores, y entre ellos, vim (la instrucción vi o vim es indistinta en linux, aunque no en Unix, en donde existe por default unicamente vi).
Editores de texto existen muchos, desde el banal bloc de notas de Windows, hasta el poderoso kate; cada programador tiene su favorito y no es mi intención crear controversias. En dónde se escriba el código es irrelevante. Sin embargo daré las razones por las que vi es mi favorito:

Vivimos, más o menos, en un mundo en el que las cosas se hacen a base de clicks de ratones, y eso ha llegado a ser sinónimo de facilidad. Sin embargo creo que es un error pensar que el ratón hace las cosas más rápidas. Tal vez las hace más simples, pero no más rápidas. Diez dedos sobre el teclado son mejores que uno sobre el ratón. De los editores que conozco, todos requieren el uso de clicks, todos menos uno: vim. Ese es el editor que prefiero. Sólo porque me ha costado trabajo alcanzar una buena cantidad de pulsaciones por minuto, veo como una pérdida sustancial de tiempo tener que levantar los dedos del teclado y usar el ratón, estoy seguro que más de uno estará de acuerdo conmigo en que eso rompe el ritmo al escribir.

Vi es un editor diseñado por programadores para programadores, así que puede estar seguro que cubre las necesidades a las que uno se puede enfrentar.

Vi está pensado para usarse sin un entorno gráfico, lo cual genera, en cierta medida, eduación respecto al uso de las computadoras. Muchas personas, en realidad la gran mayoría de los usuarios, no saben qué hacer cuando su sistema operativo no presenta un ambiente gráfico (escritorio con ventanas) y, por lo tanto, no se pueden dar clicks de ratón. Si es usted estudiante, o le interesa aprender computación, debe saber desde el inicio que existen sistemas operativos que se instalan sin un modo gráfico, en los que el único editor por default es vi. También hay computadoras con pocos recursos a las cuales el usuario tal vez prefiera no instalarles un escritorio completo (como KDE o GNOME).


Cuando hay que pasar demasiado tiempo frente a una computadora, el fondo negro de vi (es alternativo, y se puede cambiar, como puede verse en esta entrada Colores en Vim) es bastante más soportable que los colores blancos o rutilantes de otros editores (aunque supongo que también es posible cambiar el fondo en esos editores). En particular prefiero siempre Ctr + Alt + F2 y trabajar con la pantalla completa con fondo negro y sintaxis resaltada.


Finalmente unas palabras de advertencia: vi es el editor de textos más difícil de aprender, y de entrada parece bastante complicado de usar. Necesitará revisar manuales en internet (Como en esta página). Pero si persiste en el intento pronto se dará cuenta de los beneficios. Baste decir, para los fines de esta entrada, que existen tres modos en ese editor: de edición, de inserción y de comandos.
El modo de edición es el que está establecido cuando entramos. Lo indispensable para sobrevivir aquí es saber que la tecla h corre el cursor a la derecha; la tecla l, a la izquierda; la tecla k hacia arriba; la letra j hacia abajo; la letra x borra un caracter.
En el modo de inseción se puede escribir el texto. Para pasar de modo edición a modo inserción, teclee i (de insert). En tanto que para pasar de inserción a edición teclee la tecla de Escape.
El modo comando sirve, entre otras cosas, para manipular el archivo. Se llega a este modo tecleando Escape y :, si se está en modo inserción y : si se está en modo edición. Para guardar el archivo hay que estar en modo comando y escribir w. Guardar y salir es wq.

Y ahora lo importante, su primer programa en C. Después de todo, si está leyendo esta entrada es porque quiere aprender el lenguaje y no necesita razones. También supongo que está usando linux o algún otro Unix con el editor vim.

Lo primero es abrir una consola y teclear lo siguiente:

$ vi HolaMundo.c

con esta linea le estamos indicando al editor de textos vi que abra un nuevo archivo de extensión .c llamado HolaMundo.

Una vez hecho esto entramos a vi. Sin embargo si intenta escribir algo no podrá, esto es porque el editor entra en un modo de edición. Para escribir tiene que teclear i (de insertar), y entonces tiene que teclear el código que aparece abajo: 

#include <stdio.h>

int main()
{ // Abre main

 printf("\nHola, mundo!");

} // Cierra main


Eso es todo. Para guardarlo teclea Esc : wq (La tecla de Escape, dos puntos, wq, enter). Entonces, en linea de comandos escribe lo siguiente:

$ cc HolaMundo.c -o Hola

Lo que estamos haciendo es llamar al compilador de c y decirle que compile el archivo HolaMundo.c, si no ha ocurrido un error, entonces se genera un ejecutable con el nombre Hola. La instrucción

$ cc HolaMundo.c

genera un ejecutable con el nombre de a.out. Todos los archivos sin un nombre explícito generarán un ejecutable llamado a.out. Para asignar el nombre usamos la istrucción de arriba.
Si por alguna razón hay un error de sintaxis o algo no está bien, el compilador indica la línea en la que está ocurriendo el error. Es necesario entrar de nuevo al archivo (con vi HolaMundo.c) y editarlo.
Si todo salió bien entonces sólo veremos el promt ($ ) en la pantalla. Podemos ejecutar el programa. Esto se hace con la instrucción

$ ./Hola

o

$ ./a.out

Ante lo cual obtendremos el mensaje:

$ Hola, Mundo!

Y eso es todo. El programa está compilado y ejecutado.
Ahora algo sobre el programa.
Todos los programas en C están compuestos de funciones. Estas funciones son unidades de programa que realizan acciones específicas. Algunas son definidas por el usuario y algunas ya están hechas por los desarrolladores del lenguaje. printf es una función y está empaquetada para que el usuario no tenga que definirla. Las funciones importantes de entrada y salida están hechas y son parte del lenguaje, para usarlas sólo hay que invocarlas. Cuando se usan funciones empacadas es necesario informar al compilador que se usarán, para ello se usa el encabezado
#include <stdio.h>
 
este debe incluirse en todos los programas. Indica que usaremos entrada y salida de datos, entre otras cosas.

Con respecto a la línea
int main()
 
hay que decir que todos los programas tienen una función de manera obligatoria: la función main. La ejecución del programa empieza con main. Por otra parte, todas las funciones reciben y devuelven argumentos, en particular int indica que main retorna un entero (aunque en el programa se ha omitido la devolución explícita de este entero). A continuación viene el nombre de la función y después, entre paréntesis, el tipo de datos que recibe. Como main no recibe ningún valor, se deja los paréntesis en blanco.

Los paréntesis que encierran la siguiente instrucción indican los límites de main. Todas las llaves deben cerrarse adecuadamente,  lo contrario es un error de sintaxis. Todo lo que se escriba después de //, y antes del siguiente salto de línea, es un comentario. El compilador pasa por alto todo eso y simplemente son de ayuda para que el programador sepa lo que hace su programa (Véase la entrada Consejos para programar).
La instrucción siguiente es la parte más importante del programa:
 printf("\nHola, mundo!");
 
esta instrucción indica que se ha de imprimir aquello que se encuentra entre comillas como argumento en los paréntesis de printf. En este caso es el mensaje Hola, Mundo!.

El ejercicio sigue quedando pendiente, modifique el código para que imprima otras cosas: "Bienvenido a la programación en C", "Este es un buen programa", etc.
Esa es la puerta para programar en C. Seguramente le será fácil encontrar una lista de buenos libros. Yo tengo dos, que me gusta compartir:

Deitel, C/C++ y Java, Cómo Programar, Editorial Prentice Hall.
Los libros de Deitel son ya clásicos y no asumen ningún conocimiento previo. Llevan al alumno paso a paso a través de libros extensos repletos de ejemplos bien comentados y ejercicios. Incluyen en cada capítulo una lista de buenas prácticas de programación, tips de portabilidad, de ingeniería de software, desempeño, etc. Para empezar creo que es la mejor opción.

Kernighan y Ritchie, El Lenguaje de Programación C, Editorial Prentice Hall.
De los creadores del lenguaje, este libro es un clásico de la computación. Es breve pero muy interesante. Los ejemplos y ejercicios son de gran utilidad. Como desventaja no es un libro para principiantes, aunque si quiere puede usarlo, ya que es autocontenido. Puede encontrar ejercicios resueltos de este libro en este blog, en la etiqueta Kernighan-Ritchie.

Nada se aprende mejor que aquello que se aprende por iniciativa propia. Tal vez tenga que aprender para pasar un curso. Eso sólo dura 6 meses. Si yo fuera su maestro desde ahora le daría un 10. Como he dicho antes, esta es una actividad interesante. Programar es, tal vez, lo más interesante que puede hacese con una computadora. Estas máquinas son bastante poderosas (los "ciclos máquina", que son las operaciones lógicas que pueden hacer en un segundo, vienen dados en las especificaciones del procesador, y son del orden de GigaHertz) y todo ese poder está ahora disponible para cualquiera que se tome la molestia de aprender a comunicarse con ellas. Cuando en 1997 una computadora venció al campeón mundial de ajedrez, muchas personas expresaron cierta alarma por ver al hombre derrotado en un ámbito que se considera exclusivamente humano. Bien visto, ese evento más bien debe hacernos sentir orgullosos como especie por los muy humanos programadores que tuvieron que escribir las líneas de código para emular a la única máquina capaz de comprender los sistemas complejos: el cerebro del hombre.
___________________________________________________________________________________________
Esta entrada es parte de los programas resueltos del libro El Lenguaje de Programación C de B. Kernighan y D. Ritchie
Entrada siguiente: Ejercicio 1.2
___________________________________________________________________________________________

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...