ENTRADAS

1 mar 2017

COMPILADORES, LAS FÁBRICAS DE PROGRAMAS

Compiladores. Hablando en código máquina.

Actualmente, los programas controlan gran parte de nuestra vida. Encontramos programas en un ordenador o en un móvil pero también hay programas en otros objetos de nuestra vida cotidiana: microondas, vitrocerámica, sistemas de calefacción, vehículos,…

La pregunta en la que se centra esta entrada es, ¿cómo se generan estos programas? Con la ayuda de compiladores.

COMPILADORES

Compiladores que comunican a los programadores con las máquinas

Dado que los ordenadores utilizan código binario únicamente podemos enviarles instrucciones a través de unos y ceros. No obstante, esto es algo tedioso y sumamente complicado cuando los programas tienen un mínimo de complejidad.

Así pues, desde los inicios de las ciencias de la computación se han desarrollado programas capaces de generar código binario, es decir programas que hacen programas. Estos programas reciben el nombre de compiladores.

Grace_Hopper

Grace Murray Hopper (Amazing Grace). Imagen Wikipedia

El primer compilador fue desarrollado por Grace Murray Hopper en 1952 y desde entonces los compiladores no han parado de evolucionar. Así pues, el único objetivo de un compilador es traducir un programa escrito en algún lenguaje de programación (como por ejemplo C, C++, Perl, Fortran,…) a código máquina (el único lenguaje que son capaces de entender los ordenadores).

Una vez visto qué es un compilador y cuál es su función pasemos a ver cómo funciona, es decir, cómo genera código máquina a partir de código fuente (escrito en un lenguaje legible para las personas).

COMPILADORES

Ejemplo de traducción de un programa en código fuente a código binario usando un compilador

El proceso de compilado

A lo largo de esta entrada tomaremos como ejemplo un programa escrito en C. El caso para cualquier otro lenguaje de programación es muy similar.

El proceso de compilado lo podemos dividir en tres procesos diferentes. En cada una de estas etapas actúa un programa con una misión específica. Estas etapas son:

  • Preprocesado: en esta etapa se prepara el código fuente para la siguiente etapa. Es una etapa muy sencilla y que no genera ningún archivo.
  • Compilado: en esta etapa se genera código intermedio el cual será procesado por el enlazador en la siguiente etapa. Se generará un archivo por cada fichero que estemos compilando (ficheros .c)
  • Enlazado: en esta etapa se unen los distintos archivos de código intermedio generados en la etapa anterior y se genera el código máquina que es capaz de leer el procesador. En sistemas operativos Windows, el archivo resultante es un fichero .exe

Una vez que tenemos una visión general de cada una de las etapas pasemos a verlas más en detalle.

COMPILADORES

Proceso de compilación de un programa

El preprocesador

El preprocesador es el programa encargado de preparar el código para la compilación. En primer lugar eliminará los comentarios del código fuente (ya que no son de utilidad para la generación de código).

También interpreta las directivas del preprocesador. Estas directivas se caracterizan en C por ser líneas que empiezan con el símbolo almohadilla (#). Existen varias directivas (algunas son específicas de cada compilador) aunque aquí veremos las dos más importantes (y que además no dependen del compilador que utilicemos).

Por un lado tenemos la directiva define (#define) la cual recibe dos argumentos. Cuando el preprocesador se encuentre con una directiva de este tipo modificará el código a partir de este punto de tal forma que cada vez que encuentre el argumento primero en el código, lo sustituirá por el argumento segundo.

Por otro lado tenemos la directiva include (#include) la cual recibe un argumento (que será el nombre de un archivo de texto). Cuando el preprocesador se encuentra esta directiva, la sustituirá por el contenido del archivo indicado en el argumento 1.

El compilador

Una vez que el preprocesador ha terminado su trabajo entra en acción el compilador. Éste se encarga de generar un código intermedio que es capaz de interpretar el enlazador. El compilador generará un fichero (denominado fichero objeto) por cada archivo que compilemos (archivo.c).

Durante el proceso de compilación es posible que encontremos funciones que no se encuentran definidas en el fichero .c, es decir, en el fichero no se indica qué es lo que hace la función si no que se encuentra en otro fichero. No obstante, esto no será un problema siempre que hayan sido declaradas previamente. Es decir, siempre que se haya incluido la cabecera de la función. El compilador lo que hará es poner una marca para que el enlazador haga este trabajo.

Esta generación de código intermedio nos permite que si modificamos un fichero .c no tengamos que volver a compilar todos los ficheros sino únicamente el fichero modificado.

COMPILADORES GCC

Símbolo de uno de los compiladores más conocidos: GCC (GNU C Compiler)

El enlazador

A partir de los ficheros objeto que ha generado el compilador, el enlazador terminará con el proceso de compilación. El enlazador unirá los distintos archivos en un único archivo binario (el cual el procesador es capaz de leer directamente).

La misión del enlazador por lo tanto es asociar esas marcas que le había dejado el compilador con la definición de la función correspondiente, es decir, une una llamada a una función realizada desde un fichero .c con la función propiamente dicha (situada en otro fichero). Al terminar este paso tendremos nuestro programa.

Autor: ALEJANDRO MARTÍNEZ LÓPEZ.

Más artículos del autor para el blog de FdeT

Si quieres participar en el blog como colaborador en alguna de las secciones, envíanos un mail a info@fdet.es 

Grupo FdeT

Fuentes de imágenes:

Imagen cabecera: https://commons.wikimedia.org/wiki/File:Typing_computer_screen_reflection.jpg  (from Almonroth)

Imagen 1: aprenderaprogramar.com  http://bit.ly/2lUchYU

Imagen compilador: https://gcc.gnu.org/

Compartir:
Facebooktwittergoogle_pluslinkedin

Leave a Reply

A %d blogueros les gusta esto: