Die Geschichte der Programmiersprache ML ist untrennbar mit den Ursprüngen der funktionalen Programmierung verbunden. Insbesondere die Entwicklung von Edinburgh ML hin zu Standard ML markiert einen bedeutenden Wendepunkt, der maßgeblich von Persönlichkeiten wie Robin Milner, Gérard Huet, Dave MacQueen und anderen gestaltet wurde. Dieser Weg ist gekennzeichnet von technischen Innovationen, philosophischen Diskussionen über Sprache und Implementierung sowie einer Prise zwischenmenschlicher Dynamik, die bis heute Auswirkungen auf die ML-Familie und ihre Nutzer hat. Edinburgh ML entstand aus dem Projekt LCF (Logic for Computable Functions), das die Idee verfolgte, eine programmierbare Metasprache für Beweiserstellung und theorembeweisende Systeme zu schaffen. ML wurde ursprünglich so konzipiert, dass es als eine Art Skriptsprache innerhalb von LCF fungiert.
Ein zentrales Problem der frühen ML-Implementierungen war jedoch die Performance. Ursprünglich wurde ML-Code in Lisp übersetzt und dann interpretiert, was die Ausführung verlangsamt. Gérard Huet versuchte, die Lisp-Quellcodes zur Kompilierung bereitzustellen, doch dies brachte keine wesentlichen Geschwindigkeitsvorteile mit sich, da Lisp-Compiler S-Ausdrücke nicht direkt in Maschinencode übersetzen konnten. Eine entscheidende Innovation kam dann mit der Methode des sogenannten λ-Liftings, die von Dave MacQueen entwickelt wurde. Sie bestand darin, Verschachtelungen von Funktionen extrahieren und auf Top-Level-Funktionen zu heben, um die Erzeugung unnötiger geschachtelter Closures zu vermeiden.
Dies war vor allem in Kombination mit Optimierungen rund um die Currying-Technik wichtig, da im ursprünglichen System bei aufeinanderfolgenden Funktionsaufrufen viele triviale Closures erzeugt wurden, die redundante Rechenzeit beanspruchten. Die erreichte Beschleunigung – von bis zu zwanzigfachen Laufzeitverbesserungen wird berichtet – machte ML erstmals als praktische Programmiersprache benutzbar. Doch die Welt der Programmierung entwickelte sich schnell weiter und mit Luca Cardellis "ML unter UNIX" betrat eine leistungsfähigere Variante mit nativer Codegenerierung die Bühne. Die bessere Performance und die UNIX-Integration führten zu einem Umbruch und gleichzeitig zu einem Konflikt in der ML-Community. Robin Milner, Erfinder von ML, sah die Gefahr einer Zersplitterung, wie sie bei Lisp durch verschiedene Dialekte verursacht wurde, und startete deshalb eine Initiative zur Standardisierung.
Das Resultat dieser Bemühungen war die Definition von Standard ML, das als offizielle und präzise Spezifikation eine große Auswirkung auf Folgesprachen und Implementierungen haben sollte. Die Versuche, eine gemeinsame Sprache zu schaffen, führten zu berüchtigten Treffen, bei denen Diskussionen oft von „clashing egos“ geprägt waren. Besonders deutlich wurde dies im Austausch zwischen der französischen Gruppe, die unter anderem von Gérard Huet vertreten wurde, und Dave MacQueen mit seiner pragmatischen Sichtweise. Forderungen wie die Einführung nicht-linearer Patterns oder eines „where“ Syntaxkonstrukts zur lokalen Deklaration wurden abgelehnt, was für manche Beteiligte enttäuschend war. Der Verzicht auf diese Vorschläge wurde von Dave MacQueen mit Blick auf Einfachheit und Implementierbarkeit gut begründet.
Es zeigte sich, dass manche Innovationen zwar ästhetischen oder historischen Ursprüngen folgten, ihr Einsatz in der Praxis jedoch mehr Probleme als Nutzen schaffen konnte. Ein zentrales Merkmal von Standard ML ist das modulare System, bestehend aus Strukturen, Signaturen und Funktoren. Strukturen definieren ausführbaren Code, Signaturen spezifizieren Schnittstellen und Funktoren ermöglichen die Parametrisierung von Strukturen. Dave MacQueens Konzept erschien für viele zunächst komplex und überfrachtet, doch es erwies sich als fundamental für die Skalierbarkeit großer ML-Projekte. Im Gegensatz dazu startete Caml damals mit einem einfacheren Modulsystem, das auf Makefiles und der Generierung von Objektdateien beruhte, was einige Entwickler als benutzerfreundlicher empfanden.
Interessanterweise ähneln die heutigen OCaml-Module stark denen von Standard ML, wie einige Experten anmerken. Die Syntax von ML hat ebenfalls ihre eigene Geschichte. Edinburgh ML orientierte sich an Peter Landins ISWIM, einer formalen, aber syntaktisch sehr freien Gestaltung des λ-Kalküls. Einige Eigenheiten wie die Verwendung von Semikolons zur Trennung von Listenelementen oder die Notwendigkeit von doppelten Semikolons zur Abgrenzung von Top-Level-Kommandos stammen aus den Beschränkungen des Parsers jener Zeit. So mag es überraschen, dass Listen durch Semikolons getrennt werden, während Tupel mit Kommas arbeiten, was sich aus den Parsing-Strategien ableitet.
Die Standardisierung in SML zielte auf eine logischere und klarere Syntaxabgrenzung ab. Die Einführung zwei unterschiedlicher Schlüsselwörter „fun“ und „val“ für Funktions- und Wertdeklarationen spiegelt die Sehnsucht wider, Überladungen zu vermeiden und den Code leichter nachvollziehbar zu machen. Im Laufe der 1990er Jahre wuchs Standard ML zu einer etablierten Sprache mit einem klar definierten Semantikmodell und einem formal dokumentierten Operationssemantik. Dies führte zu einer bemerkenswerten Kompatibilität zwischen verschiedenen Implementierungen wie SML/NJ, Poly/ML, Moscow ML und MLton. Die strikte Definition ermöglichte es sogar umfangreichen Systemen wie Isabelle, auf mehreren Compilern fast ohne Anpassungen lauffähig zu sein.
Trotz dieser Erfolge verlor Robin Milner im Verlauf des Jahrzehnts das Interesse und die Gemeinschaft verlor ihren festen Ankerpunkt, was den Fortschritt teilweise ausbremste. Die verspätete Veröffentlichung des Basisbibliotheksstandards ist dafür ein typisches Beispiel. Parallel dazu entwickelte sich Caml als eigenständiger Zweig, der insbesondere durch institutionelle Unterstützung und eine bessere Integration in UNIX-Umgebungen an Popularität gewann. Allerdings hatte Caml ursprünglich Schwächen, wie die Mutabilität von Strings und das Fehlen einer Speichermöglichkeit des kompletten Systemimages, was für die Einsatzbereiche im theorembeweisenden Umfeld und bei großen Softwareprojekten erhebliche Nachteile waren. Heute hat OCaml viele dieser Probleme behoben, doch diese Aspekte verdeutlichen, wie unterschiedlich die Entwicklungslinien verliefen und welche Schwerpunkte gesetzt wurden.
Im Bereich der Implementierungen von Standard ML stehen SML/NJ (Standard ML of New Jersey) und Poly/ML als die führenden Vertreter. SML/NJ profitierte von umfangreichen Ressourcen und einem großen Entwicklerteam. Seine Leistung in klassischen Benchmarks war häufig überlegen. Poly/ML hingegen konnte in produktiven Einsatzszenarien wie Isabelle durch besonders effizientes Parallelisieren und eine herausragende Garbage-Collection-Strategie punkten. Eine bis heute ungeklärte Diskrepanz zwischen theoretischen Benchmarkergebnissen und praktischer Performance bleibt bestehen, möglicherweise bedingt durch unterschiedlich ausgeprägte Speicherverwaltungsmechanismen.
Zusammenfassend zeigt die Geschichte von Edinburgh ML zu Standard ML eine spannende Kombination aus technischen Herausforderungen, sozialen Dynamiken und philosophischen Debatten über Sprache, Syntax und Implementierung. Trotz der „Tragödie“ des ML-Schismas, bei dem sich Caml abspaltete, überdauerte Standard ML als ein Meilenstein mit nachhaltigem Einfluss auf die funktionale Programmierung. Die Sprache steht für Klarheit, Formalisierung und Durchdachtheit, die selbst in der heutigen schnelllebigen Welt der Programmiersprachen ihre Berechtigung hat. Parallel dazu zeugt die Vielfalt der ML-Implementierungen von der Lebendigkeit und Anpassungsfähigkeit des Ökosystems. Für Programmierer, Forscher und Interessierte ist es spannend, diesen historischen Prozess nachzuvollziehen und dabei zu verstehen, wie technische Details, Syntaxentscheidungen und menschliche Interaktionen gemeinsam die Entwicklung einer bedeutenden Programmiersprache geprägt haben.
Standard ML, eingebettet in seine Wurzeln und Verzweigungen, bleibt bis heute ein wichtiger Teil der Informatikgeschichte und ein lebendiges Werkzeug moderner funktionaler Programmierung.