Wie einfach sollte ein Sprachentwicklungsframework sein?

11

Dies ist Teil einer Reihe von Fragen, die sich auf ein Projekt namens Abstraction Project konzentrieren, das darauf abzielt, die im Sprachdesign verwendeten Konzepte in Form eines Frameworks zu abstrahieren.

Eine weitere damit verbundene Seite zur strukturellen Typisierung kann hier angezeigt werden . Das Meta-Thema, das mit einer Anfrage zum Framework und dem richtigen Ort zum Posten verbunden ist, finden Sie hier .

Wie einfach sollte es sein, ein Sprachentwicklungs-Framework zu verwenden?

Ich habe groß angelegte Frameworks zur Codegenerierung geschrieben, die auch die Möglichkeit enthielten, das Ergebnis an den sprachspezifischen Compiler zu senden. Das Thema Benutzerfreundlichkeit ergibt sich aus einem solchen Framework-Beispiel: CodeDOM oder dem Code Document Object Model.

Es handelt sich um ein von Microsoft geschriebenes Framework, das gängige Codestrukturen beschreibt, aber im Allgemeinen viel ausgelassen hat (Ausdruckszwänge) und in der Darstellung bestimmter Konstrukte eher abstrakt ist, um auf der Grundlage Ihrer bisherigen Aktivitäten geradezu schlechten Code auszugeben CodeDOM schlecht behandelt emittierende PrivateImplementationTypeauf CodeMemberMethod, wenn der verwendete Typ eine generische Schnittstelle war. CodeDOM war mein ursprünglicher Grund für das Schreiben meines ersten Codegenerators.

Eine Sache, die ich versuche, um das Framework zu vereinfachen, ist, den Arbeitsaufwand zu reduzieren und sich auf Aktionen im Vergleich zu den spezifischen Typen zu konzentrieren, aus denen diese Aktionen bestehen.

Hier ist ein Vergleich der Funktionsweise des Frameworks, das ich schreibe:

//Truncated...
/* *
 * From a project that generates a lexer, this is the 
 * state->state transition character range selection logic.
 * */
var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference()));
//...
char start = rangeElement.B.Value.Start;
char end = rangeElement.B.Value.End;
/* *
 * 'start' <= nextChar && nextChar <= 'end'
 * */
currentExpression = start.LessThanOrEqualTo(nextChar).LogicalAnd(nextChar.LessThanOrEqualTo(end));

Versus CodeDOM:

//Truncated...
var nextChar = new CodeVariableReferenceExpression("nextChar");
//...
var start = new CodePrimitiveExpression(rangeElement.B.Value.Start);
var end = new CodePrimitiveExpression(rangeElement.B.Value.End);
currentExpression = new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(start, CodeBinaryOperatorType.LessThanOrEqual, nextChar), CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(nextChar, CodeBinaryOperatorType.LessThanOrEqual, end));

Der Fokus des Frameworks liegt auf Sprachbegeisterten sowie auf denjenigen, die an der Generierung von Code oder Anwendungen interessiert sind. Sollte sich das Framework angesichts seines Fokus auf Kompilierung, Codegenerierung und Sprachentwicklung auf Benutzerfreundlichkeit oder Rohleistung konzentrieren?

Mein primäres Ziel ist es, die Verfügbarkeit solcher Tools zu erhöhen, sodass diejenigen, die sich für den Bereich interessieren, nicht viel Erfahrung im Bereich der Sprachtheorie benötigen, bevor sie mit der Arbeit an ihren eigenen sprachorientierten Projekten beginnen können.

Da ich der Autor des Frameworks bin, ist meine Ansicht zur "Benutzerfreundlichkeit" voreingenommen. Daher muss ich einen anderen fragen, ob der Fokus und das Ziel für andere, die nicht mit dem Projekt verbunden sind, sinnvoll sind.

Alexander Morou
quelle
1
Sie sollten diese Frage auf codereview.stackexchange.com stellen .
Robert Harvey
6
Die Frage, ob ein Framework auf Kosten der Rohleistung einfach zu verwenden sein sollte, scheint überhaupt nicht für Code Review.SE geeignet zu sein, wo "Architektur und Design von Softwaresystemen auf höherer Ebene" nicht aktiv sind. Thema dort und ist hier zum Thema. Code Review ist für den Fall gedacht, dass Sie Arbeitscode haben und eine Kritik wünschen.
Die Eingabe in einen Codegenerator ist nur eine andere Programmiersprache. Der Wunsch nach Codegenerierung bedeutet, dass die Sprache, die Sie generieren, nicht ausreichend leistungsfähig ist. Bessere Sprachen haben eingebaute Codegeneratoren.
Kevin Cline
@kevincline Der typische Anwendungsfall für einen Codegenerator ist eine domänenspezifische Sprache, die ein universelles Codegenerierungsframework verwendet. Dies ist nicht wirklich eine gute Wahl. Die Alternative wäre, in Ihre eigene interne Zwischensprache zu kompilieren und diese über eine VM zu interpretieren oder sie selbst in ein Konstrukt niedrigerer Ebene zu übersetzen, aber am Ende tun Sie dasselbe . Das ist das Ziel dieses Frameworks. Wenn Sie die Arbeit erledigen müssen, um Code dynamisch zu generieren, würden Sie dies verwenden, anstatt Ihre eigene Implementierung derselben Sache zu beflügeln.
Alexander Morou
Es ist nicht so sehr, dass die Ausgangssprache nicht ausreicht, sondern dass eine Sprachgrammatik nur Text ist, bis eine Zwischensoftware geschrieben wird, die vom Quelltext auf die Zielplattform übersetzt. In diesem Fall ist es die Common Language Infrastructure (CLI) oder Code in Allzwecksprachen, die auf die CLI abzielen. Das Framework zielt darauf ab, die Hauptarbeit zu erledigen, Repräsentationen auf hoher Ebene aufzunehmen und sie in Konstrukte auf ausreichend niedriger Ebene für die IL-Erzeugung zu übersetzen. Das heißt, ein Compiler bedeutet nicht, dass Ihre Sprache nicht leistungsfähig genug ist, nur weil Sie einen Compiler benötigen. Es ist erforderlich.
Alexander Morou

Antworten:

2

Es ist schwierig, ein Sprachentwicklungs-Framework zu erstellen. Sie müssen entscheiden, welche Art von Dingen Sie unterstützen möchten, dann müssen Sie entscheiden, welche von denen Sie irgendwie tun können und wie Sie diese zusammen in ein zusammenhängendes Ganzes integrieren. Schließlich müssen Sie genug investieren, damit es mit echten Sprachen (z. B. typischen Computersprachen sowie DSLs) funktioniert und tatsächlich etwas Nützliches tut. Mein Hut ist weg von dir, weil du es versucht hast.

Sie können Ihre Bemühungen mit denen vergleichen, die ich vor 15 Jahren gestartet habe, dem DMS Software Reengineering Toolkit . DMS soll das allgemeine Parsen, Analysieren und Transformieren von Code ermöglichen. Bei einer expliziten Sprachspezifikation wird Code analysiert, ASTs erstellt, Code aus ASTs neu generiert (Prettyprint), Code mithilfe von in der Zielprogrammiersprache geschriebenen Mustern transformiert, Symboltabellen erstellt, Steuerelemente und Datenfluss berechnet usw. Durch Hinzufügen von benutzerdefiniertem Code, man lässt DMS eine Vielzahl von Effekten ausführen. (Siehe die Tools auf der Website; sie sind alle DMS in der einen oder anderen Form).

Hier ist ein technisches Dokument zu DMS, wie es vor einigen Jahren war. (Wir verbessern es weiter)

Obwohl DMS selbst schwer zu erstellen war, stellten wir fest, dass ein entsprechend großer Teil des Engineerings erforderlich war, um echte Sprachen für DMS zu definieren, einschließlich IBM COBOL, C # 4.0, Java 1.7, C ++ 11 (und viele andere).

Was wir denken (ziemlich gut): Senken Sie die Kosten für den Bau von Werkzeugen um 1-2 Größenordnungen. Dies bedeutet, dass Aufgaben, die andernfalls 1-10 Jahre dauern könnten, von bloßen Sterblichen als 1-Monats-1-Jahres-Projekte betrachtet werden können. Was immer noch nicht einfach ist:

  • Neue Sprachen definieren
  • Umgang mit allen Redewendungen der aktuellen Sprachen
  • So können Sie ganz einfach den für Ihre Aufgabe spezifischen benutzerdefinierten Code schreiben
  • Neue, komplexe Analysen definieren
  • Behandlung von Teilprogrammen oder Programmen, die Fehler enthalten
  • (Zu Ihrem Ausgangspunkt) Machen Sie es Nichtfachleuten leicht, diese Tools zu verwenden

Es gibt also viel Raum für Verbesserungen. Lass viele Blumen blühen.

Ira Baxter
quelle
0

Diese Frage wurde möglicherweise in The Mythical Man Month, Abschnitt "Conceptual Integrity", beantwortet. Wenn nicht, ist es zumindest sehr relevant für Ihre Frage. Obwohl Brooks die Architektur eines ganzen Computersystems beschreibt, lässt sich der Aufsatz perfekt auf Frameworks und neue Sprachen anwenden.

Ich glaube, dass eine positive Korrelation zwischen der Akzeptanzrate einer Technologie und ihrer konzeptionellen Integrität und Benutzerfreundlichkeit besteht. Es sollte eine Fallstudie neuerer Technologien wie Sprachen, Frameworks und Betriebssysteme geben, um diese Korrelation zu belegen, aber noch keine bekannt.

maxpolk
quelle
Mein einziges Problem mit dieser Antwort ist, dass sie keinen wirklichen Wert liefert. Ist Referenzen ein Abschnitt eines Buches und aus Ihrer Beschreibung wäre nur anwendbar, wenn das Softwarepaket veröffentlicht wurde. Es gibt mir keine Antwort vor der Veröffentlichung, da es im Grunde sagt: "Es wird gut funktionieren, wenn es einfach zu bedienen und für die Domain relevant ist." Ich kann nicht sagen, wie gut es funktionieren wird, da es noch nicht so weit ist, dass Sie es verwenden können. Die Sache mit Compilern ist, dass Sie sehr viel arbeiten, nur um zu erkennen, dass Sie nur auf halber Höhe des Berges sind, und das ist der einfache Teil.
Alexander Morou