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.