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.
cd ~/compilerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
gcc -E hello.c | tail -n 8Se 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.
gcc -S hello.cSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
cat hello.sSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
gcc -c hello.cSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
gcc hello.o -o helloSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
./helloSe 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.
gcc -Wall -c scope.cSe 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.
makeSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
echo "2 + 3 * 4" | ./calcSe 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.