MINT lernen

Compiler und Interpreter

Zwei Textaufgaben mit Hinweisen und Erwartungshorizont zu Compiler, Interpreter und Bytecode im Schulalltag.

Dein Fortschritt:
0 / 0 Aufgaben
1

Notenrechner in der Informatik-AG

AFB I–II

In der Informatik-AG programmieren Emma und Ben einen Notenrechner mit 20 Zeilen. Emma schreibt ihn in C und kompiliert ihn auf dem Windows-PC der AG zu noten.exe. Ben schreibt denselben Rechner in Python als noten.py. Die AG besitzt außerdem einen Raspberry Pi mit ARM-Prozessor und Linux, auf dem Python installiert ist.

Zwei Wege vom Quelltext zum Prozessor
Weg 1 · Emma (C)noten.cCompilernoten.exe(Maschinencode)Prozessoreinmal, vor dem StartWeg 2 · Ben (Python)noten.pyInterpreterübersetzt und führt Zeile für Zeile ausProzessorbei jedem Start, während des Laufs
Beim Compiler sind Übersetzen und Ausführen getrennt, beim Interpreter wechseln sie sich während des Laufs ab.
  1. Gib für beide Wege an, was auf dem Rechner einer Mitschülerin vorhanden sein muss, damit sie den Notenrechner starten kann.
  2. Beide haben sich in Zeile 12 vertippt und einen Funktionsnamen falsch geschrieben. Zeile 12 wird bei jedem Lauf erreicht. Stelle dar, was jeweils passiert, wenn Emma bzw. Ben das Programm zum Laufen bringen wollen.
  3. Begründe, warum Bens noten.py auch auf dem Raspberry Pi läuft, Emmas noten.exe dort aber nicht.

Hinweise

Hinweis zu Aufgabe a)
Folge in der Abbildung jeweils dem Weg bis zum Prozessor. Was wird davon beim Start noch gebraucht?
Hinweis zu Aufgabe b)
Wann wird bei Emma übersetzt — und wann bei Ben?
Hinweis zu Aufgabe c)
Für welchen Prozessor und welches Betriebssystem ist der Maschinencode in noten.exe gemacht?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

Weg 1: nur das fertige Programm noten.exe (für ein passendes System, hier Windows auf dem PC); ein Compiler ist nicht nötig. Weg 2: der Quelltext noten.py und ein installierter Python-Interpreter.

Erwartungshorizont zu Aufgabe b)

Emma: Schon beim Übersetzen wird der unbekannte Name gemeldet. Es entsteht kein lauffähiges Programm; keine einzige Zeile wird ausgeführt, bis der Fehler behoben und neu kompiliert ist. Ben: Das Programm startet, die Zeilen 1 bis 11 laufen (Ausgaben erscheinen). Erst beim Erreichen von Zeile 12 meldet der Interpreter einen NameError und bricht ab.

Erwartungshorizont zu Aufgabe c)

Maschinencode ist plattformabhängig: noten.exe enthält Befehle für den Prozessor des PCs und ist eine Windows-Programmdatei. Der ARM-Prozessor des Raspberry Pi versteht diese Befehle nicht, Linux startet keine Windows-Programme. Emma müsste ihren Quelltext für den Raspberry Pi neu kompilieren. Bens Skript enthält keinen Maschinencode; der dort installierte Interpreter übersetzt es passend für den ARM-Prozessor während des Laufs.

2

Welche Variante für die Mensa-App?

AFB II–III

Die Schülervertretung will eine Mensa-App für Windows-PCs, macOS-Laptops und einen Linux-Server der Schule. Das Entwicklerteam testet drei Varianten desselben Programms und misst (Modellwerte):

  • Variante C (Compiler): Übersetzen einmalig 6 s je Plattform, danach je Start 0,5 s.
  • Variante Python (Interpreter): kein Übersetzen vorab, je Start 4 s.
  • Variante Java (Bytecode + JVM mit JIT): Übersetzen in Bytecode einmalig 3 s, danach je Start 1 s.

Die App wird auf dem Server täglich neu gestartet. Später soll ein Tablet-Modell mit einem weiteren Prozessortyp dazukommen.

  1. Berechne für eine Plattform die Gesamtzeit (Übersetzen plus Ausführen) aller drei Varianten bei 10 Starts.
  2. Ermittle, ab dem wievielten Start die C-Variante insgesamt schneller ist als die Python-Variante und ab dem wievielten Start schneller als die Java-Variante.
  3. Untersuche, welche Varianten auf allen drei Gerätetypen laufen, ohne dass für jedes Gerät neu übersetzt werden muss, und was dafür jeweils installiert sein muss.
  4. Beurteile, welche Variante für die Mensa-App am besten geeignet ist.

Hinweise

Hinweis zu Aufgabe a)
Gesamtzeit = einmalige Übersetzungszeit + Anzahl der Starts · Zeit je Start.
Hinweis zu Aufgabe b)
Stelle für n Starts die Gesamtzeiten als Terme auf und vergleiche sie — oder probiere n = 1, 2, 3, … aus.
Hinweis zu Aufgabe c)
Welche Variante erzeugt Maschinencode für genau einen Prozessor — und welche arbeitet mit einer Zwischenschicht?
Hinweis zu Aufgabe d)
Wäge Geschwindigkeit, Aufwand bei mehreren Plattformen und die geplante Erweiterung um ein Tablet gegeneinander ab.

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

C: 6 s + 10 · 0,5 s = 11 s. Python: 10 · 4 s = 40 s. Java: 3 s + 10 · 1 s = 13 s. Nach 10 Starts ist die C-Variante am schnellsten, dicht gefolgt von Java.

Erwartungshorizont zu Aufgabe b)

C gegen Python: 6 + 0,5n < 4n ⇔ 6 < 3,5n ⇔ n > 1,71… Also ab dem 2. Start (n = 2: 7 s gegen 8 s). C gegen Java: 6 + 0,5n < 3 + n ⇔ 3 < 0,5n ⇔ n > 6. Bei n = 6 sind beide gleich (9 s), ab dem 7. Start ist C schneller (9,5 s gegen 10 s).

Erwartungshorizont zu Aufgabe c)

C erzeugt Maschinencode für eine Plattform: Für Windows, macOS und Linux muss je einmal kompiliert werden (3 · 6 s), für das Tablet noch einmal. Python: dasselbe Skript läuft überall, auf jedem Gerät muss ein Python-Interpreter installiert sein. Java: derselbe Bytecode läuft überall, auf jedem Gerät muss eine JVM installiert sein; der JIT-Compiler übersetzt dort passend für den Prozessor.

Erwartungshorizont zu Aufgabe d)

Ein begründetes Urteil mit mindestens zwei Kriterien ist gefordert, z. B.: Java ist fast so schnell wie C (nach 10 Starts 13 s gegen 11 s), braucht aber nur eine Übersetzung für alle Plattformen und ist für das neue Tablet sofort nutzbar, sofern dort eine JVM läuft — daher gut geeignet. C lohnt sich, wenn höchste Geschwindigkeit zählt und die Plattformen feststehen. Python ist am langsamsten, aber am einfachsten zu testen; für eine App, die täglich nur einmal startet, fällt der Zeitnachteil kaum ins Gewicht. Auch ein anderes Urteil ist richtig, wenn es mit den Messwerten und den Plattformen begründet wird.