Page 48 - LENGUAJES FORMALES AUTOMATAS Y COMPILADOS
P. 48
48
INVESTIGACIÓN: COMPILADOR DE C
C es un lenguaje de programación creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell
de AT&T como evolución del anterior lenguaje B, a su vez basado en BCPL.
A la hora de programar no creamos un único archivo C.c, sino varios archivos conteniendo
diferentes funciones del programa. Esto nos proporciona varias ventajas: una mejor organización
del código, una mejor modularidad y sobre todo, más facilidad (y velocidad) a la hora de compilar.
El proceso de compilación que hemos tratado hasta ahora se divide en realidad en dos etapas, que
el compilador nos esconde en una: compilación propiamente dicha y enlazado. En la primera
etapa, la de compilación, nuestro código en C se transforma en código objeto, es decir, código
máquina (instrucciones que el ordenador puede ejecutar) en ficheros .o, mientras que en la
segunda etapa (enlazado) estos ficheros objeto son unidos entre sí para formar el fichero
ejecutable (normalmente sin extensión en el mundo Unix, o con extensión .com o .exe en el
mundo MS-DOS/Windows).
Pasos de compilación:
Para compilar programas escritos en C, disponen de un compilador de nombre cc. Este
compilador toma como parámetros los ficheros fuentes de que consta el programa final y, tras una
serie de pasos, produce un fichero ejecutable. Si durante la compilación se produce un error, no
se genera el ejecutable.
Los pasos de compilación en UNIX son al menos estos tres:
1- Pre proceso (macros, inclusión de ficheros...)
2- Compilación a objeto
3- Enlace (linking) de objetos y bibliotecas
El preproceso interpreta las macros creadas con #define y expande los ficheros para incluir
con #include.
Un fichero una vez preprocesado se compila a código máquina, pero no se genera un ejecutable,
sino un fichero objeto. Este estadio intermedio es necesario por muchos motivos, entre ellos que
las rutinas de biblioteca, como printf, tienen que ser "empotradas" posteriormente para generar
un ejecutable, y en general debido a que un programa en C puede constar de varios ficheros
compilados por separado.
Por eso existe un último paso, denominado enlace (linking en inglés), en el cual se recogen todos
los ficheros objetos más las bibliotecas (que también residen en ficheros) necesarios para producir
el fichero ejecutable.
Convenciones en los nombres de ficheros:
Como se ha visto, en el transcurso de la ejecución del cc aparecen en escena varias clases de
ficheros: fuentes, objetos, bibliotecas, ejecutables. El compilador de C es capaz de distinguir la
clase de un fichero en base a sus últimos caracteres. La siguiente tabla muestra las convenciones
más habituales.