Frege ist eine rein funktionale, nicht-strikte Programmiersprache für die JVM — im Geiste ein „Haskell für die JVM“. Entwickelt wurde sie von Ingo Wechsung, benannt nach dem deutschen Mathematiker, Logiker und Philosophen Gottlob Frege (1848–1925). Frege-Programme werden zu Java-Quellcode kompiliert und laufen dann wie normale Java-Anwendungen auf der virtuellen Maschine.
Besonderheiten
- Rein funktional: Funktionen ohne Seiteneffekte, Ausnahmen und Ein-/Ausgabe laufen über Monaden (IO-Typ), genau wie in Haskell.
- Nicht-strikte (lazy) Auswertung, Typklassen, Pattern Matching und Typinferenz — vertraute Haskell-Syntax.
- Der Compiler ist selbst in Frege geschrieben und generiert Java-Quellcode, der anschließend von javac übersetzt wird — eine Seltenheit unter den JVM-Sprachen.
- Nahtloser Aufruf von Java-Bibliotheken aus Frege-Code heraus.
Wichtige Befehle
java -jar fregec.jar -d bin -target 1.8 Hello.fr # kompilieren
java -Xss1m -cp bin:fregec.jar Hello # ausfuehren
java -jar frege.jar # REPL starten
Die Option -d setzt das Ausgabeverzeichnis, -target die Java-Version. Im REPL helfen Kommandos wie :load, :type und :quit beim Experimentieren.
Einordnung
Frege ist eine von mehreren Sprachen, die neben Java auf der JVM laufen — funktionale Vertreter sind außerdem Clojure und Scala. Wer rein funktional mit statischer Typisierung arbeiten will, findet in Frege eine konsequente Alternative. Eng verwandt sind die JVM-Sprachen Ceylon und Fantom.
Ceylon war eine objektorientierte, stark statisch typisierte Programmiersprache mit Fokus auf Unveränderlichkeit (Immutability), entwickelt von Gavin King — dem Erfinder von Hibernate — bei Red Hat. Sie wurde 2011 auf der QCon-Konferenz angekündigt und am 12. November 2013 in Version 1.0.0 veröffentlicht. Ceylon lief auf der JVM und konnte zusätzlich nach JavaScript kompiliert werden.
Besonderheiten
- Ausdrucksstarkes Typsystem mit Union- und Intersection-Typen, Typ-Aliasen und fluenter, gut lesbarer Syntax.
- Betonung von Unveränderlichkeit: viele Strukturen sind standardmäßig immutable, ähnlich wie bei Kotlin.
- Eigenes Modulsystem mit Modul-Repositories und der Descriptor-Datei
module.ceylon. - Als Eclipse-Projekt („Eclipse Ceylon“) gehostet; das Basismodul
ceylon.languagewird automatisch importiert.
Wichtige Befehle
ceylon compile Hello.ceylon # kompilieren (JVM)
ceylon run hello # Programm ausfuehren
ceylon compile-js Hello.ceylon # JavaScript-Backend
ceylon doc hello # Dokumentation erzeugen
ceylon import com.example:module/1.0 # Modul aus Repository holen
Weitere Subcommands der ceylon-CLI sind unter anderem copy (Module zwischen Repositories kopieren) und config (Konfigurationsdateien verwalten).
Einordnung
Die letzte Version 1.3.3 erschien am 21. August 2017; danach stellte Red Hat die Entwicklung ein — Java selbst hatte sich mit schnelleren Release-Zyklen wieder geöffnet. Ceylon reiht sich in die JVM-Sprachfamilie neben Java, Kotlin, Groovy und Scala ein. Mit Frege teilt sie das JVM-Ziel, mit Fantom die Mehrziel-Unterstützung.
Fantom (ursprünglich „Fan“) ist eine allgemeine objektorientierte Programmiersprache von Brian Frank und Andy Frank, die auf mehreren Laufzeitumgebungen läuft: der JVM, dem .NET-Common-Language-Runtime und JavaScript. Ihr erklärtes Ziel ist eine einheitliche Standard-API — derselbe Quellcode soll auf allen Zielplattformen funktionieren.
Besonderheiten
- Statische und dynamische Typprüfung kombiniert; 64-Bit-Integer als Standard.
- Pods als Modul-Format: bündeln Code, Ressourcen und Dokumentation.
- Eingebautes Actor-Framework für nebenläufige Anwendungen.
- Eigene GUI-Toolkits: FWT (Desktop) und WebFWT (Browser) nutzen dieselbe API auf allen Backends.
Wichtige Befehle
fan Hello.fan # Skript oder Pod starten
fansh # interaktive Fantom-Shell
fant # Test-Runner ausfuehren
fan -pod build.fan # Pod bauen (build-Skript)
Die fan-CLI startet Programme und Skripte, fansh ist die interaktive REPL-ähnliche Shell, fant führt Tests aus. Build-Skripte (typisch build.fan) erzeugen aus einem Quellbaum fertige Pods.
Einordnung
Fantom ist eine der wenigen Sprachen, die denselben Code auf JVM und .NET ausführen — ein Gegenentwurf zur reinen JVM-Welt von Java, Kotlin, Ceylon und Frege. Auf der .NET-Seite konkurriert es mit C#.
Apache Thrift ist ein von Facebook entwickeltes (2007) und 2008 als Open Source veröffentlichtes Cross-Language-RPC- und Serialisierungs-Framework. Über eine IDL-Datei (.thrift) definiert man Datentypen und Services; der Compiler thrift erzeugt daraus typsicheren Client- und Server-Code für viele Sprachen.
Die Thrift-IDL
Die IDL kennt struct, enum, union, exception, const und service. Felder tragen Nummern und optionale Defaults:
struct Person {
1: string name,
2: i32 id,
3: optional string email
}
service PersonStore {
Person get(1: i32 id),
void put(1: Person p)
}
Basistypen sind bool, byte, i16, i32, i64, double, string, binary sowie Container (list, set, map).
Der thrift-Compiler
Der Compiler erzeugt mit --gen Code für die Zielsprache; -r verarbeitet Includes rekursiv, --out setzt das Ausgabeverzeichnis:
# Java-Code in gen-java erzeugen
thrift -r --gen java tutorial.thrift
# Python-Code in ein eigenes Verzeichnis
thrift -r --out generated --gen py calci.thrift
Unterstützte Sprach-Engines umfassen u.a. java, py, cpp, go, js, ruby, php, perl, csharp und swift. Ohne Angabe legt der Compiler Ordner wie gen-java oder gen-py im aktuellen Verzeichnis an.
Transporte, Protokolle, Server
Thrift ist bewusst geschichtet: Transport (z.B. TSocket, TServerSocket, TFramedTransport), Protocol (Kodierung: TBinaryProtocol — kompakt binär, TCompactProtocol — noch dichter, TJSONProtocol — debug-freundlich) und Server (TSimpleServer für einfache Fälle, TThreadPoolServer, TNonblockingServer).
Verwandte Grundlagen: Protobuf-Befehle (Serialisierung ohne RPC-Schicht) und FlatBuffers (Zero-Copy-Alternative). Typsichere Generierung gibt es auch bei Java und C/C++; textuelle Formate behandelt YAML/TOML/JSON-Befehle.
FlatBuffers ist eine von Google entwickelte, effiziente Cross-Platform-Serialisierungsbibliothek (ursprünglich 2014 für die Spieleentwicklung von Wouter van Oortmerssen, Apache License 2.0). Ihr besonderes Merkmal: Serialisierte Daten lassen sich direkt aus dem Speicher lesen, ohne sie vorher zu parsen oder zu entpacken (Zero-Copy).
Schema: die .fbs-Datei
Strukturen werden in .fbs-Schemata definiert. Zentrale Konstrukte sind table (optional erweiterbar, Felder mit Defaults), struct (feste Größe, inline eingebettet), enum und union:
namespace MyGame.Sample;
table Monster {
name: string;
hp: short = 100;
pos: Vec3;
inventory: [ubyte];
}
struct Vec3 { x: float; y: float; z: float; }
root_type Monster;
flatc: der Compiler
Der FlatBuffers-Compiler flatc wird per CMake gebaut und erzeugt aus dem Schema Code für die Zielsprache:
# C++-Code erzeugen (inkl. Mutator-Methoden)
flatc --cpp --gen-mutable monster.fbs
# Python und Rust parallel
flatc --python --rust monster.fbs
Verfügbare Sprach-Engines: --cpp, --csharp, --go, --java, --kotlin, --javascript, --typescript, --python, --rust, --swift, --php, --lua und mehr. Mit dem Flag --proto kann flatc sogar .proto-Dateien (Protocol Buffers) in .fbs-Schemata konvertieren; --size-prefixed erzeugt Längen-präfixierte Puffer.
Lesen ohne Parsen
Der generierte Zugriffscode greift per Offset-Tabelle direkt auf die Felder im Puffer zu — es wird nichts alloziert oder umkopiert, was Latenz und Speicherdruck minimiert. Daher eignet sich FlatBuffers besonders für Spiele, Mobile-Anwendungen und Performance-kritische Pfade. Änderungen am Schema bleiben dank table und Feldnummern abwärtskompatibel.
Verwandte Grundlagen: Protobuf-Befehle und Thrift (klassische Serialisierungs-Frameworks), Rust-Befehle und C/C++-Befehle für den Einsatz in systemnahen Umgebungen.