Quanto dovrebbe essere semplice utilizzare un framework di sviluppo linguistico?


11

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 PrivateImplementationTypesulla 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.


1
Dovresti porre questa domanda su codereview.stackexchange.com .
Robert Harvey,

6
La domanda, se un framework dovrebbe essere facile da usare a scapito della potenza grezza, non sembra affatto adatta a Code Review.SE, dove "Architettura di livello superiore e progettazione di sistemi software" non è attiva- argomento lì, ed è in argomento qui. Code Review è per quando hai un codice funzionante e vuoi una critica.

L'input di un generatore di codice è solo un altro linguaggio di programmazione. Il desiderio di generare codice significa che la lingua che stai generando non è sufficientemente potente. Le lingue migliori hanno generatori di codice integrati.
Kevin Cline,

@kevincline Il caso d'uso tipico di un generatore di codice è un linguaggio specifico del dominio che utilizza un framework di generazione del codice per scopi generici. Questa non è davvero una grande scelta, l'alternativa sarebbe quella di compilare il tuo linguaggio intermedio interno e interpretarlo attraverso una VM, o tradurlo tu stesso in un costrutto di livello inferiore, ma alla fine stai facendo la stessa cosa . Questo è ciò che questo framework mira a fare, quando devi fare il lavoro per generare codice in modo dinamico, dovresti usare questo invece di integrare la tua implementazione della stessa cosa.
Allen Clark Copeland Jr

Non è tanto che la lingua di origine è insufficiente, è che una grammatica della lingua è solo testo fino a quando non viene scritto un software intermedio per tradurre dal testo di origine alla piattaforma di destinazione. In questo caso è la Common Language Infrastructure (CLI), o codice in linguaggi di uso generale che ha come target la CLI. Il framework mira a gestire il duro lavoro di prendere rappresentazioni di alto livello e tradurle in costrutti di livello sufficientemente basso per la generazione di IL. cioè un compilatore, solo perché hai bisogno di un compilatore non significa che la tua lingua non sia sufficientemente potente. È richiesto.
Allen Clark Copeland Jr

Risposte:


2

È difficile costruire un framework per lo sviluppo del linguaggio. Devi decidere quali tipi di cose vorresti che supportasse, quindi devi decidere quali di quelli che sai come fare e come integrarli insieme in un insieme coerente. Infine, hai fatto abbastanza investimenti in modo che funzioni con linguaggi reali (ad esempio, linguaggi informatici tipici e DSL) e in realtà fa qualcosa di utile. Il mio cappello è fuori per te per averci provato.

Potresti confrontare i tuoi sforzi con quello che ho iniziato 15 anni fa, il DMS Software Reengineering Toolkit . DMS ha lo scopo di fornire analisi, analisi e trasformazione di codice per scopi generici. Data una specifica esplicita lingua, analizzerà il codice, costruirà AST, rigenererà il codice dagli AST (prettyprint), trasformerà il codice usando schemi scritti nel linguaggio di programmazione target, costruirà tabelle di simboli, controllo di calcolo e flusso di dati, ecc. Aggiungendo codice personalizzato, uno fa sì che il DMS porti fuori un'ampia varietà di effetti. (Vedi gli strumenti sul sito; sono tutti DMS in un modo o nell'altro).

Ecco un documento tecnico su DMS come è stato diversi anni fa. (Continuiamo a migliorarlo)

Sebbene lo stesso DMS sia stato difficile da costruire, abbiamo scoperto che è stata necessaria una notevole quantità di ingegneria per definire linguaggi reali per DMS, tra cui IBM COBOL, C # 4.0, Java 1.7, C ++ 11 (e molti altri).

Quello che pensiamo faccia (ragionevolmente bene): ridurre il costo degli strumenti di costruzione di 1-2 ordini di grandezza. Ciò significa che i compiti che altrimenti potrebbero richiedere 1-10 anni possono essere contemplati dai semplici mortali come progetti da 1 mese a 1 anno. Cosa non è ancora facile:

  • Definizione di nuovi linguaggi
  • Gestire tutte le idiocie delle lingue attuali
  • Semplificare la scrittura del codice personalizzato specifico per l'attività
  • Definizione di analisi nuove e complesse
  • Gestione di programmi parziali o programmi contenenti errori
  • (Al punto iniziale) Semplifica l'utilizzo di questi strumenti da parte di non esperti

Quindi, c'è molto margine di miglioramento. Lascia che sboccino molti fiori.


0

A questa domanda potrebbe essere stata data risposta in The Mythical Man Month, la sezione "Integrità concettuale". In caso contrario, è almeno molto rilevante per la tua domanda. Sebbene Brooks descriva l'architettura di un intero sistema informatico, il saggio si applica perfettamente a framework e nuovi linguaggi.

Credo che esista una correlazione positiva tra il tasso di adozione di qualsiasi tecnologia e la sua integrità concettuale e facilità d'uso. Dovrebbe esserci un case study di tecnologie recenti come linguaggi, framework e sistemi operativi, per dimostrare questa correlazione, ma non ne sono ancora a conoscenza.


Il mio unico problema con questa risposta è che non fornisce alcun valore reale. Fa riferimento a una sezione di un libro e dalla tua descrizione sarebbe applicabile solo una volta che il pacchetto software è stato rilasciato. Non mi dà una risposta prima del rilascio, in quanto sta sostanzialmente dicendo "andrà bene se è facile da usare e pertinente al dominio". Non posso dire quanto andrà bene perché non è ancora arrivato al punto in cui puoi usarlo. La cosa con i compilatori è che fai un sacco di lavoro, solo per rendersi conto che sei solo a metà della montagna, e questa è la parte facile.
Allen Clark Copeland Jr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.