Aufgabenblock — AFB II
Zehn Aufgaben, in denen du mehrere Schritte verbinden musst: Zeiteinheiten im Compiler-Modell zählen, Typumwandlungen in zwei Sprachen verfolgen, SQL-Abfragen auswerten, PHP-Ausgaben vorhersagen, Rust-Besitz prüfen und Laufzeiten vergleichen. Jede Aufgabe hat zwei Teile a) und b). Wenn du nicht weiterkommst, helfen dir zwei gestufte Tipps — erst der Ansatz, dann der Rechenweg.
Ein Programm hat 5 Anweisungen: 3 stehen außerhalb einer Schleife und laufen je einmal, 2 stehen in einer Schleife mit 4 Durchläufen. Im Modell dauert das Übersetzen einer Anweisung 2 Zeiteinheiten (ZE), das Ausführen 1 ZE. Der Compiler übersetzt jede Anweisung genau einmal vor dem ersten Start. Der Interpreter übersetzt jede Anweisung bei jeder Ausführung neu.
a) Wie viele ZE braucht der Interpreter für einen Programmlauf? b) Das kompilierte Programm wird fünfmal gestartet, ohne neu zu übersetzen. Wie viele ZE braucht der Compiler-Weg insgesamt (Übersetzen plus fünf Läufe)?
Vollständige Lösung
a) Bei einem Lauf werden 3 + 2 · 4 = 11 Anweisungen ausgeführt. Der Interpreter übersetzt jede davon neu: 11 · (2 + 1) = 33 ZE.
b) Der Compiler übersetzt die 5 Anweisungen einmal: 5 · 2 = 10 ZE. Jeder Lauf kostet nur noch das Ausführen: 11 ZE. Bei fünf Starts: 10 + 5 · 11 = 65 ZE. Der Interpreter bräuchte für fünf Läufe 5 · 33 = 165 ZE.
Hinweis: Das Modell zeigt die Grundidee. Echte Interpreter und JIT-Compiler merken sich schon übersetzte Teile und sind deshalb schneller, als das Modell vermuten lässt.
Derselbe Algorithmus steht einmal in JavaScript und einmal in PHP:
let a = "4"; let b = 2; let c = a * b + a; console.log(c - 4);
<?php $a = "4"; $b = 2; $c = $a * $b + $a; echo $c - 4; ?>
a) Welche Zahl gibt JavaScript aus? b) Welche Zahl gibt PHP aus?
* und - machen Zahlen, + mit einem Text verkettet. PHP: + rechnet immer.a * b = 8 (Zahl), 8 + "4" = "84" (Text), "84" - 4 = ? — PHP: $a * $b = 8, 8 + "4" = 12, 12 - 4 = ?Vollständige Lösung
a) JavaScript: a * b: Das * wandelt "4" in 4 um, also 8 (Zahl). 8 + a: Weil a ein Text ist, verkettet + → c ist der Text "84". c - 4: Das - wandelt "84" in die Zahl 84 um → Ausgabe 80.
b) PHP: $a * $b = 8. 8 + "4": In PHP rechnet + immer, also 12. 12 - 4 → Ausgabe 8.
Hinweis: Beide Sprachen sind dynamisch typisiert, wandeln aber verschieden um. In Python ergäbe "4" * 2 sogar "44" (Text wiederholt), und spätestens c - 4 bräche mit einem TypeError ab.
Die Schulband speichert ihre Songs in der Tabelle songs (Dauer in Sekunden):
| titel | genre | dauer |
|---|---|---|
| Morgenrot | Pop | 215 |
| Laternen | Pop | 184 |
| Nachtbus | Rock | 243 |
| Papierflieger | Pop | 176 |
| Funkstille | Hip-Hop | 198 |
| Sommerregen | Pop | 199 |
| Echo | Rock | 167 |
| Kompass | Pop | 231 |
SELECT titel, dauer FROM songs WHERE genre = 'Pop' AND dauer < 200 ORDER BY dauer DESC;
a) Wie viele Zeilen hat die Ergebnistabelle? b) Welche Dauer steht in der ersten Zeile der Ergebnistabelle?
FROM und WHERE (welche Zeilen bleiben?), dann ORDER BY (wie werden sie sortiert?), zuletzt SELECT (welche Spalten werden gezeigt?).DESC heißt: größter Wert zuerst.Vollständige Lösung
a) genre = 'Pop' trifft auf 5 Songs zu. dauer < 200 schließt Morgenrot (215) und Kompass (231) aus. Es bleiben Laternen (184), Papierflieger (176) und Sommerregen (199): 3 Zeilen.
b) ORDER BY dauer DESC sortiert absteigend: Sommerregen 199, Laternen 184, Papierflieger 176. In der ersten Zeile steht 199.
Hinweis: Funkstille (198 s) ist kürzer als 200 s, aber kein Pop — bei AND müssen beide Bedingungen gelten.
