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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Quelltext | ein Programm, so wie Menschen es schreiben | hello.c |
| Maschinencode | Befehle als Zahlen, die ein Prozessor ausführt | |
| Übersetzer | ein Programm, das Quelltext in etwas Ausführbares verwandelt | |
| Compiler | ein Übersetzer, der das ganze Programm vor dem Start in Maschinencode verwandelt | |
| Interpreter | ein Übersetzer, der ein Programm Anweisung für Anweisung liest und ausführt | |
| Token | ein 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
| Frage | Compiler | Interpreter |
|---|---|---|
| Wann wird übersetzt? | Alles, bevor es läuft | Anweisung für Anweisung, während es läuft |
| Entsteht eine Programmdatei? | Ja, sie läuft auch ohne Compiler | Nein, der Interpreter wird jedes Mal gebraucht |
| Wann wird ein Fehler gefunden? | Bevor irgendetwas läuft | Erst wenn die Zeile drankommt |
| Was läuft schneller? | Meist das übersetzte Programm | Meist langsamer |
| Im Lab | gcc | python3 |
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
cd ~/compilerHier 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
gcc hello.c -o halloHier 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
./halloHier 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
gcc -Wall -c scope.cHier 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
printf 'print("los")\nprint(summe)\n' > spaet.pyHier 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
python3 spaet.pyHier 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
echo 'print(6 * 8)' > rechnung.pyHier 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
python3 -m tokenize rechnung.pyHier 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
python3 -m dis rechnung.pyHier 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?