Programmieren mit Ocaml

Programmieren mit Ocaml

Alternativen zum Programmieren mit C++ gibt es viele. Doch welche davon eignen sich für mehr als eine Spielerei? Dieser Artikel nennt einige praxistaugliche Programmiersprachen und stellt das zu Unrecht wenig bekannte Ocaml näher vor.

Wenige Diskussionen werden mit mehr Leidenschaft geführt als der ewige Streit um die beste Programmiersprache. Doch allen Skript- und Lisp-Moden zum Trotz ist C++ in den meisten Zählungen der Spitzenreiter, gefolgt von Java. Die Anhänger der Mauerblümchen wissen meist viel an den Stars auszusetzen, für sie sind beide aufgeblähte Monstren, mit denen sich ein stilbewusster und auf Effizienz bedachter Programmierer nicht abgeben sollte.

Alternativen gibt es viele. Doch wie soll man sich zwischen mehreren Tausend Programmiersprachen entscheiden? Viel von sich reden machen in den letzten zwei Jahren so genannte funktionale Programmiersprachen, die vor allem die Entwicklung fehlerfreier und effizienter parallel arbeitender Software für Multicore-Prozessoren unterstützen sollen.

Ein Beispiel dafür ist Erlang, die wie Java auf einer virtuellen Maschine basiert, aber in vielen Fällen bei der Geschwindigkeit mit C-Programmen mithalten kann. Ihr leichtgewichtiges Prozessmodell unterstützt gleichzeitig eine wenig fehleranfällige Programmierung auf Multicore-Maschinen wie auch über vernetzte Rechner hinweg.

In die gleiche Richtung geht Scala, eine Entwicklung für die Java-JVM-Plattform, die eine Programmierung im alten Java-Stil genauso erlaubt wie die Verwendung vieler funktionaler Konstrukte. Viele Entwickler sehen Scala schon als Nachfolger von Java, aber die Komplexität der Syntax erschwert den Einstieg.

Eine wenig spektakuläre, aber dafür erprobte Alternative ist zum Beispiel die Skriptsprache Python. Viele Programme auf dem Linux-Desktop sind heute in Python geschrieben, so dient sie Distributoren wie Ubuntu als zweite offizielle Entwicklungssprache neben C. Python erfüllt einige Kriterien, die sie als Alternative für die Praxis tauglich machen:

  • Eine nicht zu komplizierte und gut lesbare Syntax
  • Ausgereifte Bibliotheken für jeden Anwendungsbereich, von der GUI- bis zur Netzwerkprogrammierung
  • Konstrukte für strukturiertes Programmieren wie beispielsweise Objektorientierung, Exceptions, Module und so weiter

Neben den erwähnten Kandidaten hat es eine Sprache ganz heimlich zu einiger Reife gebracht, die sie zu einer vollwertigen Alternative macht. Ocaml, hatte seinen Frühling vor einigen Jahren und findet im Schatten der Erlang-, Haskell- und Scala-Moden meist wenig Beachtung. Wie bei diesen handelt es sich um eine Sprache mit funktionalen Konstrukten, die aber gleichermaßen objektorientierte Features bietet, wie der Namen bereits andeutet. Gleichzeitig erlaubt sie wie Scala auch eine Reihe imperativer Konstrukte, sodass der Umstieg von anderen Sprachen schrittweise geschehen kann.

Ocaml lässt sich als statisch typisierte Sprache mit Typinferenz charakterisieren. Variablen weisen also immer einen bestimmten Typ (Integer, String, ...) auf, der Programmierer muss ihn aber nicht in jedem Fall angeben, wenn der Compiler ihn selbst erschließen kann. Die Tatsache, dass Ocaml-Programme mit einem Compiler übersetzt werden, führt zu Programmen, die meist so schnell sind wie ihre C++-Pendants oder sogar schneller, was viele Benchmarks belegen.

Ein ebenfalls verfügbarer Interpreter erlaubt es aber auch, schnell mal Dinge auszuprobieren oder Programme einfacher zu entwickeln. Das ausgefeilte Typensystem ist mitverantwortlich dafür, dass Ocaml-Programme schnell laufen, denn es erlaubt dem Compiler einige Optimierungen.

In der Praxis ist jede Programmiersprache nur so gut wie die für sie verfügbaren Bibliotheken. Wer zum Beispiel GUI-Programme für Linux entwickeln will, braucht ausgereifte Frameworks wie GTK, Qt oder Wxwidgets. Für viele Anwendungen sind Bibliotheken praktisch, die XML-Daten verarbeiten, mit Datenbanken sprechen, Lokalisierung unterstützen oder das HTTP-Protokoll beherrschen. Für Ocaml gibt es alle diese Funktionen und noch viele mehr.

Ein einfaches Ocaml-Programm sieht zum Beispiel so aus:

let mittelwert a b =  let summe = a +. b in  summe /. 2.0;;

Um das Programm auszuführen, startet man den Interpreter mit »ocaml« und tippt den Code ein. Der Interpreter reagiert darauf mit der Ausgabe der von ihm erschlossenen Typen der Funktion und der Eingabeparameter:

val mittelwert : float -> float -> float = <fun>

Ab jetzt kann die Funktion im Ocaml-Programm verwendet werden:

# mittelwert 1.0 2.0;;- : float = 1.5

Wie man sieht, fehlen bei einem Funktionsaufruf im Gegensatz zu C, C++ oder Java die Klammern; die Argumente folgen einfach nach dem Funktionsnamen. Ein doppeltes Semikolon schließt die Anweisung ab. Wer die Funktion mit zwei Integerwerten aufruft, bekommt eine Fehlermeldung präsentiert, denn - wie oben zu sehen - Ocaml erwartet zwei Fließkommazahlen. Das zeigt sich auch in den verwendeten Operatoren »+.« und »/.«, deren Punkte bedeuten, dass es sich um die Floating-Point-Versionen handelt.

Weil Ocaml definierte Funktionen auch anhand der Typen unterscheidet, ist es kein Problem, eine Funktion gleichen Namens für Integerwerte zu schreiben:

let mittelwert a b =let summe = a + b insumme / 2;;

Diese Striktheit bei der Typenbehandlung erfordert etwas mehr Genauigkeit beim Entwurf und die explizite Umwandlung von Typen durch den Programmierer. Sie ist auch der größte Kritikpunkt an Ocaml. Auf der anderen Seite ist es gerade dieser Aspekt, der dazu führt, dass Ocaml-Programme weniger fehlerhaft sind und schnell laufen.

Wer partout nicht auf die von vielen Skriptsprachen gewohnte Polymorphie verzichten mag, kann die Bibliothek Deriving verwenden, die viele Typumwandlungen selbst übernimmt - was natürlich wiederum etwas Rechenaufwand kostet. Abbildung 1 zeigt an einem klassischen Unix-Fork-Beispiel, dass Ocaml-Code nicht schwer zu lesen ist.

Dass Ocaml keine akademische Spielerei ist, sondern sich tatsächlich für richtige Software-Entwicklung verwenden lässt, zeigt beispielsweise die Synchronisierungs-Software Unison, die in Ocaml geschrieben ist. Auch die Firma Jane Street Capital setzt selbst geschriebene Ocaml-Programme ein. Unter den Red-Hat- beziehungsweise Fedora-Entwicklern gibt es ebenfalls einige Ocaml-Fans, was dazu führt, dass in Fedora eine ganze Reihe moderner Bibliotheken zur Verfügung steht, zum Beispiel für die Virtualisierungs-APIs. Insgesamt bringt Fedora gut 240 Ocaml-Pakete mit!

Einen kleinen Überblick über die wichtigsten Anwendungsgebiete und passende Ocaml-Module gibt Tabelle 1. Eine Liste verfügbarer Bibliotheken führt der Ocaml-Hump. Wenn doch mal die gewünschte Bibliothek fehlt, helfen das Foreign-Call-Interface oder die SWIG-Bibliothek, die automatisch Ocaml-Bindings für C-Bibliotheken erstellt. Der Ocaml-eigene Paketmanager OPAM hilft bei der Suche nach Modulen und installiert sie auf Wunsch auch gleich. 

Ocaml-Bibliotheken

Anwendung

Modul

GUI

LablGTK

XML

OX, PXP, Xmlm ...

Datenbanken

MySQL, PostgreSQL, SQLite ...

Virtualisierung

Libguestfs, Libvirt

Datenstrukturen

Reins, Bitstring, Ancient

Unicode

Camomile

Web

Mod-OCaml für Apache, Ocsigen ...

Netzwerk

Ocamlnet

Parallelisierung

LWT, Jocaml, Ocamlp3l

Als weiterer Beleg für die Leistungs- und Zukunftsfähigkeit von Ocaml mag die Tatsache gelten, dass Microsoft sich bei der Entwicklung der hauseigenen funktionalen Sprache F# stark an Ocaml orientiert hat. Beim Einstieg in die Programmierung mit Ocaml helfen das Online-Tutorial und das Handbuch zur Unix-Systemprogrammierung.

Schnell und stabil

Ocaml erfüllt die wichtigsten Anforderungen an eine vollwertige Programmier-Alternative für die Software-Entwicklung: Sprache und Tools sind ausgereift, der kompilierte Code läuft so schnell wie ein C++-Produkt und es gibt Bibliotheken für jeden praxisrelevanten Zweck.

Die starke Typisierung von Ocaml, die zu hoher Performance und Stabilität führt, ist gleichzeitig auch der größte Nachteil der Sprache, denn er fordert dem Programmierer mehr Denkarbeit und häufige explizite Typumwandlungen ab. Auch die Ocaml-Beginner-Community ist vielleicht nicht so groß wie bei anderen Programmiersprachen, kann aber mit gut 1000 Mitgliedern auf der Einsteiger-Mailingliste durchaus kompetente Hilfe leisten.

Ähnliche Artikel

comments powered by Disqus
Mehr zum Thema

Compiler-Suite LLVM veröffentlicht Version 3.4

Die neue Version der Compiler-Suite LLVM verbessert den Ocaml-Support, optimiert Ausgabemodule für zahlreiche Zielarchitekturen und gibt die Unterstützung für Visual Studio 2008 auf. Außerdem wird sie als letzte LLVM-Ausgabe C++98 unterstützen.

Artikel der Woche

Support-Ende von SMBv1

Mit dem aktuellen Update für Windows 10 und Windows Server 2016 steht eine Änderung ins Haus, die gerade für Benutzer älterer Linux-Distributionen große Auswirkungen hat. Nachdem Microsoft es über viele Jahre schon angekündigt hat, entfernt der Konzern mit dem aktuellen Update-Release den Support für das SMB-Protokoll 1. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Linux-Backup

Welche Backup-Lösung setzen Sie für Linux im professionellen Umfeld ein?

  • keine
  • eigene Scripts
  • rsnapshot
  • rdiff-backup
  • Bacula
  • Bareos
  • Borg
  • Duplicity
  • Amanda
  • Burp
  • Clonezilla
  • Acronis
  • Arkeia
  • SEP sesam
  • Veeam
  • Redo Backup
  • Relax-and-Recover
  • andere kommerzielle Software
  • andere Open-Source-Software

Google+

Ausgabe /2018

Microsite