Grundfunktionen für eine Grundsprache? DSL-Vorschläge?


9

Ich habe endlich begonnen, die Komplexität zu verstehen, die hinter dem Erstellen eines Interpreters und eines Compilers steckt. Ich habe mehrere Versionen von TinyBasic, 1964 (Dartmouth) Basic und meine eigenen Erweiterungen für diese Sprachen erstellt, bevor ich zu diesem Punkt komme. Das jüngste Projekt ist eines, das ich Open Source Basic nenne ... weil ich mir keine anderen Merkmale der Sprache vorstellen konnte, die die Leute interessieren würden. In der Lage zu sein, die Quelle der Sprache zu öffnen und zu verstehen, wie einige komplexe Dinge getan werden (wie gescannt, analysiert, interpretiert und kompiliert wird)

Open Source Basic wird zunächst in eine stapelbasierte Sprache interpretiert. Diese stapelbasierte Sprache wird dann sofort interpretiert und ausgeführt oder in eine ausführbare CLR-Datei umgewandelt.

Meine Fragen laufen alle darauf hinaus:

  • Was sind die grundlegenden Funktionen / Konstrukte einer Basic-basierten Sprache? Ich habe bereits diese grundlegenden Konstrukte: Zuweisungen, Ausdrücke, Variablen, einige Funktionen (Random, ToUpper, ToLower), Looping (für und während / bis), If (Block und einzeilig) Sonst Entscheidungen, konsolenbasierte Eingabe (Eingabe) ) und Ausgabe (Drucken) und Unterroutinen (noch ohne Parameter).
  • Wenn ich mit dem Hinzufügen der Grundkonstrukte zu meiner Sprache fertig bin - wie soll ich mich verzweigen? In welche Domain (s)? Mit anderen Worten, welche Richtung (en) sollte meine Open Source-Basissprache einschlagen, wenn alle generischen Konstrukte funktionieren?

Vielen Dank für Ihre Zeit,

Dominick


3
Ich wollte schon immer eine Sprache mit integrierter, syntaxunterstützter AOP-Funktionalität.
FrustratedWithFormsDesigner

@Dominick: Wie wäre es mit LINQ-Funktionalität?
Predator

@Frustrated ... AOP - Aspektorientierte Programmierfunktionalität? Könnten Sie ein Beispiel geben?
Dominick

5
Sie sollten nicht damit beginnen, eine domänenspezifische Sprache anhand grundlegender Funktionen zu erfinden. Formalisieren Sie zuerst Ihre Domain, verwandeln Sie dieses Wissen in eine Sprache und fügen Sie erst dann grundlegende Funktionen hinzu, wenn diese überhaupt erforderlich sind. Wahrscheinlich erhalten Sie sogar ein perfektes DSL, das nicht vollständig ist, und es ist eine der besten Eigenschaften der DSLs.
SK-Logik

1
Sicherlich ist "goto" ein obligatorisches Merkmal eines BASIC?
Perry

Antworten:


1

Meine Erfahrung mit frühem BASIC auf dem Commodore [Vic-20, C-64] erweckte den Eindruck, dass Zeilennummern ein zentrales "Merkmal" von BASIC waren. Es scheint, als würden sie in modernen Implementierungen nicht mehr verwendet, was für mich ein Nachteil ist, da ich BASIC in erster Linie als Lernsprache betrachte, aus der ich auf etwas anderes springen kann.


1

Auf jeden Fall ein nobles Unterfangen, aber ich denke, Sie haben Ihre Prioritäten umgekehrt.

Ihr erstes Anliegen sollten die "Domain" -Probleme sein, auf die Ihre Sprache abzielt. Aus diesem Grund wird es in erster Linie als "domänenspezifische Sprache" bezeichnet. Ein DSL ist nur dann tolerierbar, wenn es klein, einfach und sehr eng fokussiert ist, um bestimmte Probleme wie ein Messer durch Butter zu lösen.

Nachdem Sie die Domäne identifiziert haben und wie Ihre Sprache in der Domäne funktioniert, können Sie bestimmte Konstrukte oder Funktionen festlegen.

Schließlich kann es hilfreich sein zu überlegen, ob Sie ein internes oder externes DSL wünschen .


0

Ich habe eine Skriptsprache für eine CAE / FEA-Anwendung entwickelt und einige Funktionen, die ich für Endbenutzer nützlich fand, sind: Lokale und globale Variablen Matrizen mit dynamischer Zuordnung und Erweiterung Funktionen mit Argumenten und Referenzübergabe Strukturen (benutzerdefinierte Typen) Zusammen mit Die Funktionen, die Sie selbst erwähnt haben, sollten zunächst eine recht leistungsfähige Sprache sein. Dann entwickeln Sie nach Benutzerwunsch.


Das ist eine interessante und sehr domänenspezifische Sprache (Computer Aided Engineering / Finite-Elemente-Analyse). Ich kann sehen, warum Sie Matrizen brauchen sollten. Alle Ihre Vorschläge sind ziemlich gut und ich werde sie berücksichtigen. Vielen Dank.
Dominick

0

Es gibt verschiedene Funktionen, die hinzugefügt oder erweitert werden können, wenn sie bereits vorhanden sind, aber ...

... Grundlegende Programmiersprachen sind Skriptsprachen sehr ähnlich, und eine Funktion, die viele übersehen oder später hinzugefügt haben, waren Namespace oder Module.

C, C ++, PHP, Visual Basic wurden ohne Module / Namespaces gestartet und später hinzugefügt.

Die nächsten können Unterprogramme (Prozeduren oder Funktionen, die keinen Wert zurückgeben) und Funktionen (Unterprogramme, die einen speziellen Wert zurückgeben) sein.


0

Verstehen, wie einige komplexe Dinge erledigt werden (wie gescannt, analysiert, interpretiert und kompiliert wird)

Auf der Stack Overflow-Site gibt es eine nette Frage zu Ressourcen zum Verständnis von Compilern. Sie können auch einen Blick auf meine Compiler-Klassenseite werfen .

Wenn ich mit dem Hinzufügen der Grundkonstrukte zu meiner Sprache fertig bin - wie soll ich mich verzweigen?

Angesichts der Funktionen, die Sie bereits erstellt haben, empfehle ich, drei Datentypen hinzuzufügen: int, string, boolean. Sie müssen drei Dinge tun, die jeweils etwas schwieriger sind als die vorherigen:

  1. Ändern Sie die Grammatik so, dass Sie diese Schlüsselwörter analysieren können. Prüfung.
  2. Erstellen Sie eine Symboltabelle (oder fügen Sie sie zu Ihrer vorhandenen hinzu), damit Sie den Datentyp zusammen mit dem Variablennamen und anderen Eigenschaften einfügen können. Nehmen Sie dann einen Debug-Schalter vor, damit Sie dies testen und die Symboltabelle anzeigen können.
  3. Überprüfen Sie vor der Codegenerierung in MsIL oder während der Interpretation, ob kompatible Typen vorhanden sind. Testen Sie sowohl Fehler- als auch Nichtfehlerfälle in jedem Ausführungsmodus für alle Typen.

Wenn das gut geht, schlage ich vor, am Umfang zu arbeiten (lokal in Unterroutinen vs. global). Lassen Sie mich wissen, wenn Sie dazu einen Rat wünschen.

Viel Glück. Und genieße!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.