Zehn interaktive Übungen zu Compiler, Interpreter, Bytecode und JIT — von AFB I bis AFB III.
Dein Fortschritt:
0 / 0 Aufgaben
1
Übungsaufgaben
Zehn interaktive Übungen zum Klicken, Ziehen und Knobeln — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung, und nach dem Prüfen erklärt eine kurze Notiz die Lösung.
A1
Was ein Compiler tut
AFB I
Welche Aussagen beschreiben einen Compiler richtig?
Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Der Compiler arbeitet einmal, vorab — zur Übersetzungszeit. Danach läuft nur noch der Maschinencode. Der ist aber an Prozessor und Betriebssystem gebunden, für die übersetzt wurde. Zeilenweises Übersetzen während des Laufs ist die Arbeitsweise eines Interpreters.
A2
Stimmt's? — Fünferserie
AFB I
Fünf Behauptungen über Compiler, Interpreter und Mischformen.
5 Aussagen nacheinander. Eine falsche Einschätzung reicht — dann startest du die Serie mit „Neue Runde“ neu.
Aussage 1 von 5
Compiler: vorab, schnell, plattformabhängig. Interpreter: während des Laufs, langsamer, plattformunabhängig. Java und C# verbinden beides.
A3
Wie wird übersetzt?
AFB I
Ordne jede Sprache der Art zu, wie sie üblicherweise ausgeführt wird.
Ziehe jede Karte in den passenden Korb — oder wähle sie mit Enter aus und drücke dann die Ziffer des Korbs (0 legt sie zurück).
1Compiler → Maschinencode
2Interpreter
3Bytecode + virtuelle Maschine
C, C++, Rust und Go werden direkt in Maschinencode übersetzt. Python, PHP und JavaScript werden interpretiert — moderne Browser beschleunigen JavaScript zusätzlich mit einem JIT-Compiler, eine fertige Programmdatei gibt es trotzdem nicht. Java (Bytecode, JVM) und C# (CIL, .NET) sind Mischformen.
A4
Wie viel bringt der JIT-Compiler?
AFB II
Ein Programm braucht mit reinem Interpreter 60 s. 90 % dieser Zeit verbringt es in einer einzigen Schleife. Ein JIT-Compiler übersetzt diese Schleife während des Laufs in Maschinencode, wodurch sie 10-mal so schnell läuft. Der Rest bleibt gleich schnell; die Übersetzungszeit des JIT-Compilers vernachlässigen wir. Wie viele Sekunden dauert der Lauf jetzt?
Rechne selbst und trage das Ergebnis ein — Enter prüft direkt.
Schleife: 90 % von 60 s = 54 s, zehnmal schneller: 5,4 s. Rest: 6 s bleiben. Zusammen 11,4 s. Typischer Fehler: die gesamten 60 s durch 10 teilen — der JIT-Compiler lohnt sich nur für die Teile, die oft laufen.
A5
Ein Java-Programm auf der Reise
AFB II
Lara schreibt ein Spiel in Java und schickt es an ihren Freund, der einen anderen Rechner hat. Bringe die Stationen in die richtige Reihenfolge.
Ziehe die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
1Die JVM auf dem Rechner ihres Freundes lädt den Bytecode und startet das Spiel.
2Lara schickt die Datei Spiel.class weiter.
3Lara schreibt den Quelltext Spiel.java.
4Ein JIT-Compiler übersetzt häufig laufende Teile in Maschinencode für genau diesen Prozessor.
5Der Befehl javac prüft den Quelltext und übersetzt ihn in Bytecode.
Übersetzt wird zweimal: vorab in Bytecode (bei Lara), während des Laufs in Maschinencode (beim Freund). Deshalb reicht eine einzige .class-Datei für alle Rechner mit JVM. Häufiger Fehler: den JIT-Compiler vor die JVM setzen — er ist ein Teil von ihr.
A6
Fachbegriffe verbinden
AFB II
Verbinde jeden Fachbegriff mit seiner Beschreibung.
Klicke links einen Eintrag an und dann rechts den passenden — es entsteht eine Verbindungslinie. Mit der Tastatur: Enter zum Auswählen, ↑/↓ zum Wandern.
Denke an den Weg eines Programms: Quelltext → (Übersetzungszeit) → Bytecode oder Maschinencode → Laufzeit. „JIT“ heißt „just in time“: gerade rechtzeitig, also während des Laufs.
A7
Mix: Übersetzer überall
AFB II
Verbinde, was du in 3.1.1 über Sprachebenen gelernt hast, mit den Übersetzungsarten. Ein Wort bleibt übrig.
Wort anklicken, dann Lücke anklicken (oder umgekehrt) — mit Tab und Enter geht es genauso. Ein Klick auf eine gefüllte Lücke legt das Wort zurück.
Den ersten Übersetzer kennst du schon aus 3.1.1: Der macht aus Kürzeln wie ADD Maschinenbefehle — genau einen pro Kürzel. Ein übersetzt dagegen einen ganzen Hochsprachen-Quelltext vorab; aus einer Zeile werden oft viele Maschinenbefehle. Ein übersetzt erst während des Laufs. Java liegt dazwischen: javac erzeugt , den die ausführt.
„CIL“ bleibt übrig: Das ist der Zwischencode von C#, den die Plattform .NET ausführt — das Gegenstück zum Java-Bytecode.
A8
Wann fällt der Fehler auf?
AFB III
Das Python-Programm enthält einen Tippfehler in Zeile 5. Verfolge den Lauf.
Python
1 summe = 02for i inrange(1, 6):
3 summe = summe + i
4if summe > 8:
5print(summ)
6print("fertig")
Rechne die Kette Schritt für Schritt: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
summe nach dem Durchlauf mit i = 3
Wert von i, wenn der Fehler gemeldet wird
Wert von summe in diesem Moment
Wie oft wird „fertig“ ausgegeben?
summe wächst 1, 3, 6, 10. Erst bei i = 4 ist summe > 8, Zeile 5 wird zum ersten Mal erreicht — und erst dann meldet der Interpreter NameError: name 'summ' is not defined. Das Programm bricht ab, Zeile 6 läuft nie. Ein Compiler (etwa bei Java oder C) hätte den unbekannten Namen schon vor dem Start gemeldet.
A9
Fehler auf dem Spickzettel
AFB III
Nils hat sich für den Test einen Spickzettel geschrieben. Drei Sätze sind falsch.
In diesem Text stecken Fehler. Klicke genau die falschen Zeilen an — die richtigen musst du stehen lassen.
Die drei Irrtümer verwechseln die Rollen: Dateien erzeugt der Compiler, nicht der Interpreter. Maschinencode ist plattformabhängig. Und frühe Fehlermeldungen sind eine Stärke von Compilern.
A10
Zwanzig Starts
AFB III
Ein C-Programm wird einmal kompiliert; das Übersetzen dauert 30 s. Danach wird das fertige Programm an 20 Schultagen je einmal gestartet. Wie viele Sekunden Übersetzungszeit fallen insgesamt an?
Schiebe den Regler auf deine Antwort — Pfeiltasten bewegen ihn feiner. Nach dem Prüfen siehst du den Trefferbereich.
0 s600 s
Trick: 30 s — nicht 20 · 30 s = 600 s. Kompiliert wird nur einmal. Bei jedem Start läuft das fertige Maschinenprogramm, ohne dass der Compiler noch beteiligt ist. Genau deshalb lohnt sich ein Compiler bei Programmen, die oft gestartet werden.