Obwohl es Frameworks gibt, die speziell für das Prototyping von Programmiersprachen erstellt wurden (einschließlich ihrer Semantik, Typsysteme, Auswertung sowie Überprüfung ihrer Eigenschaften), hängt die beste Wahl von Ihrem speziellen Fall und Ihren spezifischen Anforderungen ab.
Trotzdem gibt es mehrere (vielleicht nicht so unterschiedliche) Alternativen, die Sie wählen könnten (einschließlich der bereits erwähnten):
- Verwenden einer bestimmten Sprache / eines bestimmten Frameworks zum Erstellen und Prototyping neuer Sprachen: Beispiel: Redex [1], eine in Racket eingebettete domänenspezifische Sprache zum Spezifizieren und Überprüfen der (betrieblichen) Semantik von Programmiersprachen, die eine Definition von a Sprache, bietet eine einfache Handhabung von Aufgaben wie Satz (in Latex), Überprüfung von Reduktionsspuren, Komponententests und Zufallstests (z. B. zur Überprüfung der Eingabe)
- Verwendung allgemeiner Modellierungssprachen, mit denen bestimmte Analysen einfach definiert und durchgeführt werden können, sofern sie die jeweilige Sprache im erforderlichen Umfang erfassen können; Alloy [2] ist ein Beispiel für einen solchen Ansatz: Obwohl Sprachen ziemlich allgemein und flexibel sind, können Sprachen als Beziehungen zwischen Zuständen modelliert werden, während die Unterstützung für die Modellprüfung (z. B. Bewertung innerhalb einer solchen Sprache) kostenlos ist, nachdem die Semantik mit a ausgedrückt wurde Beziehungsmodell (zB einige Ideen zur Modellierung der Semantik einer Sprache finden Sie in [3])
- Einbetten der Sprache, um ihre Eigenschaften mit einem Theorembeweiser zu überprüfen; Ein Beispiel wäre die Definition der Sprache sowie ihrer Semantik durch Einbettung in ein Beweissystem wie Coq [4] (weitere Einzelheiten zu diesem Ansatz sowie die Diskussion und Demonstration des Unterschieds zwischen tiefer und flacher Einbettung in Coq finden Sie in [ 5])
- Verwendung von Ott (wie bereits erwähnt, mit ähnlichem Geist wie Redex, aber Bereitstellung einer neuen Definitionssprache, anstatt eingebettet zu sein); Mit Ott können Sie die Programmiersprache in einer praktischen Notation definieren und Sätze und Definitionen in einem Proof-System (normalerweise mit tiefer Einbettung) erstellen, in dem die meisten Überprüfungen (dh Proofs) manuell durchgeführt werden müssen
- Entwicklung der Sprache und ihrer Semantik sowie entsprechende Überprüfungen (z. B. als Tests) "von Grund auf" in einer universellen Programmiersprache und gegebenenfalls Übersetzung in andere Systeme zu Überprüfungszwecken (einige Sprachen wie Leon [6], Integrierte Verifizierer enthalten, mit denen bestimmte Eigenschaften automatisch überprüft werden können, und die diesen Ansatz der Einbettung in ein Proofsystem ähneln.
Beachten Sie, dass es einen Kompromiss zwischen der einfachen Verwendung des Frameworks / Tools (z. B. so einfach wie das Auslegen der Definition auf Papier oder in Latex) und der Leistungsfähigkeit der Mechanismen zum Überprüfen der Eigenschaften der Sprache (z. B. Einbetten der Die Sprache in einem Theorembeweiser kann es ermöglichen, sehr ausgefeilte Eigenschaften zu überprüfen.
[1] Casey Klein, John Clements, Christos Dimoulas, Carl Eastlund, Matthias Felleisen, Matthew Flatt, Jay A. McCarthy, Jon Rafkind, Sam Tobin-Hochstadt und Robert Bruce Findler. Führen Sie Ihre Forschung durch: Über die Wirksamkeit der Leichtbau-Mechanisierung. POPL, 2012.
[2] Daniel Jackson. Legierung: Eine leichte Objektmodellierungsnotation. TOSEM, 2002.
[3] Greg Dennis, Felix Chang und Daniel Jackson. Modulare Codeüberprüfung mit SAT. ISSTA, 2006
[4] Coq Formal Proof Management System
[5] Formale Argumentation zu Programmen. Adam Chlipala, 2016
[6] Leon automatisiertes System zur Überprüfung, Reparatur und Synthese funktionaler Scala-Programme