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 PrivateImplementationType
auf 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.
quelle
Antworten:
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:
Es gibt also viel Raum für Verbesserungen. Lass viele Blumen blühen.
quelle
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.
quelle