MINT lernen

Zusammenfassung

Alle elf Unterkapitel auf einen Blick: von Assembler und Compiler über C#, Rust, Go, PHP und SQL bis zur Frage, welche Sprache wofür passt.

1

Programmiersprachen einordnen

Vom Bitmuster bis zur Hochsprache: Sprachen unterscheiden sich darin, wie nah sie an der Maschine sind, wie sie übersetzt werden, wie streng sie Typen prüfen und in welchem Stil man in ihnen denkt.

3.1.1 Wie Sprachen entstanden

Maschinensprache besteht aus Bitfolgen. Assembler ersetzt sie durch Kürzel (Mnemonics) — ein Befehl entspricht einem Maschinenbefehl, prozessorabhängig. Hochsprachen brauchen einen Übersetzer.

FORTRAN 1957 · COBOL 1959 · C 1972 · C++ 1985
Python 1991 · Java/JS/PHP 1995 · C# 2000
Go 2009 · Rust 1.0 2015

3.1.2 Compiler und Interpreter

Der Compiler übersetzt vorab den ganzen Quelltext: Fehler vor dem Start, schnell, plattformabhängig. Der Interpreter übersetzt während des Laufs Anweisung für Anweisung: sofort testbar, langsamer, Fehler erst beim Erreichen der Zeile.

Compiler: C, C++, Rust, Go
Interpreter: Python, PHP, JavaScript

3.1.3 Statische und dynamische Typen

Statisch: Der Typ der Variable steht vor dem Lauf fest, der Compiler prüft (auch mit var, let, :=). Dynamisch: Der Typ gehört zum Wert und wird zur Laufzeit geprüft.

JS "5" + 3 → "53" · "5" * 3 → 15
PHP "5" + 3 → 8 · Python → TypeError

3.1.4 Programmierparadigmen

Imperativ: Befehlsfolge, der Zustand ändert sich (prozedural: in Prozeduren gegliedert). Objektorientiert: Klassen, Objekte, Attribute, Methoden. Deklarativ: WAS statt WIE (SQL, HTML). Funktional: Funktionen ohne Seiteneffekte.

filter · map · reduce
Multiparadigmen: Python, JavaScript, C#
Mischform aus Compiler und Interpreter
Quelltext → Bytecode → virtuelle Maschine
Java wird mit javac in Bytecode übersetzt, den die JVM ausführt; C# wird in CIL übersetzt, das .NET ausführt. In beiden Fällen übersetzt ein JIT-Compiler häufig genutzte Teile während des Laufs in Maschinencode. So läuft dieselbe Datei auf verschiedenen Systemen.

Statisch heißt nicht „Typ hinschreiben“

Auch var n = 5; in Java oder n := 5 in Go ist statisch typisiert: Der Compiler leitet den Typ int ab (Typinferenz), und er bleibt fest. Umgekehrt hat in Python jeder Wert einen Typ — geprüft wird nur später.

2

Sprachen und ihre Einsatzgebiete

Jede Sprache hat ihre Stärken: C# für Spiele und Anwendungen, Rust und Go für sichere, schnelle Programme, PHP für Webseiten auf dem Server und SQL für Abfragen an Datenbanken.

3.2.1 C#: Spiele und Anwendungen

Microsoft 2000, objektorientiert, statisch typisiert, Java-ähnlich; läuft auf .NET (CIL + JIT). In Unity erbt ein Skript von MonoBehaviour: Start() läuft einmal, Update() in jedem Frame.

Console.WriteLine("Hallo");
transform.Translate(tempo * Time.deltaTime, 0, 0);

3.2.2 Rust und Go: sicher, schnell

Rust: kompiliert, schnell wie C, jeder Wert hat genau einen Besitzer; let b = a; verschiebt einen String, &a leiht ihn; der Borrow Checker prüft beim Kompilieren, kein Garbage Collector. Go (Google 2009): kompiliert, wenige Sprachelemente, Garbage Collector.

Rust: let s = String::from("Hallo");
Go: x := 5 · go f() · Channels

3.2.3 PHP: Webseiten auf dem Server

Rasmus Lerdorf 1995; serverseitig, interpretiert, dynamisch typisiert. Der Server führt PHP aus und schickt nur HTML — der Browser sieht keinen PHP-Code. JavaScript läuft dagegen clientseitig im Browser.

<?php echo "Hallo $name"; ?>
Verkettung: "Hallo " . $name · $_GET · $_POST

3.2.4 SQL: Daten abfragen

Eine Tabelle besteht aus Datensätzen (Zeilen) und Attributen (Spalten). SQL ist deklarativ; das Ergebnis einer Abfrage ist wieder eine Tabelle. Text steht in einfachen Anführungszeichen.

= <> < > <= >= · AND · OR
COUNT(*) · AVG · MIN · MAX
Das Gerüst jeder SQL-Abfrage
SELECT spalten FROM tabelle WHERE bedingung ORDER BY spalte
SELECT * liefert alle Spalten, ORDER BY … ASC sortiert aufsteigend, DESC absteigend. Beispiel: SELECT titel FROM buecher WHERE genre = 'Krimi' ORDER BY jahr DESC;

Verschieben, leihen, kopieren

In Rust gehört ein String nach let b = a; nur noch b; wer danach a benutzt, bekommt einen Compilerfehler. Mit &a wird nur geliehen, a bleibt Besitzer. Einfache Zahlen wie i32 werden kopiert — beide Variablen bleiben gültig.

3

Die passende Sprache wählen

Ein Algorithmus ist unabhängig von der Sprache. Was sich ändert, ist die Syntax — und die Frage, welche Sprache zu Plattform, Aufgabe und Team passt.

3.3.1 Ein Problem in vielen Sprachen

Blöcke: Einrückung in Python, { } in der C-Familie. Programmrahmen: Java class + main, Go package main + func main, Rust fn main. Variablen und Ausgabe unterscheiden sich in jeder Sprache.

int n = 5; · n = 5 · $n = 5; · n := 5 · let n = 5;
print · System.out.println · echo · fmt.Println · println!

3.3.2 Welche Sprache wofür?

Kriterien: Plattform und Einsatzgebiet, Geschwindigkeit, Sicherheit, Bibliotheken und Community, Vorwissen. Entwicklungszeit gegen Laufzeit abwägen. Große Projekte nutzen mehrere Sprachen (HTML/CSS + JavaScript + PHP + SQL).

Browser → JavaScript · Android → Kotlin/Java · iOS → Swift
Unity → C# · Datenbank → SQL · Mikrocontroller → C/C++
Datenanalyse/KI → Python

3.3.3 Eine neue Sprache lernen

Konzepte (Variable, Typ, Verzweigung, Schleife, Funktion, Liste) bleiben, neu sind Syntax und Besonderheiten ($ in PHP, := in Go, Ownership in Rust). Hallo-Welt zuerst, Vergleichstabelle, offizielle Doku, Playgrounds, bekannte Aufgaben neu lösen.

go.dev/tour · Rust Book · learn.microsoft.com · php.net
Fehlermeldung lesen: Zeile + Art
Laufzeitfaktor im Modell
t(Sprache) = Faktor · t(C)
Modellwerte: C 1 · Rust 1 · Go, Java, C# 1,5 · JavaScript 2 · PHP 8 · Python 25. Braucht ein C-Programm 0,4 s, braucht dieselbe Aufgabe in Python etwa 25 · 0,4 s = 10 s. Ob das stört, hängt davon ab, wie oft das Programm läuft.

7 / 2 ist nicht überall 3,5

Python liefert 3.5 (ganzzahlig: 7 // 2 = 3), JavaScript und PHP ebenfalls 3.5. In Java, C#, Go und Rust ist 7 / 2 mit ganzen Zahlen eine Ganzzahldivision: 3. Wer ein Programm überträgt, muss solche Feinheiten mit Testfällen prüfen.

4

Die Regeln, an denen die Punkte hängen

In der Klassenarbeit gehen die meisten Punkte nicht an schweren Ideen verloren, sondern an kleinen Unterschieden zwischen den Sprachen. Diese drei Regeln fangen fast alles davon ab.

Regel 1: Erst den Typ, dann den Operator

Bevor du eine Ausgabe vorhersagst, notiere zu jedem Wert, ob er Zahl oder Text ist. Dann entscheide je nach Sprache: + verkettet in JavaScript und Java bei Text, rechnet in PHP immer (Verkettung dort mit .) und führt in Python zum TypeError. / mit zwei int-Werten ist in Java, C#, Go und Rust ganzzahlig.

Regel 2: SQL in der richtigen Reihenfolge lesen

Werte eine Abfrage so aus wie die Datenbank: erst FROM, dann WHERE (bei AND müssen beide Bedingungen gelten, bei OR eine), dann ORDER BY, zuletzt SELECT bzw. COUNT/AVG. Markiere die passenden Zeilen in der Tabelle, bevor du zählst.

Regel 3: Begründen heißt Kriterien nennen

Bei „Welche Sprache ist geeignet?“ gibt es Punkte für Kriterien, nicht für Lieblingssprachen: Plattform, Geschwindigkeit, Sicherheit, Bibliotheken, Vorwissen, Entwicklungszeit. Und immer beide Seiten: Was spricht dafür, was dagegen — und was überwiegt?

1AFB I — Reproduzieren10 Aufgaben› ?Selbsttest40 Fragen mit Auswertung›