Lab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Dieses Lab gibt jeder lernenden Person eine eigene Ubuntu-Maschine mit einem echten C-Compiler und den Werkzeugen drumherum sowie einer RISC-V-Toolchain mit Emulator. Die Lernenden sehen, wie ein Programm jede Stufe eines Builds durchläuft, bauen aus einem Lexer und einem Parser einen kleinen Taschenrechner und führen ein RISC-V-Programm aus, obwohl die Maschine kein RISC-V ist. Auf dem Rechner der Lernenden wird nichts installiert.

Was Lernende hier lernen

Die vier Stufen eines Builds: Präprozessor mit gcc -E, Übersetzen in Assembler mit gcc -S, Assemblieren zur Objektdatei mit gcc -c und Linken. Den Unterschied zwischen Fehler und Warnung, mit gcc -Wall an einem Programm, das eine Variable außerhalb ihres Gültigkeitsbereichs benutzt. Token und Grammatik, an einem mit flex und bison gebauten Taschenrechner, der die Rechenreihenfolge einhält.

Register, Befehle und Systemaufrufe, an fünf Zeilen RISC-V-Assembler, die zwei Zahlen addieren und das Ergebnis als Exit-Status hinterlassen. Befehle als Zahlen, gelesen mit objdump. Warum ein Cache zählt, an einem Programm, das eine Tabelle zeilenweise und spaltenweise addiert und beides misst. Und den Befehlszähler, Befehl für Befehl in gdb.

Was sich auf der Maschine befindet

gcc, make, binutils, gdb, flex, bison, python3 und file, alles aus dem Ubuntu-Archiv. Ein Cross-Compiler und Assembler für RISC-V, riscv64-linux-gnu-gcc und -as, und qemu-user, dessen qemu-riscv64 ein RISC-V-Programm auf dem Prozessor der VM ausführt.

Im Ordner compiler: hello.c, ein kleines Programm mit einem Makro und einer Funktion; scope.c mit einer nie benutzten Variable und einer, die dort benutzt wird, wo es sie nicht gibt; und calc.l, calc.y und ein Makefile für den Taschenrechner. Im Ordner arch: add.s, das RISC-V-Programm, und loop.c, die Cache-Messung.

Im Browser ausführen

VM-Labs werden als Lab-Aufgabe in einem Modul gestellt, und das Beispiel steht auf der Seite des Labs. Die Maschine ist klein: eine CPU, 1 GB Speicher und 10 GB Festplatte, mehr als genug für Programme mit wenigen Zeilen.

  1. Lab hinzufügen. Fügen Sie in einem Modul, das Sie unterrichten, eine Aufgabe hinzu und wählen Sie die Karte für das Ubuntu-VM-Lab. Die Seite zeigt statt einer Compose-Datei eine kurze Beschreibung der Maschine.
  2. Mit dem Beispiel beginnen. Die Seite bietet fertige Labs zum Einstieg an. Wählen Sie Compilers and computer architecture (Compilerbau und Rechnerarchitektur). Ein Beispiel ersetzt den Text, und Rückgängig holt Ihren zurück.
  3. Veröffentlichen und eigene Kopie starten. Veröffentlichen Sie und klicken Sie dann auf Starten. Beim ersten Start der VM installiert das Setup-Skript die Compiler und Werkzeuge aus dem Ubuntu-Archiv und legt die Programme in den Home-Ordner, in wenigen Minuten.
  4. Terminal öffnen. Öffnen Sie das Terminal und lesen Sie README.md im Home-Ordner: Dort stehen die Programme in den Ordnern compiler und arch. Öffnen Sie danach Compilers Basics.

Eine Grundlagenlektion zu diesem Lab

Es gibt zwei kurze Lektionen, beide in diesem Lab: Compilers Basics und Computer Architecture Basics. Jede steht für sich, beginnt in ihrem eigenen Ordner und hat einen Einstieg, ein Ich-kann-Ziel, Schlüsselwörter, einen Start, einen Check nach jedem Gedanken und einen Abschlusscheck.

Eine Schaltfläche „Ausführen“ tippt ihren Befehl ins Terminal der VM und zeigt, was ausgegeben wurde. gdb wartet auf die nächste Eingabe, deshalb steht dort „Tippe das ein“, und die lernende Person tippt es selbst ins Terminal.

So wird es im Unterricht eingesetzt

Das Lab bewertet nichts. Es passt zu einem ersten Praktikum in Compilerbau oder Rechnerarchitektur, zu einer Vorführung am Bildschirm der Lehrkraft oder zu einer Sitzung vor einer Aufgabe in Python.

  1. Zuweisen. Weisen Sie das Lab und die Lektionen wie jede Aufgabe zu, auf Wunsch mit Abgabetermin. Jede lernende Person bekommt eine eigene VM, die zwischen den Sitzungen erhalten bleibt.
  2. Beim Arbeiten zusehen. Das Terminal neben einer Lektion gehört der lernenden Person. Sie können es aus der Klassenliste beobachten oder übernehmen, während getippt wird.
  3. Selbst bewerten, wenn Sie eine Note möchten. Das Lab hat kein Prüfskript. Wenn Sie eine Abgabe möchten, verlangen Sie etwas Kleines, etwa die beiden Zeiten, die loop ausgibt, und einen Satz dazu, warum sie sich unterscheiden.

Die Definition auf GitHub

Die Datei ist die ganze Lab-Definition, derselbe Text, den die Plattform ausführt: Größe, Setup-Skript und README. Kopieren Sie sie und fügen Sie ein eigenes Programm hinzu, um ein Lab für Ihre Klasse zu machen.

Häufige Fragen

Braucht das Lab einen RISC-V-Prozessor?
Nein. Die VM läuft auf einem gewöhnlichen Prozessor, und qemu-riscv64 führt darauf ein RISC-V-Programm Befehl für Befehl aus. Programm, Assembler und Linker sind echte RISC-V-Werkzeuge, und file nennt das Programm RISC-V.
Warum sieht der Assembler von gcc -S auf einer anderen Maschine anders aus?
gcc -S schreibt Assembler für den Prozessor, auf dem es läuft, also x86-64 oder Arm. Die Lektion sagt das und lässt den Aufruf der Funktion suchen, der auf dem einen call und auf dem anderen bl heißt.
Können Lernende etwas beschädigen?
Nur ihre eigene Kopie. Wer die Maschine kaputt macht, kann das Lab stoppen und neu starten.
Wird das Lab für Compilerbau und Rechnerarchitektur automatisch bewertet?
Nein. Es hat kein Prüfskript, weil die Lektionen die Aktivität sind. Stellen Sie eine eigene kleine Abgabe, etwa eine kurze Python-Aufgabe mit versteckten Tests, die nachbildet, was das Lab gezeigt hat.