Questo fa parte di una serie di domande che si concentra su un progetto chiamato Abstraction Project, che mira ad astrarre i concetti utilizzati nella progettazione del linguaggio sotto forma di un quadro.
Un'altra pagina ad essa associata relativa alla tipizzazione strutturale può essere visualizzata qui . Il meta-argomento associato a una richiesta di informazioni sul framework e il luogo adatto per la pubblicazione è disponibile qui .
Quanto dovrebbe essere facile utilizzare un framework di sviluppo linguistico?
Ho scritto quadri di generazione di codice su larga scala che includevano anche la possibilità di inviare il risultato al compilatore specifico della lingua. L'argomento della facilità d'uso emerge da uno di questi esempi di framework: CodeDOM, o Code Document Object Model.
È un framework scritto da Microsoft che descrive strutture di codice comuni, ma generalmente lasciato molto fuori (coercizioni di espressione) e tendeva ad essere un po 'astratto nella sua rappresentazione di alcuni costrutti, a emettere del tutto un cattivo codice basato su quello che stavi facendo: prima CodeDOM mal gestito emettitori PrivateImplementationType
sulla CodeMemberMethod
, quando il tipo utilizzato era un'interfaccia generica. CodeDOM era la mia ragione originale per scrivere il mio primo generatore di codice.
Una cosa che sto cercando di fare, per semplificare il framework, è ridurre la quantità di lavoro necessario per fare qualcosa e concentrarmi sulle azioni rispetto ai tipi specifici che compongono tali azioni.
Ecco un confronto fianco a fianco di come funziona il framework che sto scrivendo:
//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));
Il focus del framework sono gli appassionati di lingua, così come quelli interessati a generare codice o applicazioni. Data la sua attenzione alla compilazione, alla generazione del codice e allo sviluppo del linguaggio, il framework dovrebbe concentrarsi sulla facilità d'uso o sulla potenza pura?
Il mio obiettivo principale è aumentare la disponibilità di tali strumenti, quindi chi è interessato al dominio non richiede molta esperienza nel dominio della teoria del linguaggio prima di poter iniziare a lavorare sui propri progetti incentrati sul linguaggio.
Dato che sono l'autore del framework, la mia visione di "usabilità" è parziale. Pertanto, devo chiedere a un altro se l'attenzione e l'obiettivo hanno senso per gli altri che non sono associati al progetto.