Opa ist eine quelloffene, funktionale Programmiersprache für skalierbare Web-Anwendungen, entwickelt von MLstate (einem Spin-off des INRIA-Umfelds). Die zentrale Idee: Client, Server und Datenbank werden in einer Sprache geschrieben und mit durchgängiger statischer Typprüfung zu Webstandards kompiliert — JavaScript für den Browser, Node.js auf dem Server.
Ein Sprache für den ganzen Stack
In Opa definiert der Entwickler Datenbank-Schemata, Server-Logik und Client-UI gemeinsam. Der Compiler trennt den Code automatisch auf, generiert die nötige Serialisierung (JSON) und stellt die Verbindung zwischen Client und Server her. Typspezifische Prüfungen verhindern ganze Fehlerklassen (z. B. inkonsistente Datenbankzugriffe) schon zur Compilezeit.
Erste Schritte
opa hello.opa # kompiliert und startet die Anwendung
opa --help # Optionen anzeigen
Server-Beispiel
function start() {
Resource.page("Hallo Opa", <h1>Hallo Welt</h1>)
}
Server.start(Server.http, { title: "Hallo", page: start })
Dabei liefert Server.start den HTTP-Endpunkt, Resource.page baut eine HTML-Seite, und die XML-artige Syntax <h1>…</h1> ist direkt in die Sprache eingebettet (typspezifische Syntax wie in Wyvern).
Datenbank-Zugriff
database /@register // Datenbank registrieren
type User = { name: string, email: string }
db /users = Map.empty // persistentes Map-Schema
function addUser(u) {
/users[u.name] = u
}
Der Pfad-Präfix /@ markiert Datenbank-Deklarationen, einfache Zuweisungen an Pfade speichern Werte persistent. Die Serialisierung übernimmt der Compiler vollständig.
Praxis-Tipps
- Opa unterstützt das MVC-Muster und bietet Scaffolding, um schnell zu einer laufenden Anwendung zu kommen.
- Der Compiler erzeugt Client- und Server-Code aus einem Quelltext — für kleine Apps ist ein einziges
opa app.opader schnellste Weg. - Das Projekt ist heute vor allem historisch/akademisch interessant, zeigt aber modernes Full-Stack-Design (eine Sprache, durchgängige Typen) bereits 2011.
Verwandte Grundlagen: JavaScript-Befehle, OCaml-Befehle, Haskell-Befehle, Elm-Befehle, Oz-Befehle, Wyvern-Befehle.