¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Fundamentos de compiladores

Aquí está la lección completa para leer. Crea una cuenta gratuita para practicarla en un laboratorio en vivo.

Laboratorio de máquina virtual10 min de lectura10 comandos

Un comando, cuatro pasos

Escribes un solo comando y un programa en C se convierte en algo que la máquina puede ejecutar. Ese comando esconde cuatro pasos. Cuando una compilación falla, el error viene de uno de ellos, y saber cuál ha hablado te dice dónde mirar.

Al terminar esta lección

Nota

Puedo nombrar las etapas por las que un compilador hace pasar un programa.

Palabras clave

  • Compilador: un programa que convierte el código fuente en instrucciones para un procesador.
  • Preprocesador: el primer paso, que pega archivos y sustituye nombres.
  • Ensamblador (el lenguaje): las instrucciones de un procesador, escritas con palabras.
  • Enlazador: el último paso, que une trozos de código máquina en un solo programa.
  • Token: una palabra de un programa, como un número o un signo.
  • Analizador sintáctico: la parte que comprueba los tokens con la gramática.

Para empezar: lo que ya sabes

Nota

Responde mentalmente. 1. ¿Qué hace cd? 2. ¿Qué muestra cat? 3. ¿Qué hay en un archivo cuyo nombre termina en .c? La tercera respuesta la necesitas enseguida.

Antes de empezar

Nota

Pulsa Iniciar el laboratorio en la barra superior de esta lección. Este laboratorio es una máquina Ubuntu entera para ti, así que tarda un poco más en arrancar que un contenedor. Cada botón Ejecutar escribe su comando en el terminal de la máquina, uno detrás de otro, en la misma sesión. Si alguno dice que la máquina aún está arrancando, espera unos segundos y púlsalo otra vez. Donde la lección dice Escribe esto, el programa espera a que le escribas: pulsa Abrir el terminal en la barra y escríbelo tú.

El preprocesador pega y sustituye

gcc -E se detiene tras el primer paso y muestra lo que ha hecho. La línea #include <stdio.h> se ha convertido en cientos de líneas, así que tail -n 8 enseña solo el final. Mira main: el nombre GREETING ha desaparecido y en su lugar está el texto de la macro. El comentario también ha desaparecido.

Comando
cd ~/compiler

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
gcc -E hello.c | tail -n 8

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comprueba

Consejo

¿Qué ha pasado con GREETING? Respuesta: el preprocesador lo ha sustituido por su texto, antes de que el compilador viera el programa.

Compilar, ensamblar, enlazar

gcc -S se detiene tras compilar y escribe hello.s, el programa en ensamblador para el procesador de esta máquina. Busca en él square y main, y el call o bl que llama a square. gcc -c da un paso más y escribe hello.o, código máquina. El último gcc lo enlaza con la biblioteca de C, donde vive printf, y lo convierte en un programa.

Comando
gcc -S hello.c

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
cat hello.s

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
gcc -c hello.c

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
gcc hello.o -o hello

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
./hello

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que un compilador convierte C en un programa de una vez, así que cualquier error sería un fallo del código. Hay cuatro pasos. Un error como undefined reference to seguido de un nombre viene del enlazador: el código ha compilado bien, y al último paso le falta una pieza que necesita.

Comprueba

Consejo

¿Qué comando se detiene en el ensamblador y cuál escribe el archivo objeto? Respuesta: gcc -S escribe hello.s y gcc -c escribe hello.o.

El compilador también comprueba el sentido

Un programa puede cumplir toda la gramática de C y aun así no tener sentido. En scope.c, step se crea dentro del bucle y se usa después, donde ya no existe. -Wall le pide a gcc sus avisos habituales. Lee la respuesta: un error, step no está declarada, que detiene la compilación, y un aviso, unused no se usa nunca.

Comando
gcc -Wall -c scope.c

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un analizador léxico y uno sintáctico que puedes construir

calc.l le dice a flex cómo es cada token: un número, un signo o un paréntesis. calc.y le da a bison la gramática y le dice que * y / van antes que + y -. make lee el Makefile y ejecuta bison, flex y gcc en el orden correcto. La calculadora muestra entonces 14 para la cuenta, no 20.

Comando
make

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
echo "2 + 3 * 4" | ./calc

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comprobación final

Consejo

Responde sin mirar atrás. 1. Nombra las cuatro etapas en orden. 2. ¿Qué etapa sustituye una macro? 3. ¿Qué parte convierte los caracteres en tokens? 4. Una variable sin usar, ¿es un error o un aviso? Respuestas: preprocesar, compilar, ensamblar, enlazar; el preprocesador; el analizador léxico, aquí hecho por flex; un aviso.

Para el profesorado

Consejo

Esta lección se trabaja en un laboratorio de máquina virtual: cada estudiante tiene su propia máquina Ubuntu, y un botón Ejecutar escribe en su terminal y muestra lo que salió. Ideas clave: 1. Una compilación tiene cuatro etapas: preprocesar, compilar, ensamblar y enlazar. 2. gcc -E, -S y -c se detienen tras cada una para poder leerla. 3. Un analizador léxico produce tokens y uno sintáctico los comprueba con una gramática. Error frecuente: tomar un error del enlazador por un fallo del código. Material: el laboratorio y un navegador. Consejo: pon hello.c al lado de hello.s y pide que encuentren cada línea de C en el ensamblador. El laboratorio no tiene comprobación y no califica nada; pide una entrega propia si quieres una nota.

Sobre este laboratorio y su código: Laboratorio de compiladores y arquitectura: gcc, flex, bison y RISC-V en una VM

¿Enseñas a una clase? Asigna estas lecciones a tus estudiantes con calificación y un laboratorio para cada uno.