Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Compiler-Grundlagen

Die ganze Lektion steht hier zum Lesen. Erstellen Sie ein kostenloses Konto, um sie in einem Live-Lab auszuführen.

Ubuntu-VM-Lab10 Min. Lesezeit10 Befehle

Ein Befehl, vier Schritte

Du tippst einen einzigen Befehl, und aus einem C-Programm wird etwas, das die Maschine ausführen kann. Hinter diesem Befehl stecken vier Schritte. Wenn ein Build scheitert, kommt der Fehler aus einem davon. Weißt du, welcher Schritt sich meldet, weißt du, wo du suchen musst.

Am Ende dieser Lektion

Notiz

Ich kann die Stufen nennen, durch die ein Compiler ein Programm führt.

Schlüsselwörter

  • Compiler: ein Programm, das Quellcode in Befehle für einen Prozessor übersetzt.
  • Präprozessor: der erste Schritt, der Dateien einfügt und Namen ersetzt.
  • Assembler (die Sprache): die Befehle eines Prozessors, in Wörtern geschrieben.
  • Linker: der letzte Schritt, der Stücke Maschinencode zu einem Programm verbindet.
  • Token: ein Wort eines Programms, etwa eine Zahl oder ein Zeichen.
  • Parser: der Teil, der die Token mit der Grammatik vergleicht.

Zum Start: Was du schon weißt

Notiz

Antworte im Kopf. 1. Was macht cd? 2. Was gibt cat aus? 3. Was steht in einer Datei, deren Name auf .c endet? Die dritte Antwort brauchst du gleich.

Bevor du anfängst

Notiz

Klicke oben in der Leiste dieser Lektion auf Lab starten. Dieses Lab ist eine ganze Ubuntu-Maschine nur für dich, deshalb dauert der Start etwas länger als bei einem Container. Jede Schaltfläche Ausführen tippt ihren Befehl ins Terminal der Maschine, einen nach dem anderen in derselben Sitzung. Wenn eine sagt, dass die Maschine noch startet, warte ein paar Sekunden und drücke sie noch einmal. Wo in der Lektion Tippe das ein steht, wartet das Programm auf deine Eingabe. Klicke dann in der Leiste auf Terminal öffnen (neuer Tab) und tippe selbst.

Der Präprozessor fügt ein und ersetzt

gcc -E hält nach dem ersten Schritt an und gibt aus, was dabei entstanden ist. Aus der Zeile #include <stdio.h> sind Hunderte Zeilen geworden, deshalb zeigt tail -n 8 nur das Ende. Sieh dir main an: Der Name GREETING ist verschwunden, an seiner Stelle steht der Text des Makros. Auch der Kommentar ist weg.

Befehl
cd ~/compiler

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

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

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Prüfe dich

Tipp

Was ist aus GREETING geworden? Antwort: Der Präprozessor hat es durch seinen Text ersetzt, bevor der eigentliche Compiler das Programm überhaupt gesehen hat.

Übersetzen, assemblieren, linken

gcc -S hält nach dem Übersetzen an und schreibt hello.s, das Programm in Assembler für den Prozessor dieser Maschine. Suche darin square und main und das call oder bl, das square aufruft. gcc -c geht einen Schritt weiter und schreibt hello.o, Maschinencode. Das letzte gcc linkt es mit der C-Bibliothek, in der printf steckt, zu einem Programm.

Befehl
gcc -S hello.c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Befehl
cat hello.s

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Befehl
gcc -c hello.c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Befehl
gcc hello.o -o hello

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Befehl
./hello

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele glauben, ein Compiler mache aus C in einem Zug ein Programm, und jeder Fehler sei deshalb ein Fehler im Code. Es sind aber vier Schritte. Ein Fehler wie undefined reference to mit einem Namen dahinter kommt vom Linker: Der Code wurde übersetzt, nur fehlt dem letzten Schritt ein Stück, das er braucht.

Prüfe dich

Tipp

Welcher Befehl hält beim Assembler an, und welcher schreibt die Objektdatei? Antwort: gcc -S schreibt hello.s, und gcc -c schreibt hello.o.

Der Compiler prüft auch die Bedeutung

Ein Programm kann jede Regel der C-Grammatik einhalten und trotzdem keinen Sinn ergeben. In scope.c wird step in der Schleife angelegt und danach benutzt, wo es nicht mehr existiert. -Wall verlangt von gcc die üblichen Warnungen. Lies die Antwort: einen Fehler, step ist nicht deklariert, der den Build stoppt, und eine Warnung, unused wird nie benutzt.

Befehl
gcc -Wall -c scope.c

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Lexer und ein Parser zum Selberbauen

calc.l sagt flex, wie jedes Token aussieht: eine Zahl, ein Zeichen oder eine Klammer. calc.y gibt bison die Grammatik und sagt, dass * und / vor + und - kommen. make liest das Makefile und ruft bison, flex und gcc in der richtigen Reihenfolge auf. Der Taschenrechner gibt dann für die Rechnung 14 aus, nicht 20.

Befehl
make

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

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

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Abschlusscheck

Tipp

Antworte, ohne zurückzuschauen. 1. Nenne die vier Stufen der Reihe nach. 2. Welche Stufe ersetzt ein Makro? 3. Welcher Teil macht aus Zeichen Token? 4. Ist eine unbenutzte Variable ein Fehler oder eine Warnung? Antworten: Präprozessor, Übersetzen, Assemblieren, Linken; der Präprozessor; der Lexer, hier von flex erzeugt; eine Warnung.

Für Lehrkräfte

Tipp

Diese Lektion läuft in einem VM-Lab: Jede lernende Person hat eine eigene Ubuntu-Maschine, und eine Schaltfläche „Ausführen“ tippt in ihr Terminal und zeigt, was ausgegeben wurde. Wichtige Lernpunkte: 1. Ein Build hat vier Stufen: Präprozessor, Übersetzen, Assemblieren und Linken. 2. gcc -E, -S und -c halten nach jeder Stufe an, damit man sie lesen kann. 3. Ein Lexer erzeugt Token, und ein Parser prüft sie gegen eine Grammatik. Häufiger Fehler: einen Linker-Fehler für einen Fehler im Code halten. Material: das Lab und ein Browser. Tipp: Legen Sie hello.c neben hello.s und lassen Sie jede C-Zeile im Assembler wiederfinden. Das Lab hat keine Prüfung und bewertet nichts; stellen Sie eine eigene Abgabe, wenn Sie eine Note brauchen.

Über dieses Lab und seinen Quellcode: Lab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Sie unterrichten eine Klasse? Weisen Sie diese Lektionen Ihren Lernenden zu, mit Bewertung und einem Lab für jede lernende Person.