VDM (Vienna Development Method) ist eine der etabliertesten modellorientierten formalen Methoden; ihre Wurzeln liegen in der Programmiersprachen-Semantik-Forschung des IBM-Labors Wien in den 1970er-Jahren. Spezifikationen werden in der formalen Sprache VDM-SL geschrieben, deren Semantik in einem ISO-Standard mathematisch festgelegt ist; VDM++ ergänzt objektorientierte Konzepte (Klassen, Vererbung, Threads), VDM-RT erweitert um Echtzeit-Aspekte.
Die Werkzeuge
Das zentrale Open-Source-Werkzeug ist das Overture Tool; sein Kommandozeilen-Kern heißt VDMJ und ist in Java geschrieben. VDMJ unterstützt alle drei Dialekte und kann per vdmj-Kommando gestartet werden, das die VDM-Dateien parst und typisiert.
vdmj -e '1+2' # Ausdruck auswerten
vdmj -i Spez.vdmsl # interaktiv (REPL)
vdmj -p Spez.vdmsl # parsen ohne ausfuehren
vdmj -t Spez.vdmsl # typisieren
VDM-SL im Kern
- Datenmodell: Mengen, Sequenzen, Abbildungen (Maps), Tupel, Records — Typen wie
set of natoderseq of char. - Explizite vs. implizite Spezifikation: explizit mit
f(x) == x+1(ausführbar), implizit über Vor- und Nachbedingungenpre/post. - Zustand:
state-Blöcke mitinv-Invarianten; Operationen mitext-Klauseln (rd/wr) auf Zustandsvariablen. - Logik:
forall/exists-Quantoren,=>,not,and/or,if-then-else,cases.
VDM-Modelle werden primär zur Analyse entwickelt, nicht als Endimplementierung — man validiert sie im Interpreter, testet Invarianten und generiert daraus Code.
Verwandte formale Methoden: Isabelle, TLA+, Alloy sowie PVS und Frama-C.
PVS (Prototype Verification System) ist ein Spezifikations- und Verifikationssystem mit integriertem interaktivem Theorembeweiser, entwickelt am SRI International; es basiert auf typisierter Higher-Order-Logik und wird besonders bei der NASA (Langley) für Hardware- und Protokoll-Verifikation eingesetzt. Eine Spezifikation besteht aus Theorien in .pvs-Dateien.
Arbeiten mit Theorien
pvs # Emacs-Oberflaeche starten
M-x typecheck # Theorie typisieren (C-c C-t)
M-x prove # Formel im Beweiser bearbeiten (C-c C-p)
M-x typecheck-prove # Typecheck + Beweis in einem Schritt (tcp)
Eine Theorie definiert Typen, Konstanten und Axiome; Lemmata und Theoreme werden mit THEOREM bzw. LEMMA deklariert und mit Taktiken bewiesen.
Beweisführung im Prover
prove-it: Komplettbeweis aller offenen Beweisziele („autopilot“).grind: Standard-Mischung aus Vereinfachen, Suchen und Auto-Beweis — der wichtigste Allround-Befehl.simplify: Formel propositional vereinfachen.(skolem!)/flatten: Quantoren instanziieren bzw. Konjunktionen/Implikationen auflösen.(assert): Entscheidbare Teile (Arithmetik, Gleichheit) automatisch schließen.quit: Beweissitzung verlassen; Beweise landen als.prf-Dateien neben der Theorie.
PVS ist eng verwandt mit anderen Formale-Verifikations-Werkzeugen wie Coq, Lean und Isabelle; mit VDM teilt es die Idee der formalen Spezifikation vor der Implementierung.
Gosu ist eine statisch typisierte, objektorientierte Sprache für die Java Virtual Machine (JVM). Sie entstand 2002 intern bei Guidewire Software für Versicherungsanwendungen und wurde 2010 als Open Source veröffentlicht. Gosu kombiniert Java-, C#- und ECMAScript-Ideen und ist vor allem im Versicherungsumfeld (P&C) verbreitet.
Dateien und Werkzeuge
.gs– Gosu-Quelldatei; eine Klasse pro Datei, Name der Datei = Name der Klasse.gst– Gosu-Template-Datei (HTML-artige Templates mit Gosu-Ausdrücken)gosuc– Gosu-Compiler (Kommandozeile, kompiliert .gs nach Java-Bytecode)gosu– Interpreter/REPL für schnelle Experimente
Syntax-Grundlagen
package example
uses java.util.List
class Hallo {
function gruesse(name : String) : String {
var text : String = "Hallo " + name
return text
}
}
uses– Import-Deklaration (stattimport)var– lokale Variable,var x = 5mit Typinferenzfunction f(p : Typ) : Rueckgabe– Methoden-Definition- String-Templates:
"Hallo ${name}"als First-Class-Sprachfeature
Praxis-Tipps
- Gosu bietet auch funktionale Elemente (Lambdas, Block-Expressions) und erweiterbare Typen (Enhancements) für bestehende Java-Klassen
- Dr. Dobb's Journal nominierte Gosu 2011 zur „Language of the Month“
Verwandte JVM-Sprachen: Java-Befehle, Kotlin-Befehle, Groovy-Befehle, C#-Befehle. Weitere JVM-Nachbarn: Xtend-Befehle und X10-Befehle.
Xtend ist eine statisch typisierte Programmiersprache aus dem Eclipse-Umfeld (Xtext-Projekt), die zu lesbarem Java-Quellcode kompiliert. Sie begann als „Xtend2“ und wurde mit Eclipse Juno (Juni 2012) ein eigenständiges Projekt. Xtend erweitert Java um moderne Sprachfeatures, ohne die JVM-Kompatibilität zu verlieren.
Kompilierung
- Quelldateien:
.xtend, eine Klasse pro Datei - Der Compiler erzeugt Java-Quellcode im Ordner
xtend-gen, der dann normal von javac weiterverarbeitet wird - Eclipse: Xtend-Plugin (Eclipse Update Site, Editor + Compiler integriert)
- Maven:
xtend-maven-pluginmit Goalxtend:compile(bzw.xtend:testCompile) - Gradle: Plugin
org.xtext.xtend, Abhängigkeitorg.eclipse.xtend:org.eclipse.xtend.lib
Syntax-Highlights
class Hallo {
def String gruesse(String name) {
val text = "Hallo " + name
return text
}
}
def– Methoden-Definition (kompiliert zu Java-Methoden)val– unveränderliche Variable,var– veränderliche Variable; Typinferenz inklusive- Lambdas:
list.map[ it.length ]mit implizitemit - Extension Methods:
"hallo".toFirstUppererweitert geschlossene Typen ohne Vererbung - Active Annotations: Annotationen nehmen zur Übersetzungszeit am Kompilierungsprozess teil (Boilerplate-Erzeugung, z. B. für Visitor- oder Observer-Muster)
- Template-Expressions: mehrzeilige Strings mit
«ausdruck»-Interpolation
Praxis-Tipps
- Da Xtend nach Java übersetzt wird, bleiben Debugging (mit Debug-Informationen) und Bibliotheksnutzung unkompliziert
- Kein separater Standalone-Compiler: Aufbau über IDE, Maven oder Gradle
Verwandte JVM-Sprachen: Java-Befehle, Kotlin-Befehle, Groovy-Befehle, Scala-Befehle. Weitere JVM-Nachbarn: Gosu-Befehle und X10-Befehle.
X10 ist eine statisch typisierte, objektorientierte Sprache für paralleles und verteiltes Rechnen, entwickelt von IBM am Thomas J. Watson Research Center im DARPA-Projekt PERCS (High Productivity Computing Systems). X10 erweitert einen sequenziellen Sprachkern um places (Orte), activities (Aktivitäten), clocks (Uhren) und verteilte Arrays – das sogenannte APGAS-Modell (Asynchronous Partitioned Global Address Space).
Werkzeuge
x10c– Compiler mit Java-Backend (erzeugt Java/Bytecode)x10c++– Compiler mit C++-Backend (für native, leistungsfähige Ausführung)runx10– Startprogramm: verteilt die Ausführung über mehrere places, z. B.runx10 -n 4 Programm(4 places)
Parallelitäts-Konstrukte
finish {
for (p in Place.places()) {
async at (p) Console.OUT.println("Hallo von place " + p.id);
}
}
async– startet eine neue Aktivität (feinkörnig nebenläufig)finish– wartet, bis alle inneren Aktivitäten beendet sindat (p)– führt Code auf einem bestimmten place aus;async (p) Sist syntaktischer Zucker fürat (p) async Satomic– atomare Blöcke für gemeinsame Variablenateach– startet Aktivitäten über alle places einer Verteilung- Kommunikation über Places (partitionierter globaler Adressraum) statt expliziter Message Passing
Praxis-Tipps
- Kompilieren:
x10c++ -o Programm -O Programm.x10, dannrunx10 -n 4 Programm - Für die Datenparallelität gibt es mehrdimensionale verteilte Arrays (
Array[T]mitDist) undClock-Synchronisation
Verwandte Sprachen: Java-Befehle (X10-Syntax), C/C++-Befehle (C++-Backend), Go-Befehle (Nebenläufigkeit), Xtend-Befehle und Gosu-Befehle. Konzepte: Multikern-Prozessor und Nebenläufigkeit.