In dieser Episode wird die Antwort auf die Frage geliefert, warum wir Dinge wie Programmiersprachen brauchen, und vor allem, warum so viele. Es werden mal wieder starke Meinungen geäußert und es gibt einen zweiten Prolog in der Mitte der Episode. :)
Außerdem dabei: Linguisten, automatisierte Textilbearbeitung und unsichtbarer Programmcode.
Shownotes
Einordnung in das Sprachenuniversum
Programmiersprachen sind formale Sprachen (d.h. ein Algorithmus kann in endlicher Zeit eindeutig entscheiden, ob ein gegebener Text Teil der Sprache ist) -> Rückbezug zu STP021Programmiersprachen sind kein Maschinencode (d.h. Programme in Bytefolgen, den ein Prozessor direkt ausführen kann) -> Rückbezug zu STP011Abwägung zwischen Lesbarkeit für den Menschen und Lesbarkeit für den Computereinfachste Form von Programmiersprachen: Maschinensprachen (stellen Maschinencode direkt lesbar dar)Beispiel anhand einer frühen Anwendung von Programmierbarkeit: Weben/Stricken/Häkeln
Maschinensprache: so etwas wie "zwei links, zwei rechts, zwei fallen lassen"Maschinencode = Lochkarten-Kette für einen Jacquard-Webstuhldarstellendes Beispiel für moderne Maschinensprachen und Programmiersprachen: Fibonacci-Funktion
interaktiv bei Godboltreine Textform nachfolgendunsigned int fibonacci(unsigned int x) {
if (x == 0 || x == 1) {
return x;
}
return fibonacci(x - 1) + fibonacci(x - 2);
}
fibonacci(unsigned int):
push rbp
mov rbp, rsp
push rbx
sub rsp, 24
mov DWORD PTR [rbp-20], edi
cmp DWORD PTR [rbp-20], 0
je .L2
cmp DWORD PTR [rbp-20], 1
jne .L3
.L2:
mov eax, DWORD PTR [rbp-20]
jmp .L4
.L3:
mov eax, DWORD PTR [rbp-20]
sub eax, 1
mov edi, eax
call fibonacci(unsigned int)
mov ebx, eax
mov eax, DWORD PTR [rbp-20]
sub eax, 2
mov edi, eax
call fibonacci(unsigned int)
add eax, ebx
.L4:
mov rbx, QWORD PTR [rbp-8]
leave
ret
Was unterscheidet hier die Programmiersprache von der Maschinensprache?
Verwendung von benannten Variablen, um Werte zu haltenMaschinensprache: nur Speicheradressen und CPU-RegisterVariablen können feste Datentypen habenMaschinensprache: alles nur Nullen und Einsen :)Kontrollfluss-Strukturen (Subprozeduren, Abzweigungen, Schleifen)Maschinensprache: nur lineare Ausführung und Sprungbefehleallgemein:bessere Lesbarkeit (immerhin kann Maschinensprache heutzutage auch Freitext-Kommentare)Portabilität (Unabhängigkeit von Details einer bestimmten Maschinen-Architektur)formale Strukturen, die Fehler vermeiden (z.B. Typprüfungen, Kollisionsvermeidung bei nebenläufigen Programmen)Arten von Programmiersprachen ("Paradigma")
imperative Programmierung: Programme als Folgen von Befehlenstrukturierte Programmierung: Programme als ineinander verschachtelte Blöcke von Befehlsfolgenmodulare Programmierung: Programme als Verbund logischer Einheiten aus Prozeduren und Datenstrukturenobjektorientierte Programmierung: Programme als Verbund von datenhaltenden Objekten, die miteinander interagierenlogische Programmierung: Programme als Verbund von logischen Aussagen und Ableitungsregeln (Beispiele in der Sprache Prolog; Xyrill hat eine Anekdote zu Prolog)funktionale Programmierung: Programme als Verbund von mathematischen Funktionen (insbesondere von Funktionen, die andere Funktionen als Werte nehmen)Beispiel unten: Berechnung sämtlicher Primzahlen in der Sprache Haskellreaktive Programmierung: Programme als voneinander abhängige Berechnungen (Beispiel: Tabellenkalkulation, Webanwendungen mit React)module Primes where
isPrime :: Int -> Bool
isPrime x = all (\y -> mod x y /= 0) $ takeWhile (\y -> y * y <= x) primes
primes :: [Int]
primes = 2 : filter isPrime [3..]
Exkurs: esoterische Programmiersprachen
Brainfuck: eine der minimalsten turing-vollständigen Programmiersprache; nur 8 verschiedene BefehleBefunge: anschauliches Beispiel für das Konzept einer "virtuellen Maschine" im Kontext von ProgrammiersprachenChef: viele esoterische Programmiersprachen sind vor allem clevere TextersetzungPentaradio 2022-12 zu Komplexität