Sunteți pe pagina 1din 8

Una introduccin al compilador C de GNU o

Hctor Adrin Valdecantos e a


Departamento de Ciencias de Computacin o Facultad de Ciencias Exactas y Tecnolog - UNT a Materia: Programacin o Carrera: Programador Universitario Licenciatura en Informtica a ...

27 de agosto de 2010

1.

Introduccin o

GNU es un proyecto iniciado en 1984 por Richard Stallman para crear un sistema operativo libre parecido a Unix. La idea original de este proyecto es promocionar libertad y cooperacin o entre usuarios de computadoras y programadores. El acrnimo GNU es recursivo y viene de o GNU is Not Unix, y el compilador para C del proyecto GNU se llama gcc, y su nombre proviene de GNU C Compiler 1 Un compilador es un programa informtico que traduce un programa escrito en un lenguaje a de programacin a otro lenguaje de programacin, generando un programa equivalente que o o la mquina ser capaz de interpretar. Usualmente el segundo lenguaje es lenguaje de mquia a a na, pero tambin puede ser simplemente texto. Este proceso de traduccin se conoce como e o compilacin.[wik] o En este art culo se tratar el proceso de compilacin completo, en todas sus etapas, para traa o ducir archivos de cdigo fuente escritos en el lenguaje de programacin C usando el programa o o compilador gcc del proyecto GNU.
Hoy en d gcc tambin quiere decir GNU Collection Compiler porque tambin representa una coleccin a e e o de compiladores.
1

2.

Escribiendo un programa en C

El compilador gcc es capaz de compilar cualquier programa en el lenguaje C escrito en un archivo de texto convencional. Por lo tanto es posible usar cualquier editor de texto para crear y editar un programa en C como el que se muestra a continuacin: o
# include int main { printf return } < stdio .h > ( void ) ( " Hola , mundo !\ n " ); 0;

Cdigo 1: Programa en C. o El cdigo fuente esta escrito en un archivo de texto, estos archivos llevan el sujo .c para o identicar que su contenido corresponde al cdigo de un programa en el lenguaje C. Por o ejemplo, el cdigo anterior podr estar almacenado en un archivo de nombre hola.c. o a Por supuesto tambin existen herramientas ms especializadas para escribir y editar cdigo e a o fuente de una manera ms eciente. a

3.

Compilando un programa en C

Cuando invocamos al compilador mediante el comando gcc es posible enviar mltiples opu ciones y mltiples nombres de archivos como argumentos. Asumiendo que el cdigo fuente u o se encuentra en un archivo llamado hola.c, para compilarlo con gcc usamos el siguiente comando:
$ gcc - Wall hola . c -o hola

Cdigo 2: Comando para compilar. o El comando anterior compila el cdigo fuente de hola.c a cdigo mquina y lo almacena o o a en el archivo ejecutable hola. Se pueden ver las siguientes opciones y archivos involucrados en la invocacin al compilador: o -Wall Opcin para activar las advertencias2 del compilador ms comnmente usadas. Se reo a u comienda que siempre se use esta opcin. o
El compilador genera advertencias sobre los elementos del cdigo fuente que pueden llegar a ser errores o en la codicacin. Tambin son conocidas como warnings. o e
2

-o Opcin para especicar el archivo de salida. Esta es usualmente la ultima opcin en la o o l nea de comando. Si se omite esta opcin, el archivo de salida por defecto es a.out o hola.c Nombre del archivo fuente de entrada para ser compilado. hola Nombre del archivo de salida. Es el archivo ejecutable.

4.

Etapas de la compilacin o

Cuando invocamos el comando gcc, normalmente se realiza un preprocesamiento, compilacin, ensamblado, y enlazado3 . Estas son las cuatros etapas involucradas en la compilacin o o o traduccin de un archivo fuente a un archivo objeto ejecutable. o Cada etapa tiene tiene un cdigo fuente como entrada y un cdigo objeto como resultado, o o que en las etapas intermedias sirve de fuente para la etapa siguiente. Para pasar de un programa fuente escrito por un humano a un archivo ejecutable es necesario realizar estas cuatro etapas en forma sucesiva.[Bar] El comandos gcc es capaz de realizar todo el proceso de una sola vez, como se vio en el comando anterior (Cdigo 2). o

4.1.

Preprocesamiento

El preprocesamiento es realizado por el preprocesador o macro-procesador. Es la primera etapa y traduce el archivo fuente que es una forma ampliada del lenguaje, al mismo lenguaje pero en una forma estandarizada para dejar listo el cdigo para la siguiente etapa. o En el siguiente cdigo fuente se calcula el area de un c o rculo de un radio de 10 cm. Se dene en la directiva de preprocesador #define la constante PI para poder calcular el area.
# include < stdio .h > # define PI 3.1416 int main ( void ) { float area , radio ; radio = 10; area = PI * ( radio * radio ); printf ( " Area Circulo = %f \ n " , area ); return 0; }

Cdigo 3: circulo.c o
3

Del ingls: preprosessing, compilation, assembly, y linking respectivamente. e

El preprocesado del archivo fuente puede realizarse con el siguiente comando:


$ gcc -E circulo . c -o circulo . i

Cdigo 4: Comando para preprocesar un archivo de cdigo fuente. o o

-E Opcin para detener el proceso de compilacin luego de realizado el preprocesamiento. o o La salida es en la forma de un archivo preprocesado. Los archivos que no requieren preprocesamiento son ignorados. -o Opcin para especicar el archivo de salida. o circulo.c Nombre del archivo de entrada para ser preprocesado. circulo.i Nombre del archivo de salida. Es el archivo objeto preprocesado, se utiliza el sujo .i para identicar a los archivos preprocesados.

4.2.

Compilacin o

La compilacin transforma el cdigo C preprocesado en el lenguaje ensamblador propio del o o procesador de nuestra mquina. a
$ gcc -S circulo . c

Cdigo 5: Comando para traducir un cdigo C a cdigo assembler. o o o Con este comando se realiza las dos primeras etapas, creando el archivo circulo.s que contiene el programa en lenguaje ensamblador. Es posible realizar slo la etapa de compilacin o o si el archivo fuente de la l nea de comando anterior es un archivo ya preprocesado con sujo .i. -S Opcin para detener luego de la etapa de compilacin, no realiza la etapa de ensamblao o 4 do. La salida ser en la forma de cdigo assembly , por defecto, el nombre del archivo a o de salida ser del mismo nombre que el archivo fuente, pero con sujo .s. Los archivos a que no requieren compilacin son ignorados. o
4

Los lenguaje ensambladores son un tipo de lenguaje de programacin de bajo nivel. o

circulo.c Nombre del archivo de entrada para ser compilado.

4.3.

Ensamblado

El la etapa de ensamblado se traduce el programa escrito en lenguaje ensamblador de la etapa anterior a cdigo binario en lenguaje de mquina entendible por el procesador. o a
$ gcc -c circulo . c

Cdigo 6: Comando para ensamblar. o Con este comando se realiza las tres primeras etapas, creando el archivo circulo.o. Este archivo contiene cdigo binario listo para ser enlazado. Es posible realizar slo la etapa de o o ensamblado si el archivo fuente de la l nea de comando es un archivo ya compilado con sujo .s. -c Opcin para detener luego de la etapa de ensamblado, no realiza la etapa de enlace. o La salida ser en la forma de cdigo objeto binario. Por defecto, el nombre del archivo a o objeto ser del mismo nombre del archivo fuente, pero son el sujo .o. a circulo.c Nombre del archivo de entrada para ser ensamblado.

4.4.

Enlazado

Las funciones de C que se usan en el cdigo fuente, como printf, se encuentran compiladas y o ensambladas en librer existentes. Para que el archivo resultado del proceso de compilacin as o completo sea ejecutable es necesario incorporar el cdigo binario de estas funciones en el o ejecutable nal. De esto se trata la etapa de enlace o linking.
$ gcc circulo . c -o circulo

Cdigo 7: Comando para enlazar. o Con este comando se realiza el proceso de compilacin completo, creando el archivo circulo o ejecutable. Este archivo contiene cdigo binario enlazado con las funciones de librer que o a utiliza, listo para ser ejecutado. Es posible realizar slo la ultima etapa si pasamos un archivo o con cdigo binario ensamblado con sujo .o. o 5

Esta es la l nea de comando que comnmente se usar para compilar un archivo es C para u a obtener un archivo ejecutable, agregndole la opcin -Wall como se vio en la Seccin 3. a o o

5.

Correccin y pruebas o

Las advertencias o wargings del compilador gcc son de ayuda esencial cuando programamos. Se mostrar esto a travs de un programa en C con errores: a e
1 2 3 4 5 6 7 8 # include < stdio .h > int main ( void ) { int suma 4; printf ( " Dos m s dos es %f \ n " , suma ); a return 0; }

Cdigo 8: Programa en C con errores (mensaje.c). o Al compilar el archivo mensaje.c se puede ver que el resultado no es el archivo ejecutable que esperbamos, sino una lista de errores y advertencias: a
$ gcc - Wall mensaje . c -o mensaje mensaje . c : In function main: mensaje . c :5: error : expected =, ,, ;, asm or attribute before numeric constant mensaje . c :5: warning : statement with no effect mensaje . c :6: error : suma undeclared ( first use in this function ) mensaje . c :6: error : ( Each undeclared identifier is reported only once mensaje . c :6: error : for each function it appears in .)

Cdigo 9: Compilando un programa con errores. o El formato del mensaje producido por el compilador gcc ante una advertencia o error tiene siempre la forma archivo:lnea:mensaje. Podemos ver que existe un error en el archivo mensaje.c, en la funcin main de ese archivo, o en la l nea 5, donde se esperaba un =... Procedemos a corregirlo:
1 2 3 4 5 6 7 8 # include < stdio .h > int main ( void ) { int suma = 4; printf ( " Dos m s dos es %f \ n " , suma ); a return 0; }

Cdigo 10: Programa en C con errores (Primera correccin). o o 6

Corregido el error, procedemos a compilar de nuevo:


$ gcc - Wall mensaje . c -o mensaje mensaje . c : In function main: mensaje . c :6: warning : format %f expects type double, but argument 2 has type int

Cdigo 11: Compilando un programa con errores. o Por desgracia existe un error ms en el cdigo. Este error no es tan fcil de ver como el anterior, a o a pero el compilador nos advierte generando un warning en el proceso de compilacin. Este o mensaje indica que el uso de la cadena de formato fue usada incorrectamente en la l nea 6. El compilador distingue entre errores que impide el proceso de compilacin se complete, y o mensajes de advertencia que indican un posible error pero no detienen la compilacin. Si o ejecutamos el archivo resultado de la compilacin obtendremos resultados inesperados: o
$ ./ mensaje Dos m s dos es 0.000000 a

Cdigo 12: Compilando un programa con errores. o En este caso, el error es que el especicador de formato en el cdigo es el incorrecto, ya o que con %f se est esperando un valor del tipo float y la variable suma es del tipo int. a Nmeros enteros y de punto otantes son almacenados en diferentes formatos en la memoria, u y generalmente ocupan diferentes cantidades de bytes.
1 2 3 4 5 6 7 8 # include < stdio .h > int main ( void ) { int suma = 4; printf ( " Dos m s dos es %d \ n " , suma ); a return 0; }

Cdigo 13: Programa en C (Segunda correccin). o o Habiendo corregido el error, podemos volver a compilar el archivo, esta vez exitosamente, sin ningn mensaje de error, ni mensaje de advertencia, para luego proceder a ejecutarlo: u
$ gcc - Wall mensaje . c -o mensaje $ ./ mensaje Dos m s dos es 4 a

Cdigo 14: Compilando un programa con errores. o 7

Se puede advertir que la ejecucin del archivo ya compilado muestra el resultado esperado. o Esta es la forma en que comnmente se probarn los programas para encontrar los errores y u a poder corregirlos.

6.

Estandares del lenguaje C

Por defecto, gcc compila programas usando el dialecto GNU del lenguaje C, conocido como GNU C. Este dialecto incorpora el estndar ocial ANSI/ISO para el lenguaje C con algunas a extensiones utiles propias de GNU. La gran mayor de programas escritos con el estndar a a ANSI/ISO compilarn sin problemas con gcc. Aun as el compilador de GNU dispone de a , la opcin -ansi para realizar una compilacin teniendo en cuenta unicamente el estndar o o a ANSI/ISO cuando pueda haber alguna incompatibilidad con las extensiones de GNU C.

7.

Conclusin o

En las ultimas etapas del proceso de programacin, despus del anlisis del problema y el o e a diseo algor n tmico de la solucin, el programador debe manipular los elementos constructivos o del lenguaje mediante un editor para escribir su programa. Tambin debe manejar la herrae mienta fundamental que le permitir traducir el archivo que almacena el programa escrito a en un lenguaje de alto nivel a un archivo de cdigo mquina para que la mquina sea capaz o a a de ejecutarlo. La etapa de traduccin, que en s es el proceso de compilacin, le permitir al programador o o a realizar las correcciones adecuadas en su programa, y luego, a partir del archivo ejecutable lograr realizar las pruebas y vericacin del programa. o

Referencias
[Bar] V ctor A. Gonzlez Barbone. a El compilador GCC. Instituto de Ingenier Elctrica. Facultad de Ingenier Montevideo, Uruguay. Recurso online: a e a. http://iie.ng.edu.uy/ vagonbar/gcc-make/gcc.htm. Ocial GNU website. Recurso online: http://www.gnu.org/.

[gnu]

[Gou04] Brian Gough. An Itroduction to GCC. Network Theory Limited, 1st edition, 2004. [StDCG] Richard M. Stallman and the Developer Community GCC. Using the GNU Compiler Collection. GNU Press. [wik] Wikipedia. Recurso online: http://www.wikipedia.org/.

S-ar putea să vă placă și