Aufgabenblock — AFB III
Hier geht es nicht ums Ausrechnen, sondern ums Begründen, Beurteilen und Entwickeln: Aussagen über Sprachen prüfen, eigene SQL-Abfragen und Programmkorrekturen entwerfen, Rust gegen Go abwägen und eine Webseite sinnvoll auf Browser und Server aufteilen. Fahre mit der Maus über einen unterstrichenen Operator, um zu sehen, was er verlangt. Schreib deine Antwort erst selbst in ganzen Sätzen auf, bevor du die Musterlösung aufklappst.
Jonas sagt: „Python ist eine schlechte Sprache. C ist 25-mal schneller, also sollte man immer C nehmen.“ Beurteile diese Aussage. Gehe dabei auf mindestens drei Kriterien der Sprachwahl ein und nenne je ein Beispiel, in dem Python bzw. C die bessere Wahl ist.
Hinweis: Überlege, ob die Laufzeit in jedem Projekt das wichtigste Kriterium ist.
Musterlösung anzeigen (zählt als erledigt)
Musterlösung: Die Aussage ist in dieser Allgemeinheit falsch. Richtig ist, dass ein Python-Programm im Modell etwa 25-mal so lange braucht wie dasselbe Programm in C. Jonas beurteilt die Sprache aber nur nach einem einzigen Kriterium, der Laufzeit.
Weitere Kriterien sind die Entwicklungszeit (ein Python-Programm ist oft viel schneller geschrieben und getestet), die Bibliotheken und die Community (für Datenanalyse und KI gibt es in Python fertige Bausteine) und das Vorwissen des Teams. Für eine Auswertung, die einmal pro Woche läuft, spielen 10 statt 0,4 Sekunden keine Rolle — hier ist Python die bessere Wahl.
C ist dagegen sinnvoll, wenn Speicher und Rechenzeit knapp sind, etwa bei einem Mikrocontroller, oder wenn ein Programm sehr oft und sehr schnell laufen muss. Fazit: Es gibt keine „beste“ Sprache, sondern nur eine, die zu Plattform, Anforderungen und Team passt.
Eine Firma liefert ein Programm für Windows- und Linux-Computer aus. Vergleiche, was die Firma ausliefern muss, wenn das Programm in C geschrieben ist und wenn es in Java geschrieben ist. Begründe den Unterschied mit dem Weg vom Quelltext zur Ausführung.
Hinweis: Frage dich, wofür der Übersetzer jeweils übersetzt: für einen bestimmten Prozessor oder für eine gedachte Maschine?
Musterlösung anzeigen (zählt als erledigt)
Musterlösung: Ein C-Compiler übersetzt den Quelltext vor dem Start vollständig in Maschinencode. Dieser Maschinencode passt nur zu einem Prozessortyp und einem Betriebssystem. Die Firma muss den Quelltext deshalb für Windows und für Linux getrennt kompilieren und zwei verschiedene Programmdateien ausliefern.
Der Java-Compiler javac übersetzt den Quelltext dagegen in Bytecode — Maschinencode für eine gedachte Maschine. Diesen Bytecode führt die Java Virtual Machine (JVM) aus, die es für Windows und Linux gibt; ein JIT-Compiler übersetzt dabei häufig benutzte Teile während des Laufs in echten Maschinencode. Die Firma liefert deshalb nur eine Bytecode-Datei aus, auf den Computern muss aber eine JVM installiert sein.
Vergleich: C ist dafür meist etwas schneller und braucht keine Laufzeitumgebung; Java spart den Aufwand, für jede Plattform neu zu übersetzen. C# arbeitet mit CIL und .NET nach demselben Prinzip wie Java.
Mia behauptet: „In Python gibt es keine Typfehler, weil man keine Typen hinschreiben muss.“ Widerlege die Behauptung mit einem Beispiel. Erläutere anschließend, warum das folgende Programm wochenlang fehlerfrei laufen kann, bevor es abstürzt, und was ein Java-Compiler in der gleichen Situation getan hätte.
tag = input("Wochentag? ") if tag == "Sonntag": rabatt = "10" + 5 print("Sonntagsrabatt:", rabatt) else: print("Kein Rabatt")
Hinweis: Unterscheide, wann ein Typ geprüft wird: vor dem Lauf oder während des Laufs.
"10" + 5 → TypeError · dynamisch = Typ gehört zum Wert, Prüfung zur Laufzeit · Zeile 3 wird nur sonntags erreicht ⇒ Absturz erst am ersten Sonntag · Java: statisch, der Compiler prüft alle Zeilen vorher ⇒ Fehler vor dem Start, auch in Zweigen, die selten laufen.Musterlösung anzeigen (zählt als erledigt)
Musterlösung: Die Behauptung ist falsch. Gegenbeispiel: "10" + 5 führt in Python zu einem TypeError, weil Python einen Text und eine Zahl nicht mit + verknüpft. Python ist dynamisch typisiert: Man schreibt keine Typen hin, aber jeder Wert hat einen Typ, und der wird während des Laufs geprüft.
Im Programm steht der Fehler in Zeile 3. Der Interpreter prüft diese Zeile aber erst, wenn er sie erreicht — und das passiert nur, wenn jemand „Sonntag“ eingibt. An allen anderen Tagen läuft das Programm fehlerfrei durch den else-Zweig. Der Absturz kommt erst am ersten Sonntag.
Java ist statisch typisiert: Der Compiler prüft vor dem Start alle Zeilen, auch die in selten genutzten Zweigen. Ein Ausdruck, der einen Typfehler enthält — etwa die Zuweisung eines Textes an eine int-Variable —, wird schon beim Kompilieren gemeldet; das Programm startet gar nicht erst. (Achtung: "10" + 5 selbst ist in Java kein Fehler, sondern ergibt den Text „105“.)
