TEMA 1

Creación, compilación y ejecución de un programa

Creación del programa

Se puede crear un archivo que contenga el programa completo, como en los ejemplos que se tienen más adelante. Se puede usar cualquier editor de textos ordinario con el que se este familiarizado. Un editor disponible en la mayoría de los sistemas UNIX es vi, y en Linux se puede usar pico. Por convención el nombre del archivo debe terminar con ``.c'' por ejemplo: miprograma.c progprueba.c. El contenido del archivo deberá obedecer la sintaxis de C.

Compilación

Existen muchos compiladores de C. El cc es el compilador estándar de Sun. El compilador GNU de C es gcc, el cual es bastante popular y esta disponible en varias plataformas. Existen también compiladores equivalentes de C++ los cuales usualmente son nombrados como CC. Por ejemplo, Sun provee CC y GNU GCC. El compilador de GNU es también denotado como g++. Existen otros compiladores menos comunes de C y C++. En general todos los compiladores mencionados operan esencialmente de la misma forma y comparten muchas opciones comunes en la línea de opciones. Más adelante se listan y se dan ejemplos de opciones comunes de los compiladores. Sin embargo, la mejor referencia de cada compilador es a través de las páginas en línea, del manual del sistema. Por ejemplo: man gcc. Para compilar el programa usaremos el comando gcc. El comando deberá ser seguido por el nombre del programa en C que se quiere compilar. Un determinado número de opciones del compilador pueden ser indicadas también. Por el momento no haremos uso de estas opciones todavía, se irán comentando algunas más esenciales. Por lo tanto, el comando básico de compilación es: gcc programa.c donde programa.c es el nombre del archivo. Si hay errores obvios en el programa (tales como palabras mal escritas, caracteres no tecleados u omisiones de punto y coma), el compilador se detendrá y los reportará. Podría haber desde luego errores lógicos que el compilador no podrá detectar. En el caso que esta fuera la situación se le estará indicando a la computadora que haga las operaciones incorrectas. Cuando el compilador ha terminado con éxito, la versión compilada, o el ejecutable, es dejado en un archivo llamado a.out, o si la opción -o es usada con el compilador, el nombre después de -o es el nombre del programa compilado. Se recomienda y es más conveniente usar la opción -o con el nombre del archivo ejecutable como se muestra a continuación: gcc -o programa programa.c el cual pone el programa compilado en el archivo del programa señalado, en éste caso en programa, en vez del archivo a.out.

Ejecucion del programa

El siguiente estado es correr el programa ejecutable. Para correr un ejecutable en UNIX, simplemente se escribe el nombre del archivo que lo contiene, en este caso programa (o a.out). Con lo anterior, se ejecuta el programa, mostrando algún resultado en la pantalla. En éste estado, podría haber errores en tiempo de ejecución (run-time errors), tales como división por cero, o bien, podrían hacerse evidentes al ver que el programa no produce la salida correcta. Si lo anterior sucede, entonces se debe regresar a editar el archivo del programa, recompilarlo, y ejecutarlo nuevamente.


EL MODELO DE COMPILACION EN C

las distintas étapas que cubre el compilador para obtener el código ejecutable:



EL PREPROCESADOR

Esta parte del proceso de compilación será cubierta con más detalle en el capítulo 12 referente al preprocesador. Sin embargo, se da alguna información básica para algunos programas de C. El preprocesador acepta el código fuente como entrada y es responsable de: • quitar los comentarios
• interpretar las directivas del preprocesador las cuales inician con #.
Por ejemplo:
• #include -- incluye el contenido del archivo nombrado. Estos son usualmente llamados archivos de cabecera (header). Por ejemplo:
o #include -- Archivo de la biblioteca estándar de matemáticas.
o #include -- Archivo de la biblioteca estándar de Entrada/Salida.
• #define -- define un nombre simbólico o constante. Sustitución de macros.
o #define TAM_MAX_ARREGLO 100
EL COMPILADOR,EMSAMBLADOR Y LIGADOR EN C

El compilador de C traduce el código fuente en código de ensamblador. El código fuente es recibido del preprocesador.
El ensamblador crea el código fuentei o los archivos objeto. En los sistemas con UNIX se podrán ver los archivos con el sufijo .o.
Si algún archivo fuente hace referencia a funciones de una biblioteca o de funciones que están definidas en otros archivos fuentes, el ligador combina estas funciones (con main()) para crear un archivo ejecutable. Las referencias a variables externas en esta étapa son resueltas.
Algunas opciones útiles del compilador

Descrito el modelo básico de compilación, se darán algunas opciones útiles y algunas veces esenciales. De nueva cuenta, se recomienda revisar las páginas de man para mayor información y opciones adicionales.
-E
Se compilador se detiene en la étapa de preprocesamiento y el resultado se muestra en la salida estándar. gcc -E arch1.c
-c
Suprime el proceso de ligado y produce un archivo .o para cada archivo fuente listado. Después los archivos objeto pueden ser ligados por el comando gcc, por ejemplo: gcc arch1.o arch2.o ... -o ejecutable
-lbiblioteca
Liga con las bibliotecas objeto. Esta opción deberá seguir los argumentos de los archivos fuente. Las bibliotecas objeto son guardadas y pueden estar estandarizadas, un tercero o usuario las crea. Probablemente la biblioteca más comúnmente usada es la biblioteca matemática (math.h). Esta biblioteca deberá ligarse explícitamente si se desea usar las funciones matemáticas (y por supuesto no olvidar el archivo cabecera #include , en el programa que llama a las funciones), por ejemplo: gcc calc.c -o calc -lm
Muchas otras bibliotecas son ligadas de esta forma.
-Ldirectorio
Agrega directorios a la lista de directorios que contienen las rutinas de la biblioteca de objetos. El ligador siempre busca las bibliotecas estándares y del sistema en /lib y /usr/lib. Si se quieren ligar bibliotecas personales o instaladas por usted, se tendrá que especificar donde estan guardados los archivos, por ejemplo: gcc prog.c -L/home/minombr/mislibs milib.a
-Itrayectoria
Agrega una trayectoria o ruta a la lista de directorios en los cuales se buscarán los archivos cabecera #include con nombres relativos (es decir, los que no empiezan con diagonal /). El procesador por default, primero busca los archivos #include en el directorio que contiene el archivo fuente, y después en los directorios nombrados con la opción -I si hubiera, y finalmente, en /usr/include. Por lo tanto, si se quiere incluir archivos de cabecera guardados en /home/minombr/miscabeceras se tendrá que hacer: gcc prog.c -I/home/minombr/miscabeceras
Nota: Las cabeceras de las bibliotecas del sistema son guardados en un lugar especial (/usr/include) y no son afectadas por la opción -I. Los archivos cabecera del sistema y del usuario son incluídos en una manera un poco diferente.
-g
Opción para llamar las opciones de depuración (debug). Instruye al compilador para producir información adicional en la tabla de símbolos que es usado por una variedad de utilerías de depuración. Por ejemplo, si se emplea el depurador de GNU, el programa deberá compilarse de la siguiente forma para generar extensiones de GDB: gcc -ggdb -o prog prog.c
-D
Define símbolos como identificadores (-Didentificador) o como valores (-Dsímbolo=valor) en una forma similar a la directiva del preprocesador #define).
-v
Muestra en la salida estandar de errores los comandos ejecutados en las étapas de compilación.

USO DE LAS BIBLIOTECAS

C es un lenguaje extremadamente pequeño. Muchas de las funciones que tienen otros lenguajes no están en C, por ejemplo, no hay funciones para E/S, manejo de cadenas o funciones matemáticas. La funcionalidad de C se obtiene a través de un rico conjunto de bibliotecas de funciones. Como resultado, muchas implementaciones de C incluyen bibliotecas estándar de funciones para varias finalidades. Para muchos propósitos básicos estas podrían ser consideradas como parte de C. Pero pueden variar de máquina a máquina. Un programador puede también desarrollar sus propias funciones de biblioteca e incluso bibliotecas especiales de terceros, por ejemplo, NAG o PHIGS. Todas las bibliotecas (excepto E/S estándar) requieren ser explícitamente ligadas con la opción -l y, posiblemente con L, como se señalo previamente

Funciones de la biblioteca de UNIX

El sistema UNIX da un gran número de funciones de C. Algunas implementan operaciones de uso frecuente, mientras otras están muy especializadas en relación a su aplicación. No reinvente la rueda. Se recomienda revisar si una función en alguna biblioteca existe, en vez de hacer la tarea de escribir su propia versión. Con lo anterior se reduce el tiempo de desarrollo de un programa. Ya que las funciones de la biblioteca han sido probadas, por lo que estarán corregidas, a diferencia de cualquiera que un programador pueda escribir. Lo anterior reducirá el tiempo de depuración del programa.

REGRESAR ARRIBA


REGRESAR A LA PAGINA INICIAL