Laboratorio de compiladores y arquitectura: gcc, flex, bison y RISC-V en una VM
Este laboratorio da a cada estudiante su propia máquina Ubuntu, con un compilador de C real y las herramientas que lo rodean, y una cadena de herramientas RISC-V con un emulador. Los estudiantes ven cómo un programa pasa por cada etapa de la compilación, construyen una pequeña calculadora a partir de un analizador léxico y uno sintáctico, y ejecutan un programa RISC-V aunque la máquina no sea RISC-V. No se instala nada en el ordenador del estudiante.
Qué aprenden los estudiantes
Las cuatro etapas de una compilación: el preprocesado con gcc -E, la compilación a ensamblador con gcc -S, el ensamblado a archivo objeto con gcc -c y el enlazado. La diferencia entre un error y un aviso, con gcc -Wall sobre un programa que usa una variable fuera de su ámbito. Los tokens y la gramática, con una calculadora hecha con flex y bison que respeta el orden de las operaciones.
Los registros, las instrucciones y las llamadas al sistema, con cinco líneas de ensamblador RISC-V que suman dos números y dejan el resultado como código de salida. Las instrucciones como números, leídas con objdump. Por qué importa una caché, con un programa que suma una tabla fila a fila y columna a columna y mide cada recorrido. Y el contador de programa, avanzando instrucción a instrucción en gdb.
Qué hay en la máquina
gcc, make, binutils, gdb, flex, bison, python3 y file, todos del archivo de Ubuntu. Un compilador y un ensamblador cruzados para RISC-V, riscv64-linux-gnu-gcc y -as, y qemu-user, cuyo qemu-riscv64 ejecuta un programa RISC-V en el procesador de la VM.
En la carpeta compiler: hello.c, un programa pequeño con una macro y una función; scope.c, con una variable que nunca se usa y otra usada donde no existe; y calc.l, calc.y y un Makefile para la calculadora. En la carpeta arch: add.s, el programa RISC-V, y loop.c, la medición de la caché.
Ejecútalo en el navegador
Los laboratorios con VM se ponen como una tarea de laboratorio en un módulo, y el ejemplo está en la página del laboratorio. La máquina es pequeña: una CPU, 1 GB de memoria y 10 GB de disco, de sobra para programas de unas pocas líneas.
- Añadir el laboratorio. En un módulo que impartes, añade una tarea y elige la tarjeta de laboratorio con VM Ubuntu. La página muestra una breve descripción de la máquina en lugar de un archivo compose.
- Empezar con el ejemplo. La página ofrece laboratorios listos para empezar. Elige Compilers and computer architecture (compiladores y arquitectura de computadores). Usar un ejemplo sustituye el texto, y Deshacer recupera el tuyo.
- Publicar y arrancar tu propia copia. Publica y pulsa Iniciar. El script de instalación del laboratorio instala los compiladores y las herramientas desde el archivo de Ubuntu y deja los programas en la carpeta personal la primera vez que arranca la VM, en unos minutos.
- Abrir el terminal. Abre su terminal y lee README.md en la carpeta personal: enumera los programas de las carpetas compiler y arch. Después abre Compilers Basics.
Una lección básica sobre este laboratorio
Hay dos lecciones breves, cada una hecha en este laboratorio: Compilers Basics y Computer Architecture Basics. Cada una se sostiene sola, empieza en su propia carpeta y tiene un gancho, un objetivo «Puedo», palabras clave, una actividad de inicio, una comprobación tras cada idea y una comprobación final.
Un botón Ejecutar escribe su comando en el terminal de la VM y muestra lo que salió. gdb espera lo que se escriba a continuación, así que aparece como «Escribe esto» y el estudiante lo escribe en el terminal.
Cómo se usa en clase
El laboratorio no califica nada, así que sirve para una primera práctica de compiladores o de arquitectura, una demostración en la pantalla del docente o una sesión antes de una tarea escrita en Python.
- Repartirlo. Asigna el laboratorio y las lecciones como cualquier tarea, con fecha de entrega si quieres. Cada estudiante tiene su propia VM, que se conserva entre sesiones.
- Verles trabajar. El terminal junto a una lección es el del propio estudiante, y puedes mirarlo o tomar el control desde la lista de la clase mientras escribe.
- Califica tú si quieres una nota. El laboratorio no tiene script de comprobación. Si quieres una entrega, pide algo breve, como los dos tiempos que mostró loop y una frase sobre por qué son distintos.
La definición en GitHub
El archivo es la definición completa del laboratorio, el mismo texto que ejecuta la plataforma: tamaño, script de instalación y README. Cópialo y añade un programa tuyo para tener un laboratorio para tu clase.
Preguntas frecuentes
- ¿El laboratorio necesita un procesador RISC-V?
- No. La VM funciona sobre un procesador corriente, y qemu-riscv64 ejecuta en él un programa RISC-V instrucción a instrucción. El programa, el ensamblador y el enlazador son herramientas RISC-V reales, y file identifica el programa como RISC-V.
- ¿Por qué el ensamblador de gcc -S es distinto en otra máquina?
- gcc -S escribe ensamblador para el procesador en el que se ejecuta, que puede ser x86-64 o Arm. La lección lo dice y pide encontrar la llamada a la función, que es call en uno y bl en el otro.
- ¿Pueden los estudiantes estropear algo?
- Solo su propia copia. Si un estudiante rompe la máquina, puede detener el laboratorio y volver a iniciarlo.
- ¿El laboratorio de compiladores y arquitectura se califica solo?
- No. No tiene script de comprobación, porque las lecciones son la actividad. Pide una entrega propia, por ejemplo una tarea corta de Python con pruebas ocultas que simule lo que mostró el laboratorio.