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 und Interpreter: zwei Arten zu übersetzen

Nach dieser Lektion: Ich kann erklären, wie sich ein Compiler und ein Interpreter unterscheiden.

Lektion, 50 Min.9 BefehleLab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Einmal geschrieben, auf Millionen Konsolen

Ein Spiel für eine Konsole wird von Menschen geschrieben, in Wörtern, die sie lesen können. Der Prozessor der Konsole versteht diese Wörter nicht. Er führt nur seine eigenen Befehle aus, und die sind Zahlen.

Also muss jemand das Spiel vorher übersetzen. Dafür gibt es zwei große Wege, und beide kannst du in deinem Lab sehen.

Am Ende dieser Lektion

Notiz

Ich kann erklären, wie sich ein Compiler und ein Interpreter unterscheiden.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Quelltextein Programm, so wie Menschen es schreibenhello.c
MaschinencodeBefehle als Zahlen, die ein Prozessor ausführt
Übersetzerein Programm, das Quelltext in etwas Ausführbares verwandelt
Compilerein Übersetzer, der das ganze Programm vor dem Start in Maschinencode verwandelt
Interpreterein Übersetzer, der ein Programm Anweisung für Anweisung liest und ausführt
Tokenein Wort eines Programms, etwa ein Name, eine Zahl oder ein Zeichen

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Drei Arten von Übersetzern

Ein Assembler macht aus Assembler-Sprache Maschinencode, einen Befehl je Zeile.

Ein Compiler liest zuerst das ganze Programm. Ist etwas falsch, hört er auf und meldet es, und nichts läuft. Ist alles in Ordnung, schreibt er Maschinencode, den du immer wieder starten kannst.

Ein Interpreter liest eine Anweisung, führt sie aus und liest dann die nächste.

Compiler und Interpreter nebeneinander

FrageCompilerInterpreter
Wann wird übersetzt?Alles, bevor es läuftAnweisung für Anweisung, während es läuft
Entsteht eine Programmdatei?Ja, sie läuft auch ohne CompilerNein, der Interpreter wird jedes Mal gebraucht
Wann wird ein Fehler gefunden?Bevor irgendetwas läuftErst wenn die Zeile drankommt
Was läuft schneller?Meist das übersetzte ProgrammMeist langsamer
Im Labgccpython3

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Bevor du anfängst

Notiz

Drück oben in der Leiste auf Lab starten und warte, bis die Maschine läuft. Jede Schaltfläche Ausführen tippt ihren Befehl in das Terminal, einen nach dem anderen.

In den Ordner compiler wechseln

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.

hello.c in ein Programm übersetzen

Befehl
gcc hello.c -o hallo

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

Das Programm von gcc starten

Befehl
./hallo

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 Programm mit Fehler übersetzen

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 Interpreter findet Fehler spät

gcc hat scope.c ganz gelesen und abgelehnt. Es ist gar kein Programm entstanden.

Schreib jetzt eine Python-Datei aus zwei Zeilen. Die erste gibt ein Wort aus. Die zweite nutzt den Namen summe, der nie einen Wert bekommen hat. Sieh zu, was Python macht.

Eine Python-Datei aus zwei Zeilen

Befehl
printf 'print("los")\nprint(summe)\n' > spaet.py

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

Sie mit dem Interpreter starten

Befehl
python3 spaet.py

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 Compiler arbeitet in Phasen

Die lexikalische Analyse zerlegt die Zeichen in Tokens und wirft Leerzeichen und Kommentare weg.

Die Syntaxanalyse prüft die Tokens gegen die Grammatik der Sprache und baut einen Baum des Programms. Die Codeerzeugung macht aus dem Baum Maschinencode, und die Optimierung macht ihn kleiner oder schneller.

Eine Zeile Python schreiben

Befehl
echo 'print(6 * 8)' > rechnung.py

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

Die Zeile in Tokens zerlegen

Befehl
python3 -m tokenize rechnung.py

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 Interpreter übersetze gar nichts. Python macht aus deiner Datei aber zuerst Bytecode, einfache Befehle für seine eigene Maschine. Der nächste Run zeigt ihn. Such nach 48: Python hat 6 × 8 schon ausgerechnet, bevor irgendetwas lief.

Den Bytecode zeigen

Befehl
python3 -m dis rechnung.py

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

Weiterführend: der Lexer eines Taschenrechners

Im Lab liegt calc, ein Taschenrechner mit einem Lexer von flex und einem Parser von bison. Drück auf Terminal öffnen, tipp make und dann echo "6 @ 8" | ./calc.

Es erscheinen zwei Zeilen. Welche kommt vom Lexer, welche vom Parser? Woran erkennst du das?

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

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.