Ein Überblick über Java-Alternativen für den industriellen Einsatz
Seite 3: Fantom
Ein echter Underdog dagegen ist die nur zwei Jahre jüngere Sprache Fantom. Ihre Entwickler Brian und Andy Frank setzen einige spannende und innovative Konzepte um, die zum Teil auch anderen Sprachen gut zu Gesicht stehen würden.
Im Fokus der Brüder stand der Entwurf einer portablen und eleganten Sprache mit einer um innovative Konzepte angereicherten, eingängigen Syntax. So kann auch Fantom mit allen wichtigen Buzzwords wie First-class Functions, Type Inference und Mixins aufwarten. Mit Portabilität als vorrangigem Ziel nutzt Fantom ein eigenes Interims-Byteformat fcode, das erst zur Laufzeit in den Java- respektive .NET-Bytecode überführt wird. Ähnlich wie bei Kotlin und Ceylon gehört auch JavaScript zu den Zielplattformen – derzeit allerdings noch auf experimentellen Niveau. Damit die Portabilität nicht an plattformspezifischen APIs scheitert, steckten die Entwickler ihre – nach eigenen Aussagen geradezu "obsessive" – Energie in die Gestaltung der spracheigenen Standardbibliotheken, die zwar vergleichsweise wenige, dafür aber sehr elegante und leistungsfähige Klassen bieten.
Streng und doch nicht streng
Streng genommen sprengt Fantom ein bisschen den Rahmen der statisch typisierten Sprachen, da es in Teilen auch eine dynamische Typisierung unterstützt. Zwar zwingt die Sprache den Entwickler, sich für Felder und Methodensignaturen auf Typen und damit einen klaren Schnittstellenvertrag festzulegen, fährt aber ansonsten eher eine "Laissez-fair attitude" was die Typsicherheit betrifft.
Damit entfällt zum Beispiel komplett das aus Java bekannte Typisieren (Typecast). Wenn an einer Stelle eine Spezialisierung des Typs erwartet wird, castet die Sprache, gegebenenfalls ungeprüft, auf ihn. Nur wenn sich der erwarte und der vorhandene Typ zur Laufzeit nicht gesichert ineinander überführen lassen, wirft der Compiler einen Fehler.
// Eine Funktion die ein Int erwartet
Int quadriere(Int x) { ... }
// Statische Typprüfung: zweifelsfrei richtig
Int i := 5
quadriere(i)
// Potentiell richtig; es wird automatisch gecastet
Num n := 5
quadriere(n)
// Komplierfehler: Ein Str kann kein Int sein
Str s := "foo"
quadriere(s)
Leider kommt die beschriebene Vorgehensweise auch an anderer Stelle zum Einsatz, wo sie weniger geschickt ist: Fantom bietet mit Nullability eine Option, um zu unterscheiden, ob ein Typ null enthalten darf oder nicht. In der Regel ist man so sicher, immer einen Wert in der Hand zu haben. Allerdings führt Fantom auch für solche Typen eine implizite Konvertierung aus, womit diese Sicherheit wiederum leicht verloren geht.
Ein zur Geburtsstunde von Java noch unerwarteter Trend ist die rasante Entwicklung Richtung Mehrkern-Prozessoren, der den Einsatz nebenläufiger Programmierung notwendig macht. Mit den Concurrency Utilities hat Java durchaus ein solides Rahmenwerk zu bieten, allerdings kann es mit den klassischen Paradigmen schnell schwierig werden, nicht den Überblick zu verlieren. Hier zeigt Fantom nicht nur Java, wie es besser gehen könnte.
Im Kontrast zu den klassischen Ansätzen gibt es unter Fantom keinen geteilten Speicher zwischen zwei Threads. Jeder Thread kann stets nur seine eigenen Variablen sehen. Vergleichbar mit dem Akka-Framework in Scala kommt stattdessen ein Aktoren nutzendes Modell zum Einsatz: Voneinander unabhängige Aktoren tauschen asynchron unveränderbare Nachrichten miteinander aus und nutzen sonst keinerlei gemeinsame Zustände oder Synchronisationsmechanismen. Dieses im Kern recht einfache Konzept nimmt viel von der Komplexität bei der Entwicklung nebenläufiger Ansätze und erlaubt zugleich eine flexible Skalierbarkeit über Rechnergrenzen hinweg. Die Verankerung direkt im Sprachkern macht es zudem in seiner Verwendung so sicher wie kaum eine andere Herangehensweise.
Auch bei Generics zeigt sich Fantom individuell: Es gibt keine. Zwar besitzen Standardtypen für Listen und Maps durchaus Typparameter, abgesehen davon verzichtete Fantom jedoch zugunsten einer einfacheren Verwendung komplett auf Generics.
Insgesamt vermittelt die Sprache das Bild eines kleinen und durchdachten Gesamtpakets. In dem nur 15 MB großen Download bringt es ein eigenes Build- und ein Package-Management-System, ein plattformunabhängiges GUI-Kit und einige Beispiele inklusive einer Hello-World-Webanwendung samt minimalen Webserver mit. Gerade der in sich geschlossene und konsistente Rahmen ist eine erfrischende Gegenerfahrung zu den überbordenden Technologie- und Framework-Konglomeraten der Java-Welt. Auf der anderen Seite ist das allerdings der größte Pferdefuß der Sprache: Eine echte IDE gibt es nicht, alle Teile beschränken sich auf das Wesentliche und trotz seiner vergleichsweise langen Historie konnte Fantom nie wirkliche Relevanz erreichen. Schade eigentlich, denn die vielen innovativen und pfiffigen Ansätze zeigen, dass Fortschritt bei Programmiersprachen nicht zwangsläufig mehr Komplexität bedeuten muss.