¿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

Compiladores e intérpretes: dos formas de traducir

Después de esta lección: Puedo explicar en qué se diferencian un compilador y un intérprete.

Lección de 50 min9 comandosLaboratorio de compiladores y arquitectura: gcc, flex, bison y RISC-V en una VM

Escrita una vez, jugada en millones de móviles

Una app de un juego la escriben personas, con palabras que pueden leer. El procesador del móvil no entiende esas palabras. Solo ejecuta sus propias instrucciones, que son números.

Antes, algo tiene que traducir el juego. Hay dos formas principales de hacerlo, y en tu máquina del laboratorio puedes ver las dos.

Al terminar esta lección

Nota

Puedo explicar en qué se diferencian un compilador y un intérprete.

Palabras clave

PalabraQué significaEjemplo
Código fuenteun programa tal como lo escriben las personashello.c
Código máquinainstrucciones en forma de números que ejecuta un procesador
Traductorun programa que convierte código fuente en algo que el ordenador ejecuta
Compiladorun traductor que pasa todo el programa a código máquina antes de ejecutarlo
Intérpreteun traductor que lee y ejecuta un programa sentencia a sentencia
Tokenuna palabra de un programa, como un nombre, un número o un signo

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Tres tipos de traductor

Un ensamblador convierte el ensamblador en código máquina, una instrucción por cada línea.

Un compilador lee primero el programa entero. Si algo está mal, para y lo dice, y no se ejecuta nada. Si todo va bien, escribe código máquina que puedes ejecutar una y otra vez.

Un intérprete lee una sentencia, la ejecuta y después lee la siguiente.

Un compilador y un intérprete, cara a cara

PreguntaCompiladorIntérprete
¿Cuándo se traduce el programa?Entero, antes de ejecutarseSentencia a sentencia, mientras se ejecuta
¿Sale un archivo de programa?Sí, y se ejecuta sin el compiladorNo, hace falta el intérprete cada vez
¿Cuándo se encuentra un fallo?Antes de ejecutar nadaAl llegar a esa línea
¿Qué va más rápido?Casi siempre el programa compiladoCasi siempre más lento
En el laboratoriogccpython3

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Antes de empezar

Nota

Pulsa Iniciar el laboratorio en la barra superior y espera a que la máquina diga que está en marcha. Cada botón Ejecutar escribe su comando en el terminal de la máquina, uno detrás de otro.

Entra en la carpeta compiler

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.

Compila hello.c en un programa

Comando
gcc hello.c -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.

Ejecuta el programa que hizo gcc

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.

Compila un programa con un fallo

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 intérprete encuentra el fallo tarde

gcc leyó todo scope.c y lo rechazó. No hizo ningún programa.

Ahora escribe un archivo de Python de dos líneas. La primera escribe una palabra. La segunda usa un nombre, total, al que nunca se dio un valor. Mira qué hace Python.

Escribe un archivo de Python de dos líneas

Comando
printf 'print("hola")\nprint(total)\n' > tarde.py

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

Ejecútalo con el intérprete

Comando
python3 tarde.py

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

Un compilador trabaja por fases

El análisis léxico parte los caracteres en tokens y tira los espacios y los comentarios.

El análisis sintáctico comprueba los tokens con la gramática del lenguaje y construye un árbol del programa. La generación de código convierte el árbol en código máquina, y la optimización lo hace más pequeño o más rápido.

Escribe una línea de Python

Comando
echo 'print(6 * 8)' > cuenta.py

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

Pártela en tokens

Comando
python3 -m tokenize cuenta.py

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 intérprete no traduce nada. Python convierte primero tu archivo en bytecode, instrucciones sencillas para su propia máquina. El siguiente Run lo enseña. Busca el 48: Python calculó 6 × 8 antes de ejecutar nada.

Enseña el bytecode

Comando
python3 -m dis cuenta.py

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

Para ir más lejos: el analizador de calc

El calc del laboratorio es una calculadora con un analizador léxico hecho con flex y uno sintáctico hecho con bison. Pulsa Abrir el terminal, escribe make y después echo "7 @ 2" | ./calc.

Escribe dos líneas. ¿Cuál viene del analizador léxico y cuál del sintáctico? ¿Cómo lo sabes?

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 este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.