Programmiersprachen
Mit den ersten universellen Digitalcomputern in den 1940er-Jahren wurden auch erstmals Sprachen benötigt, um diesen Computern Anweisungen zu erteilen. Seither haben sich viele verschiedene Familien von Programmiersprachen entwickelt:
Kompilierte Sprachen
Um die ganze Geschwindigkeit eines Computers ausnutzen zu können, werden Programmiersprachen zuerst in Maschinensprache übersetzt («kompiliert»). Dadurch erhält der Computer die Anweisungen beim Ausführen direkt im erwarteten Format.
Kompilierte Sprachen werden vor allem zur Entwicklung von Betriebssystemen (wie Windows, macOS, Linux), Hardware-Treibern und anderem Code, der direkt mit Hardware interagiert, und für Apps verwendet, bei welchen Geschwindigkeit zentral ist (wie z.B. Ihr Webbrowser).
Bekannte Sprachen, die meist kompiliert werden, sind:
- Assembler (1940er) – sehr nahe bei Maschinensprache
- C (1972) – moderne Programmstrukturen, dennoch einfach zu übersetzen; heute oft noch der kleinste gemeinsame Nenner; Linux ist in C geschrieben
- C++ (1983) – Weiterentwicklung von C mit Objekten; Windows ist in C++ geschrieben
- Java (1991) – geplant als kompilierte Sprache, die überall ausgeführt werden kann; heute v.a. auf Servern und Android-Telefonen verwendet
- C# (2001) – von Microsoft geschaffener Nachfolger von C++
- Rust (2010) – u.a. von Mozilla entwickelter Nachfolger von C und C++
Java, C# und Rust wurden jeweils als Reaktion auf C und C++ entwickelt, um bekannte Schwachstellen zu vermeiden, die entstehen, wenn durch die Nähe zur Maschinensprache und aus Geschwindigkeitsgründen darauf verzichtet wird, zu überprüfen, ob eine Anweisung auch Sinn macht (dadurch kann z.B. Code überschrieben werden und das Programm unerwartet etwas ganz anderes machen).
Interpretierte Sprachen
Interpretierte Sprachen verzichten auf die teilweise zeitaufwändige Übersetzung des Programms in Maschinensprache und verwenden stattdessen eine separate App, welche das Programm Anweisung für Anweisung durcharbeitet.
Bekannte Sprachen, die meist interpretiert werden, sind:
- Lisp (1958) – eine sehr einfach zu lesende und damit zu interpretierende Sprache
- BASIC (1964) – eine Einsteiger-freundliche Sprache, welche u.a. bei allen Microsoft Betriebssystemen mitgeliefert wurde (und noch immer wird)
- Python (1991) – durch eine sehr breit abgestützte Funktionsbibliothek inzwischen die meist verwendete interpretierte Sprache
- JavaScript (1995) – entwickelt, um Webseiten interaktiv gestalten zu können; wohl die meistverbreitete interpretierte Sprache, da in allen relevanten Internetbrowsern mitgeliefert
- Processing (2001) – eine am MIT entwickelte, ursprünglich auf Java basierte Sprache zur Erstellung von interaktiver Kunst
- Julia (2012) – eine Sprache mit Stärken in Mathematik und Statistik
Syntax
Programmiersprachen sind syntaktisch einfacher aufgebaut als gesprochene Sprachen. In gängiger Form werden meist nur Verben (im Imperativ) und Objekte verwendet.
Bei Präfix-notierten Sprachen steht dabei das Verb vor den Objekten (wie in der Mathematik bei \(s i n \), \(l o g \), ...), bei Infix-notierten Sprachen steht das Verb dazwischen (wie in der Mathematik bei den Operationen \(+\), \(-\), ...) und bei Postfix-notierten Sprachen steht das Verb am Ende.
Während für mathematische Ausdrücke natürlicherweise oft Infix-Notation verwendet wird, hat sich ansonsten eine Präfix-Notation weitgehend durchgesetzt.
Bei den folgenden Beispielen wird jeweils der Ausdruck «Hallo, Welt!» ausgegeben, wenn die Variable freundlich gesetzt ist, und in der Variable x der Wert von \(1 +2 \cdot 3 \) gespeichert:
Lisp-Dialekte sind reine Präfix-Sprachen: Hier steht immer das Verb zuerst.
(if freundlich
(print "Hallo, Welt!"))
(let x (+ 1 (* 2 3)))
Zudem wird hier alles in Klammern eingefasst, was eine sehr reguläre Syntax ergibt.
Forth-Dialekte sind reine Postfix-Sprachen: Das Verb steht immer zuhinterst.
freundlich ["Hallo, Welt!" print] [] if
1 2 3 * + :> x
Abfolgen von Anweisungen werden hier in eckige Klammern gefasst, wenn sie nicht sofort ausgeführt werden sollen.
C-Dialekte nutzen Infix-Notation für Mathematik und Präfix-Notation für alles andere:
if (freundlich) {
printf("Hallo, Welt!");
}
int x = 1 + 2 * 3;
Diese Sprache nutzt runde Klammern für Funktionsargumente und geschweifte Klammern für Anweisungen, die zusammen gehören. Zudem muss hier jede Anweisung mit einem Strichpunkt abgeschlossen werden.
Viele gängige Programmiersprachen wie C++, Java, C#, Rust und JavaScript sind gleich aufgebaut.
Python ist ähnlich wie die C-Dialekte aufgebaut, ausser dass auf geschweifte Klammern und Strichpunkte verzichtet wurde:
if freundlich:
print("Hallo, Welt!")
x = 1 + 2 * 3
Neuere Programmiersprachen orientieren sich oft an vorangegangenen, daher ergeben sich bezüglich Interpretation/Kompilation und Syntax über Zeit nachvollziehbare Verwandtschaften: