Die sieben Ursprachen der Programmierung (2022)
(madhadron.com)- Wichtiger als einzelne Syntaxunterschiede sind die Unterschiede in Bündeln grundlegender Muster; Programmiersprachen lassen sich je nach Wiederholung, Rekursion und Art der Komposition in sieben Ursprachen einteilen
- ALGOL, Lisp, ML, Self, Forth, APL, Prolog bilden die Kernklassifikation; jede Familie verwendet eine repräsentative Sprache als Referenzmuster, um die Abstammung anderer Sprachen zu beurteilen
- Neue Sprachen, die eine vertraute Ursprache teilen, sind leicht zu lernen; der Wechsel zu einer fremden Ursprache erfordert jedoch neue Denkpfade und beträchtliche Lernzeit
- ALGOL steht für um Zuweisung, Bedingungen und Schleifen organisierte Funktionen, Lisp für Makros und Listen als Code, ML für erstklassige Funktionen und Rekursion, Self für Objekte mit Nachrichtenversand, Forth für stackbasierte Syntax, APL für n-dimensionale Arrays und Prolog für Fakten und Suchstrukturen
- Für alle Programmierer hat die Beherrschung einer ALGOL-Familiensprache Priorität; danach lohnt es sich, SQL zu lernen und anschließend kontinuierlich fremde Ursprachen zu erschließen
Die sieben Ursprachen der Programmierung
- Bei der Wahl einer Programmiersprache ist das Erlernen von Grundmustern wichtiger als einzelne Syntaxunterschiede; zwischen ähnlichen Sprachfamilien haben Grundstrukturen wie Array-Iteration oder Kombinationsiteration fast dieselbe Form
- Verschiedene Sprachgruppen unterscheiden sich stark in Wiederholung, Rekursion und Programmaufbau; diese Bündel grundlegender Muster bilden unterschiedliche Ursprachen
- Das Erlernen einer neuen Sprache mit vertrauter Ursprache ist ein vergleichsweise leichter Wechsel, doch der Übergang zu einer fremden Ursprache verlangt erheblich Zeit und neue Denkpfade
- Im Softwarebereich werden ALGOL, Lisp, ML, Self, Forth, APL, Prolog als sieben Ursprachen erkannt
- Jede Ursprache wird anhand einer bestimmten repräsentativen Sprache als Referenzmuster klassifiziert; andere Sprachen werden durch Vergleich mit diesem Muster ihrer Linie zugeordnet
-
ALGOL
- Programme bestehen aus einer Folge von Zuweisungen, Bedingungen und Schleifen und sind in Funktionen organisiert
- Viele Sprachen ergänzen dazu Modulsysteme, neue Arten zur Definition von Datentypen, Polymorphie sowie alternative Kontrollflussstrukturen wie Ausnahmen oder Coroutines
- Die meisten heute weit verbreiteten Programmiersprachen gehören zu dieser Linie der Ursprache
- Zu ALGOL selbst zählen ALGOL 58, ALGOL 60, ALGOL W, ALGOL 68
- Assembly language, Fortran, C, C++, Python, Java, C#, Ruby, Pascal, JavaScript und Ada sind mit dieser Familie verbunden
- Es ist die älteste Ursprache mit einer Linie, die bis zur Formalisierung von Programmen für Babbages Analytical Engine durch Ada Lovelace zurückreicht
- Auch die Maschinensprache und Assembler der Computer in der Eckert-Mauchly-Architektur von EDVAC bis zu den frühen Univac-Systemen sowie frühe Versuche höherer Programmiersprachen von Grace Hoppers A-0 bis zu Fortran und COBOL gehören zu dieser Form
- In den 1960er Jahren entwickelte die Wissenschaft strukturiertes Programmieren, um diese Sprachen besser beherrschbar zu machen; das Ergebnis war ALGOL 60, von dem die meisten späteren Mitglieder der Familie abstammen
- Mit der Zeit besteht die Tendenz, Funktionen anderer Ursprachen zu absorbieren
- In den 1980er Jahren wurden Konzepte aus der Self-Familie in Form von Klassen eingebaut und als Mittel zur Implementierung von Datentypdefinition und Polymorphie genutzt
- Seit 2010 tauchen auch Konzepte aus der ML-Familie auf
-
Lisp
- Eine Syntax aus in Klammern gesetzten Präfixausdrücken in Verbindung mit Listendarstellung
(+ 2 3)(defun square (x) (* x x))(* (square 3) 3)
- Da die Listendarstellung aus in Klammern gesetzten, durch Leerzeichen getrennten Elementen in die Sprache eingebaut ist, hat der Code selbst Listenform
- Makros können Listen annehmen, verändern und den veränderten Code an den Compiler weitergeben, sodass Programmierer die Sprachbedeutung neu definieren können
- Beim Schreiben der meisten Programme verhalten sie sich meist wie andere Ursprachen, gewöhnlich ALGOL oder ML, aber das Makrosystem ist das Unterscheidungsmerkmal
- Auch die
loop-Syntax in Common Lisp ist keine eingebaute Sprachfunktion, sondern als Makro definiert - Es gab viele frühe Lisp-Varianten, doch die Community fand einen Konsens um Common Lisp
- Sussman und Steele erforschten, wie weit man mit Funktionen allein kommt, und schufen Scheme
- Es gibt zweckgebundene Lisps wie Lush für numerische Berechnungen, AutoLISP als Skriptsprache für AutoCAD und Emacs Lisp zur Implementierung des Editorverhaltens in Emacs
- In jüngerer Zeit ist Clojure als dritter großer Zweig der Lisp-Familie aufgestiegen
- Es erschien rund ein Jahr nach Fortran und ist die zweitälteste bis heute verwendete Sprachfamilie
- Ausgangspunkt war die mathematische Frage, wie man eine mathematische Struktur notiert, die ihre eigenen Ausdrücke auswerten kann
- John McCarthy gab 1958 die Antwort und sie wurde anschließend auf Computern implementiert
- Frühes Lisp passte wegen seines mathematischen Hintergrunds schlecht zu den damaligen Maschinen; Probleme wie Speicher- und CPU-Zyklen spielten in der Mathematik keine Rolle, weshalb Techniken wie Garbage Collection nötig wurden
- Ende der 1970er und Anfang der 1980er gab es Maschinen, die von Grund auf nur für die Ausführung von Lisp entworfen wurden
- Viele Elemente heutiger integrierter Entwicklungsumgebungen wurden auf diesen Maschinen erfunden
- Zur selben Zeit war Lisp das wichtigste Werkzeug der KI-Forschung; als der KI-Boom der 1980er keine Ergebnisse lieferte, stürzte zusammen mit dem Feld auch Lisp in den AI Winter
- Dennoch überlebte es, und mit leistungsfähigeren Computern und der Übernahme seiner Funktionen durch andere Sprachen sind die Implementierungshürden geringer geworden
- Eine Syntax aus in Klammern gesetzten Präfixausdrücken in Verbindung mit Listendarstellung
-
ML
- Funktionen sind erstklassige Werte, und es gibt ein Typsystem der Hindley-Milner-Familie, das vielfältige Funktionen und Tagged Unions ausdrücken kann
- Jede Wiederholung wird in Form von Rekursion ausgeführt
sum [] = 0sum (x:xs) = x + sum xs
- Es wird auch die Methode genutzt, Funktionen zu definieren, die Wiederholungsmuster kapseln und andere Funktionen entgegennehmen, um das Verhalten umzusetzen
map _ [] = []map f (x:xs) = (f x) : (map f xs)
- Einige Sprachen wie Miranda und Haskell verwenden standardmäßig Lazy Evaluation
- Andere Sprachen erweitern das Typsystem in verschiedene Richtungen
- OCaml versucht eine Verbindung mit Konzepten der Self-Ursprache
- Agda und Idris übernehmen abhängige Typsysteme, die Werte und Typen mischen
- 1ML verbindet Module und Typen
- Aus ML gingen CaML, Standard ML, OCaml hervor
- Verwandte Linien wie Miranda, Haskell, Agda und Idris setzen sich fort
- ML war die Metasprache eines in Cambridge entwickelten Theorembeweiser-Programms; daher stammt auch der Name
- Später löste es sich aus diesem Kontext und verbreitete sich als eigenständige Sprache, besonders in Europa mit Schwerpunkt auf Großbritannien und Frankreich
-
Self
- Programme bestehen aus einer Menge von Objekten, die sich gegenseitig Nachrichten schicken, und jedes Verhalten wird auf diese Weise umgesetzt
- Neue Objekte werden erzeugt, indem Nachrichten an bestehende Objekte gesendet werden
- Auch Bedingungen werden über eine Variable ausgeführt, die auf entweder das Objekt true oder das Objekt false verweist
- Diese beiden Objekte empfangen eine Nachricht mit den Funktionen, die im wahren bzw. falschen Fall ausgeführt werden sollen, als Parameter
- Das true-Objekt führt die erste Funktion aus, das false-Objekt die zweite
- Der aufrufende Code weiß nicht, welches Objekt es ist, und sendet nur eine Nachricht
- Mit Schleifen ist es genauso; erstellt man das passende Objekt und setzt es an die richtige Stelle, lässt sich die gesamte Sprachbedeutung neu definieren
- Solche Sprachen speichern den Quelltext gewöhnlich nicht als Textdateien, sondern in einer Live-Umgebung
- Programmierer verändern das Live-System und speichern dessen Zustand, statt Dateien zu kompilieren und daraus ein System zu bauen
- Wichtige Beispiele sind Smalltalk und Self
- Viele Sprachen übernehmen nur Teile dieses Nachrichtenversands, und diese partielle Übernahme nennt man gewöhnlich objektorientierte Programmierung
- Die meisten davon basieren auf Smalltalk; nur JavaScript ist eine Ausnahme und stammt aus Selfs klassenlosem Objektsystem
- Das Objektsystem von Common Lisp verallgemeinert dies so, dass die Laufzeit den auszuführenden Code nicht nur anhand eines empfangenden Objekts, sondern anhand aller Parameter auswählt
- Erlang verlagert den Ansatz dahin, dass nicht der Ausführungsfluss zwischen Objekten wandert, sondern parallele Ausführungsthreads explizit Nachrichten empfangen und senden
- Die Ursprungssprache ist Smalltalk, entwickelt Ende der 1970er und in den 1980ern bei Xerox Parc
- In den 1980ern gab es mehrere kommerzielle Smalltalk-Systeme, und IBM nutzte Smalltalk zur Entwicklung der Werkzeugfamilie VisualAge für andere Sprachen
- Heute lebt Smalltalk vor allem als Open-Source-Form Pharo Smalltalk fort
- Es wurde intensiv erforscht, wie man Smalltalk schnell und effizient ausführt; der Höhepunkt davon war das Strongtalk-Projekt
- Historisch wichtig ist, dass Entdeckungen aus Strongtalk zur Grundlage des HotSpot JIT-Compilers von Java wurden
- Smalltalk übernahm die Begriffe Wert und Typ aus früheren Sprachen, um Klassen zu implementieren; jedes Objekt hatte eine Klasse, die ihm einen Typ gab, und diese Klasse erzeugte Objekte dieses Typs
- Self entfernte das Klassenkonzept und besteht nur aus Objekten
- Als Referenzmuster dieser Ursprache wurde Self gewählt, weil es die reinere Form ist
-
Forth
- Stacksprachen sind gewissermaßen das Spiegelbild von Lisp und teilen ihre Syntax mit den Rechnern von Hewlett Packard auf Basis der umgekehrten polnischen Notation
- Es gibt einen Daten-Stack; schreibt man ein Literal wie
42, wird es auf den Stack gepusht, und Funktionsnamen arbeiten ohne explizite Parameter auf dem Stack - Selbst einfache Arithmetik erscheint in umgekehrter Form wie
2 3 + 5 * - Auch Funktionsdefinitionen sind sehr kompakt
- In den meisten Forth-Varianten definiert
:ein neues Wort squarebedeutet dasselbe wie ein Aufruf vondupund*dupdupliziert das oberste Element des Stacks,*multipliziert die beiden obersten Elemente
- In den meisten Forth-Varianten definiert
- Man kann den Parser abfangen und durch eigenen Code ersetzen, sodass sich die gesamte Syntax austauschen lässt
- Forth-Programme, die kleine Sprachen definieren, sind üblich, etwa direkte Parser für Teilmengen von Fortran, Paketlayouts oder ASCII-Diagramme, die Zustandsmaschinenübergänge ausdrücken
- Dazu gehören verschiedene Varianten von Forth, außerdem PostScript, Factor und Joy
- Joy ist eine rein funktionale Sprache, die statt eines Stacks eine mathematische Formalisierung von Komposition verwendet
- Forth wurde 1970 erstmals zur Steuerung eines Radioteleskops geschrieben
- Danach verbreitete es sich breit in Embedded Systems
- Forth-Systeme sind leicht genug zu bootstrappen, dass Dutzende Varianten von verschiedenen Programmierern für ihre jeweiligen Zwecke entstanden
- PostScript erschien in den 1980ern als flexibles Mittel, um Dokumente auf Druckern zu beschreiben
- PostScript ist in vieler Hinsicht eingeschränkter als Forth, definiert aber grundlegende Operationen für grafisches Layout direkt in der Sprache
-
APL
- In dieser Sprache ist alles ein n-dimensionales Array
- Operatoren bestehen aus einem oder zwei Symbolen und führen High-Level-Operationen auf ganzen Arrays aus
- Die Darstellung ist extrem kompakt, sodass die Symbolfolge selbst zum Kennzeichen der Operation wird, ohne dass weitere Namen nötig sind
- Ein Beispiel für die Berechnung des Mittelwerts der Variablen
xist(+⌿÷≢) x - APL, J, K sind repräsentative Beispiele
- Höhere Array-Operationen wurden teilweise in viele andere Umgebungen exportiert, etwa MATLAB, NumPy und R
- APL begann mit einer von Kenneth Iverson in den 1960ern entwickelten mathematischen Notation und wurde später auf Computern implementiert
- Seitdem hat es unter Menschen mit schweren Rechenaufgaben eine beständige Nischenanhängerschaft
- Die Nachfolgesprache K war im Finanzumfeld sehr populär
-
Prolog
- Programme bestehen aus einer Menge von Fakten
father(bob, ed).father(bob, jane).
- Verwendet werden auch nicht geerdete Fakten, die mit Variablen neue Fakten aus anderen Fakten ableiten
grandfather(X, Y) :- father(X, Z), father(Z, Y).
- Die Prolog-Laufzeit nimmt diese Fakten und Anfragen entgegen und führt eine Suche aus, um Ergebnisse zu finden
- Wählt man die Struktur der Faktendefinitionen passend, ergibt sich Turing-Vollständigkeit
- Die Terme, aus denen Fakten in Prolog bestehen, sind selbst ein eigener Datentyp, der erzeugt und an die Laufzeit übergeben werden kann
- In dieser Hinsicht nimmt Prolog eine ähnliche Position ein wie Makros in Lisp oder Parserersatz in Forth
- Da Prolog-Programme im Kern Suche sind, erfolgt Optimierung ähnlich wie bei Datenbankabfragen über Steuerung der Suchreihenfolge und frühes Abschneiden erfolgloser Pfade
- Dazu gehören Prolog, Mercury, Kanren
- Der größte Teil der tatsächlichen Programmierung in dieser Ursprache findet in Prolog selbst statt, und die Einheitlichkeit der Community ist sehr hoch
- In den 1970ern erkannten Logiker in Frankreich, dass sich Programme als Prädikatenlogik erster Stufe ausdrücken lassen, und begannen mit Implementierungsversuchen
- Das japanische Projekt für Computer der fünften Generation setzte in den 1980ern stark auf Prolog, doch mit dem Scheitern des Projekts litt auch Prologs Ruf
- Unabhängig davon wurde über Jahrzehnte weiter erforscht, wie sich Prolog-Laufzeiten in den meisten Fällen effizient machen und um neue Funktionen erweitern lassen
- Mit Funktionen wie numerischen Constraints entwickelte sich daraus Constraint Logic Programming
- Prolog taucht weiterhin in Nischenbereichen auf
- Die Typprüfung von Java war über viele Jahre in Prolog implementiert
- Auch Facebooks frühes Werkzeug zur Quellcodesuche basierte auf Prolog
- Programme bestehen aus einer Menge von Fakten
Wie man das nutzen kann
- Vielen Programmierern mögen einige oder alle dieser Sprachfamilien sehr fremd erscheinen, doch wegen der Denkpfade und neuen Möglichkeiten, die jede von ihnen eröffnet, lohnt sich die Investition von Zeit
- Aus ALGOL-Sicht wirken zwei Dinge oft völlig verschieden, die aus einer anderen Perspektive nur einen trivialen Vergleich darstellen
-
Prioritäten
- Alle Programmierer sollten eine Sprache der ALGOL-Familie gut beherrschen
- Danach wird empfohlen, SQL als Sprache der Prolog-Familie zu lernen
- In der Karriere bringt sie nach ALGOL den größten Nutzen
-
Danach erweitern
- Hat man diese beiden Familien gelernt, ist es langfristig vorteilhaft, jedes Jahr eine neue Sprache aus einer fremden Ursprache zu lernen
- Die vorgeschlagenen Sprachen und Reihenfolgen pro Familie sehen so aus
- Lisp: PLT Racket
- ML: Haskell
- Self: Self
- Prolog: Prolog
- Forth: gForth
- APL: K, verwendet über
ok
-
Reihenfolge anpassen
- Wer viel numerisch rechnet, sollte K früher lernen
- Wer viel Embedded Programming macht, sollte gForth früher lernen
- Die Reihenfolge selbst oder die genaue Wahl der Sprache ist jedoch nicht entscheidend
- Statt Haskell kann man auch Standard ML oder OCaml lernen, statt PLT Racket auch Common Lisp, statt gForth auch Factor
-
Ergänzungen aus den Fußnoten
- Auch nach dem Lernen von SQL besteht weiterhin die Notwendigkeit, Prolog selbst zu lernen
- Denn die tatsächliche Verwendung unterscheidet sich deutlich von SQL
- Nach Lesermeinung ist ein üblicher Weg zum tiefen Verständnis von Forth, selbst eine Forth-Implementierung zu schreiben
- Es wird erwähnt, dass Forth klein genug ist, dass eine Person es in relativ kurzer Zeit von Grund auf implementieren kann
- gForth ist eine gute Implementierung, um ANS Forth zu lernen
- Als Lernmaterial wird McCabes FORTH Fundamentals, Volume 1 genannt
- Als weitere Forths werden PygmyForth, eForth, colorForth genannt
- Auch nach dem Lernen von SQL besteht weiterhin die Notwendigkeit, Prolog selbst zu lernen
5 Kommentare
Interessant.
Während des Studiums habe ich Fächer gelernt und Aufgaben bearbeitet, die auf der ALGOL-Familie, Lisp und Prolog basierten – das weckt Erinnerungen.
Diese Sprachen haben moderne Mainstream-Programmiersprachen stark geprägt,
aber darunter scheint nur Forth vergleichsweise wenig Einfluss gehabt zu haben.
Auch wenn ich mich mit Präfixnotation noch anfreunden könnte, ist das Codieren in Postfixnotation einfach viel zu umständlich.
Hacker-News-Kommentare
Im PL-Kurs an der Tufts haben wir für die ersten vier Sprachfamilien vor imperativen Sprachen, Lisp, ML und Smalltalk jeweils selbst eine Mini-Version gebaut, und es freut mich, dass dieser Prozess inzwischen sogar als Lehrbuch erschienen ist. Schade ist nur, dass der frühere Prolog-Teil fehlt
Wenn ich an der Einordnung in diesem Artikel nur eine Sache ändern dürfte, dann wäre es, Ruby nicht als Algol-Familie, sondern klar als objektorientierte Sprache zu sehen. Der Einfluss von Smalltalk ist groß, und selbst in Namen der Standardbibliothek sieht man Spuren davon, etwa
collectstattmap. In Ruby ist von Anfang bis Ende alles ein Objekt, und Methodenaufrufe lassen sich am natürlichsten als das Senden von Nachrichten an Objekte verstehen. Es wird oft mit Python verglichen, aber die Entwicklungspfade waren ziemlich unterschiedlich, auch wenn beide heute gefühlt an einem ähnlichen Punkt im Ökosystem angekommen sind. Für mich fühlt sich Ruby eher wie ein kuscheliges Alpaka an als PythonHello Worldfällt das weniger auf, aber selbst die Basistypen sind inzwischen allesamt Objekte. Wenn jemand OOP nicht mag, kann man mittype(42)unddir(42)gut zeigen, dass sogar eine Ganzzahl ein Objekt istIch würde in die Sprachgenealogie noch eine Kategorie für Sprachen zur Darstellung von Beweisen aufnehmen. Das sind Sprachen, in denen Programme über die Curry-Howard-Korrespondenz zugleich Beweise sind; Lean ist ein typisches Beispiel. Man kann sie als Unterkategorie funktionaler Sprachen sehen, aber weil ihr Hauptzweck eher Verifikation als Ausführung ist, finde ich eine eigene Achse sinnvoll
Ich habe mir vor Kurzem wieder ein Sprachvergleichsprojekt angesehen; dort ging es um einen Benchmark, der 3.715.891.200 signed permutations von 10 Zeichen parallel zyklisch zerlegt. Mich interessierten weniger die „Ursprachen“ als vielmehr moderne Implementierungen der jeweiligen Paradigmen, also Sprachen, die man für Forschungsprogrammierung tatsächlich wählen würde. Ich habe nicht nur auf Performance geschaut, sondern auch darauf, wie gut sie sich mit AI-Unterstützung nutzen lassen und wie angenehm ich den Code lesen und durchdenken kann. Dank AI war es auch möglich, jede Sprache ziemlich tief zu optimieren, also eine Art Tourismus durch verschiedene Sprachwelten zu machen. Die Ergebnisse stehen hier, und besonders überraschend fand ich, dass F# ganz oben landete
Ich habe selbst einmal einen ähnlichen Artikel hier geschrieben. Bei Algol, Lisp, Forth, APL und Prolog stimme ich zu, aber als innovative funktionale Sprache habe ich SASL aufgenommen, das ML etwas vorausging, und als objektorientierten Vertreter Smalltalk statt Self gewählt, weil es früher da war. Dazu habe ich Fortran, COBOL, SNOBOL und Prograph aufgenommen, weil ich sie jeweils für Sprachen halte, die das Feld auf eigene Weise verändert haben
Ich würde dieser Diskussion noch semantische Familien hinzufügen. Gemeint sind etwa Verilog, Petri nets, Kahn process networks, dataflow machines, process calculi, reactive, term rewriting, constraint solver/theorem prover-Familien und probabilistic programming. Außerdem fallen mir Sprachen wie Unison, Darklang, temporal dataflow oder DBSP ein, die nicht sauber in die bestehenden sieben Kategorien passen, aber praktisch schon nah an produktionsreifen Systemen sind. Das mag etwas nach Mogeln klingen, aber sie beruhen auf Rechenmodellen, die parallel zum von-Neumann-Modell stehen. Ich wollte schon länger einmal einen Artikel schreiben wie „alle Arten des Rechnens, die wir kennen, jenseits von von Neumann“
1+1einfach in etwas wieADD(1,1)umschreiben konnte und es dann mit den Mitteln parsen konnte, die ich schon beherrschte. Weil ich mich außerdem sinnlos gegen das Lernen von Regex gesträubt hatte, wurde der Code ziemlich eigenartig, und ich erinnere mich noch an den Satz eines Kollegen: „Lasst es lieber in Ruhe, Andy bekommt es schon hin.“ Jemand aus einem anderen Team hat es mit Regex in ungefähr einem Zwanzigstel meines Codes gelöst„Concepts of programming languages“ an der TU Delft war mein Lieblingskurs im Informatikstudium. Wir haben C, auf der funktionalen Seite Scala und für Prototypkonzepte JavaScript gelernt, und dadurch fiel es mir Jahre später deutlich leichter, Elixir zu lernen. Außerdem gab es einen Kurs, in dem man Unreal-Tournament-Agenten in GOAL, einer auf Prolog basierenden Sprache, programmiert hat. Lange wusste ich nicht, wofür ich Prolog sinnvoll einsetzen könnte, aber am Ende habe ich es verwendet, um eine Rechtschreibprüfung zu bauen, die von LLMs erzeugte miserable Papiamentu-Sätze iterativ korrigieren lässt
Ich stimme der These zu, dass man Sprachen aus unterschiedlichen Kategorien lernen sollte. Erst durch OCaml fühlten sich Funktionen für mich wirklich wie mathematische Funktionen an, Mathematica hat mir beigebracht, Ausdrücke selbst als Eingabe zu betrachten, und die umgekehrte polnische Notation von PostScript hat mein Denken weit über einfache Arithmetik hinaus komplett neu verdrahtet. Der Behauptung, dass es egal sei, ob man Java, C#, C++, Python oder Ruby wählt, stimme ich aber nicht zu. Wenn das Ziel nur darin besteht, Quicksort zu implementieren, mag das ähnlich sein, aber sobald jemand tatsächlich etwas bauen will, macht die Sprachwahl einen Unterschied wie Tag und Nacht. Wer 3D-Spiele entwickeln will und zuerst Ruby in die Hand bekommt oder wer explorative Data Science oder Deep Learning machen möchte und zuerst Java bekommt, verliert womöglich schnell die Motivation
Dieser Artikel erinnert mich an Bruce Tates 7 languages in 7 weeks. Darüber bin ich auch zum ersten Mal auf Erlang gestoßen. Historisch erscheint es mir allerdings etwas gewagt, COBOL und Fortran in die Algol-Familie einzuordnen, auch wenn die Geschichte einen eben daran erinnert, dass jede Darstellung immer ein Stück weit reduktiv ist
Dazu gab es auch schon früher eine HN-Diskussion. Die frühere Debatte hilft beim Einordnen des Kontexts