Wie schreibe ich eine Programmiersprachenspezifikation?

16

Ich mag das Design von Programmiersprachen sehr. Manchmal denke ich, dass meine Sprachprojekte und ihre potenziellen Benutzer von einem umfassenden Standarddokument profitieren würden. Ich habe mir viele Sprachstandards angesehen, angefangen von sehr formal (C ++) bis hin zu eher informell (ECMAScript), aber ich kann nicht wirklich verstehen, wie ich die Dinge aufschlüsseln und ein solches Dokument organisieren soll, obwohl ich Ich denke, dass ich im technischen Schreiben im Allgemeinen ziemlich gut bin.

Soll ich es wie ein langes Tutorial oder eher wie eine formale Mathematikarbeit schreiben? Wie halte ich es auf dem neuesten Stand, wenn ich es neben einer Referenzimplementierung entwickle? Sollte ich einfach aufgeben und die Implementierung und Dokumentation als De-facto-Standard behandeln? Gibt es wirklich einen signifikanten Vorteil, wenn man einen Standard hat? Bedeutet das Erfordernis eines Standards, dass die Sprache unnötig komplex ist?

Jon Purdy
quelle
1
Haben Sie bereits domänenspezifische Sprachen von Martin Fowler gelesen? amazon.com/
Gary Rowe
@ Gary Rowe: Ich habe nicht. Es scheint eine anständige Lektüre zu sein, obwohl es vielleicht nicht genau das ist, wonach ich suche.
Jon Purdy
Der Vorteil eines Standards gegenüber einer Referenzimplementierung besteht darin, dass Sie definieren können, wo andere Implementierungen von Ihrer Implementierung abweichen können.
Bart van Ingen Schenau

Antworten:

3

Ich fand die Java-Sprachspezifikation sowohl formal als auch lesbar und ich denke, sie hat eine vernünftige Struktur. Einige der W3C-Spezifikationen könnten ebenfalls gute Beispiele sein.

Wenn Sie die formale Arbeit erledigen, können Sie die Sprachkomplexität reduzieren und die Eckfälle erkennen.

Überschriften Brain Dump: Quellcodierung, Lexing, Fundamentaltypen, Literale, Operatoren, Ausdrücke, einfache Anweisungen, Bedingungen, Schleifen, Funktionen (Definitionen und Aufrufe), Typdeklarationen, Module, Kompilierungseinheiten, Variable Scoping, verschiedene Arten der Namensauflösung (z. B. Importe, Methoden), Speichermodell, Nebenwirkungen, Typisierung, Nebenläufigkeit…

Tobu
quelle
Ihre Liste mit Vorschlägen ist sehr hilfreich. Ich denke, ich werde eine ähnliche Liste durch Brainstorming erstellen, sie im Format eines Tutorials sortieren und eine kurze informelle Spezifikation mit einigen formalen Zusätzen wie einer EBNF-Grammatik schreiben. Ich werde mir die Spezifikationen, die Sie für Ideen erwähnt haben, auf jeden Fall noch einmal ansehen.
Jon Purdy
7

Lies viel und halte es einfach

Das Entwerfen einer neuen Sprache ist schwierig. Sehr hart. Aber letztendlich sehr befriedigend, wenn es populär wird und wirklich ein Problem löst, das die Leute auf elegante Weise erleben.

Wie ich in den Kommentaren erwähnt habe, empfehle ich Ihnen, domänenspezifische Sprachen von Martin Fowler aus folgenden Gründen zu lesen :

  1. Er befasst sich intensiv mit der Frage, warum Sie eine Sprache entwerfen sollten
  2. Es gibt Details zur Vorgehensweise (Parser, lexikalische Analyser, Sprachwerkbänke usw.).
  3. Es gibt detaillierte Anweisungen zur Implementierung, wie die von Ihnen gewählte Syntax für Konzepte wie Abschlüsse, Anmerkungen, Literallisten, dynamischer Empfang usw. Verwendet werden kann

Denken Sie beim Verfassen Ihrer Spezifikation an Ihr Publikum. Bevor Sie mit dem Finger auf die Tastatur greifen, um Ihre Sprache zu entwerfen, müssen Sie sich natürlich genau überlegen, was Sie tun möchten.

Wenn es sich um eine neue, interpretierte Sprache handelt, die JavaScript ersetzt, möchten Sie einen sehr fairen Ansatz verfolgen, um Webentwickler mit einer begrenzten Aufmerksamkeitsspanne und dem Wunsch nach sofortigen Ergebnissen zu erreichen - oder, wenn möglich, schneller.

Wenn es bei der nächsten Titan-Mission eingesetzt werden soll, sind äußerst detaillierte Spezifikationen, die genaue formale Beweise für das Verhalten der einzelnen Komponenten enthalten, die Mindesteinstiegsstufe.

Es ist also keine einfache Sache. Um sich der Spezifikation anzunähern, ist es wahrscheinlich besser, wenn Sie viel Erfahrung in der Erstellung Ihrer Sprachen sammeln und auch mit denen zusammenarbeiten, die sie tatsächlich täglich verwenden. Wenn Sie gewillte Opfer haben, ähm, Entwickler, die bei der Arbeit etwas Zeit brauchen, um Ihre Sprache zu lernen, können sie Ihnen Feedback geben, was erforderlich ist, um sie dazu zu bringen, sie zu benutzen.

Kurz gesagt, halten Sie es einfach und mehr Menschen werden es benutzen.

Gary Rowe
quelle
Danke dafür. Ich habe viel Erfahrung darin, Sprachen zu entwickeln und sie sogar ziemlich gründlich zu dokumentieren, aber es ist die Idee eines Standards, der mich konsequent antreibt. Möglicherweise muss ich nur die empfohlene Lektüre aufgreifen und ein wenig experimentieren.
Jon Purdy
@ Jon Purdy Haben Sie Beispiele für die Online-Sprachen, die Sie in die Frage aufnehmen könnten?
Gary Rowe
Ich habe noch keine Beispiele für mein aktuelles Projekt. Das einzige wirklich vollständige öffentliche Beispiel einer Sprache, die ich gemacht habe (und die ich tatsächlich verwende!), Ist
Jon Purdy
@ Jon Purdy Vision sieht interessant aus - eine Art aufgemotztes Velocity. Nebenbei möchten Sie vielleicht einen YouTube-Screencast betrachten, der zeigt, wie er installiert wird, und eine kleine Beispielwebsite schreiben (etwa für einen lokalen Klempner). Dies würde die Lernkurve erheblich erleichtern, da die Benutzer sie in Aktion sehen und die Vorteile sofort in Anspruch nehmen können. Sie können über die Vorteile im Vergleich zu JSP, Velocity, ASP.Net, Freemarker usw. sprechen
Gary Rowe
Das ist eine gute Idee; Ich habe in letzter Zeit eine Menge YouTube-Videos gemacht (ungefähr drei pro Woche), also denke ich, dass ich definitiv eins
reinpassen
3

Wirth hat viele Programmiersprachen entworfen und implementiert: Davon zeichnen sich die Spezifikationen für die Sprachen Oberon und Oberon2 durch Vollständigkeit, Knappheit und Lesbarkeit aus.

grrussel
quelle
2

Common Lisp und Haskell haben Sprachstandards. Ruby und Python haben Implementierungen und Dokumentationen. Daher würde ich sagen, dass ein Sprachstandard nicht erforderlich ist, aber es kann hilfreich sein, wenn Sie erwarten, dass es mehr als eine Implementierung der von Ihnen entworfenen Sprache gibt. Andererseits ist ein Standard verfrüht, wenn Sie erhebliche Änderungen in Ihrer Sprachdefinition erwarten.

Larry Coleman
quelle
Eigentlich hat Ruby zwei Dinge, die als "Spezifikationen" angesehen werden könnten. Es gibt die ISO-Ruby-Spezifikation, die sich derzeit im endgültigen Entwurfszustand befindet und von einigen Personen geschrieben wird, die Erfahrung mit Sprachspezifikationen haben (sie haben an ANSI Common Lisp und ISO C ++ gearbeitet). Und es gibt das RubySpec-Projekt, bei dem es sich um eine Reihe von ausführbaren Beispielen im RSpec-Stil handelt, die sowohl eine für den Menschen lesbare Spezifikation als auch eine maschinenausführbare Konformitätstestsuite für diese Spezifikation bilden.
Jörg W Mittag
1

Jede Spezifikation sollte knapp sein und den Test der Zeit bestehen

Aus diesem Grund sehen Sie eine Abstraktion wie BNF, die für viele Sprachstandards verwendet wird. Sie ist knapp und wird noch lange verstanden, nachdem viele unserer aktuellen Tools zurückgelassen wurden.

Natürlich steckt mehr dahinter als nur eine Grammatik. Schauen Sie sich an, was andere getan haben ... perl6, scheme, C ... sie befassen sich mit Problemen, die auch dem Implementierer am Herzen liegen.

Brad Clawsie
quelle