Die Programmiersprache ML gilt seit langem als eines der leistungsfähigsten und elegantesten Werkzeuge im Bereich der funktionalen Programmierung. Ihr statisch typisiertes System, ihre polymorphen Funktionen und die fest integrierte Typinferenz haben ML für viele Entwickler interessant gemacht. Dennoch beschränkte sich die Sprache vor ihrer Erweiterung auf klassische funktionale Programmierkonzepte und unterstützte keine objektorientierten Paradigmen, die gerade bei komplexen Softwareprojekten häufig verlangt werden. Genau an dieser Stelle setzt Objective ML an und erweitert ML um eine leistungsfähige, integrierte Unterstützung für objektorientierte Programmierung, ohne die Vorteile der ursprünglichen Sprache zu verlieren. Objective ML wurde 1998 von Didier Rémy und Jérôme Vouillon als kleines, praktisches Objektorientierungserweiterungssystem vorgestellt, das vollständig kompatibel mit ML ist und dessen Typinferenzmechanismus nutzt.
Es ist bemerkenswert, dass Objective ML die typischen objektorientierten Features wie Klassen, Objekte, Methoden, Vererbung, Mehrfachvererbung, polymorphe Klassen sowie Methoden, die sich selbst zurückgeben oder für binäre Operationen eingesetzt werden, implementiert und dabei eng an die ML-Polymorphie anknüpft. Ein herausragendes Merkmal dieser Erweiterung ist die konservative Natur des Designs. Sie erlaubt es Entwicklern, bestehende ML-Programme weiterzuverwenden oder neue Module zu schreiben, ohne die objektorientierte Erweiterung überhaupt zu bemerken oder zu verwenden. Neue ML-Anwender können sich zunächst auf die funktionalen Aspekte konzentrieren und später den objektorientierten Teil hinzunehmen – dies ist dank der tieferen Kompatibilität möglich. Der Kern von Objective ML liegt in seiner besonderen Behandlung der Typen.
Während klassische ML-Recordtypen für polymorphe Zugriffe sorgen, erweitert Objective ML diese Konzepte durch die Einführung von Objekttypen, die einerseits Ähnlichkeiten zu Aufzeichnungsstrukturen aufweisen, aber durch Methodenimplementierungen und Selbstverweisung komplexere Verwendungszwecke erlauben. Zudem wurde der Umgang mit Typabkürzungen verbessert, um Lesbarkeit und Wartbarkeit des Codes zu erhöhen. Die Fähigkeit, Objekte explizit in ihre jeweiligen Superklassen umzuwandeln (Coercion), erweitert die Flexibilität, ist jedoch keine automatische Funktion, sondern erfordert vom Programmierer bewusste Eingaben. Die Zielsetzung von Rémy und Vouillon war es nicht, lediglich einen minimalen Objektkern in ML zu integrieren, sondern eine praktische Sprache zu schaffen, die sowohl funktionale als auch imperative Programmierstile unterstützt. Die dynamische Semantik von Objective ML wurde formal definiert und auf ihre Korrektheit gegenüber der statischen Semantik überprüft.
Das Ergebnis ist eine Implementierung, die es erlaubt, Methoden zwischen allen Instanzen einer Klasse effizient zu teilen – ein Punkt, der für performante Programme entscheidend ist. Objective ML wurde als Kernformalismus konzipiert. Darauf aufbauend entstand eine vollständige Implementierung namens Objective Caml, welche auf der Caml Special Light Umgebung basiert. Objective Caml erweitert den Kern, hat sich aber strikt an das formale Design gehalten. Dies erlaubt es, reale Anwendungen zu schreiben, die sowohl die Vorteile funktionaler als auch objektorientierter Programmierung nutzen.
Die Syntax von Objective ML ist eingebettet in das bekannte ML-Umfeld und beinhaltet die Definition von Klassen über Schlüsselwörter wie 'class' und die Verwendung von 'struct' für die Struktur und interne Felder. Beispiele für Klassen zeigen, wie Felder mittels veränderbarer Referenzen definiert werden können, um den Zustand eines Objekts zu speichern – etwa Positionen eines Punktes. Methoden können nicht nur auf Felder zugreifen, sondern auch sich selbst zurückgeben, was man in objektorientierten Programmiersprachen als 'self Typ' kennt. Dies ermöglicht eine flexible Gestaltung von Methodenketten und fluide Schnittstellen. Besonders hervorzuheben ist die Unterstützung von Mehrfachvererbung, was für viele moderne objektorientierte Systeme essenziell ist, um verschiedene Klassen miteinander zu kombinieren, ohne Code zu duplizieren.
Die explizite Art der Typenanpassung und Klassenkoerzierung sorgt dafür, dass die Integration objektorientierter Funktionalität sicher und nachvollziehbar bleibt, was der Vermeidung von Laufzeitfehlern zuträglich ist. Die Verbindung zwischen ML-Polymorphie und objektorientierten Features ist ein zentrales Erfolgsmerkmal. Während viele objektorientierte Programmiersprachen statisch typisiert sind, gelingt es bei Objective ML erstmals, typisierte Objektorientierung mit polymorphem Typ-Mechanismus zu kombinieren, was sowohl Sicherheit als auch Flexibilität steigert. Entwickler können somit generische Klassen erzeugen, die parametrisiert sind – ähnlich dem Konzept von generischen Typen in anderen Sprache, jedoch mit ML-typischer Strenge. Die Tatsache, dass die Implementierung in Objective Caml realisiert wurde, zeigt, dass dieses Konzept praxistauglich ist und über theoretische Überlegungen hinausgeht.
Objective Caml hat zudem den Grundstein für spätere Entwicklungen und Erweiterungen in der Caml-Verschiedenen, darunter OCaml, gelegt. Insgesamt zeigt die Entwicklung von Objective ML exemplarisch, wie funktionale und objektorientierte Programmierparadigmen miteinander verschmolzen werden können, ohne an der typischen Strenge und Sicherheit der funktionalen Basis einzubüßen. Diese Kombination erleichtert Entwicklern die Modellierung komplexer Systeme, indem sie die Vorteile beider Welten optimal nutzen. Insbesondere bei größeren Softwareprojekten, wo Modularität, Wiederverwendbarkeit und Wartbarkeit eine große Rolle spielen, bietet Objective ML eine überzeugende Lösung. Insbesondere der Umgang mit Typinferenzen und Objektmodellen grenzt Objective ML von anderen Ansätzen ab, die oft entweder auf statische oder dynamische Typen setzen oder bei denen Objektorientierung nur eingeschränkt unterstützt wird.
Abschließend kann gesagt werden, dass Objective ML eines der ersten praktischen Systeme war, das zeigte, wie eine strikte Typinferenz, polymorphe Typensysteme und objektorientierte Sprachenmerkmale zu einer leistungsstarken, kompatiblen Erweiterung verbunden werden können. Für Entwickler, die sich mit ML beschäftigen und gleichzeitig die Vorteile objektorientierter Konzepte nutzen möchten, stellt Objective ML eine wichtige Referenz und eine kreative Innovation dar, die weiterhin von Bedeutung ist.