La sintassi è importante per un linguaggio di dominio (Lispy) specifico (MELT, all'interno di GCC)?

1

Sono il principale autore e designer di MELT , un linguaggio specifico per il dominio per estendere GCC (la raccolta di compilatori Gnu). L'implementazione è disponibile software gratuito (licenza GPLv3). Se desideri una descrizione dettagliata, dal punto di vista di una lingua specifica del dominio, leggi il mio documento DSL2011 su MELT .

Ho scelto una sintassi simile a Lisp per MELT , così come in Lisp o in Scheme, ogni operazione è scritta con "Un sacco di Insipid Stupid Parenthesis" così il applicazione della funzione f agli argomenti a e b è scritta (f a b) (come se fosse in Schema o in Lisp). Certamente, (f) -un'applicazione di funzione senza argomento- non è la stessa di f -una cosa semplice denotata da una variabile -.

MELT condivide con molti altri Lisp-s e con Scheme i soliti operatori di "controllo" come let if defun define cond lambda letrec list definstance ecc ... MELT non usa i nomi comuni per le operazioni primitive (no car o + in MELT , che ha pair_head list_first +i +iv con significati diversi). E MELT si occupa sia di valori di prima classe (come in Scheme) che di "roba" (per dati GCC grezzi come Gimple , i dettagli sono nel documento DSL2011)

I motivi per cui ho scelto una sintassi simile a Lisp includono:

  • prima, sono zoppo e volevo una rapida implementazione. Parsing Lisp è banale;
  • Ero (e sono) in grado di usare per es. Emacs lisp-mode per MELT senza problemi.
  • Una piccola implementazione MELT è stata originariamente prototipata in Common Lisp
  • Il traduttore MELT corrente viene riavviato, quindi è scritto in MELT
  • L'implementazione utilizza i classici trucchi Lisp: le espressioni S vengono espanse da un meccanismo macro (in una sorta di albero interno di sintassi astratto), quindi normalizzate e infine tradotte in codice C.
  • GCC ha diversi formalismi Lisp come all'interno (in particolare per il back-end, per i file "machine description").
  • i progetti GNU hanno Emacs Lisp e Guile come dialetti simili a Lisp (non ero in grado di usarli per motivi tecnici dettagliati nel mio documento DSL2011).

La mia domanda è: dovrei offrire una sintassi alternativa simile a infisso (un po 'Pythonic o Lua-esque)?

Da un lato, temo che alcune persone (in particolare quelle giovani, che non hanno mai incontrato linguaggi di programmazione simili al Lisp, ho avuto un corso su Lisp negli anni '80) sono completamente allergiche a Lisp e non lo faranno nemmeno prova MELT a causa del suo aspetto.

D'altra parte, l'unica cosa che potrei fare è un semplice parser che produca lo stesso AST di MELT oggi, e la sintassi sarà ad-hoc (ma infissa) e probabilmente non carina .

Inoltre, lavorare su una sintassi alternativa che non userò mi distrarrà (o prenderò tempo) da altri sforzi (scrivendo documentazione e tutorial, facendo buoni esempi di MELT , eseguendo il debug e migliorando l'implementazione).

Alcuni giovani (in particolare Jeremie Salvucci e Pierre Vittet) sono stati in grado di apprendere e codificare MELT senza precedente esposizione a MELT , a dialetti Lisp (o Scheme) o anche alla compilazione.

Una sintassi alternativa attirerebbe le persone allergiche al Lisp? Un bravo ragazzo mi ha detto che la sintassi non conta davvero per i DSL-s. Possono essere adottati se portano qualche valore, anche con una sintassi non molto sexy.

    
posta Basile Starynkevitch 21.12.2011 - 22:37
fonte

2 risposte

4

Che cosa ha senso per te? Dopo tutto, è il tuo prodotto e puoi farcela come ti pare. La vera domanda è questa: ci sarà qualche ricompensa per il tuo lavoro? Ti ritroverai con due varianti da supportare e se introduci funzionalità potrebbero non essere compatibili con ogni stile (in un modo carino).

Se dipendesse da me, resterei fedele alla sintassi del lisp, ma è perché mi piace la sintassi. Per lo meno, chiederei alle persone che usano il tuo progetto quello che pensano come sarebbero quelli che sanno e sarebbero quelli più interessati dalla tua decisione (se stai lavorando sulla sintassi alternativa, è tempo di miglioramenti delle funzionalità ecc.)

    
risposta data 21.12.2011 - 22:55
fonte
1

L'apprendimento di una nuova sintassi non è un grosso problema. Tuttavia, per somiglianze sintattiche, ti associ strongmente con altre lingue in quel campo, anche se la tua semantica è diversa, avrai difficoltà a mostrare alle persone che non sono così simili. La sintassi C è l'unica sintassi che non ha questo problema, perché quando si confrontano, ad esempio, da C a Java, sono radicalmente diversi - chiunque abbia fatto più di un paio di linguaggi di sintassi C sa che è una sintassi popolare con poco significato semantico .

Tuttavia, con LISP, questa non è una buona cosa. Non perché la sintassi di LISP sia terribile, ma perché la programmazione in questo decennio implica il flipping tra strutture di dati come le pagine di un libro. Quando vedo list_first , la mia reazione non è "Grande, puoi fare liste collegate e sarà facile", è "E se avessi bisogno di un deque, una coda, uno stack, un array, una tabella hash, un albero di ricerca binario? Che cosa succede se desidero l'elemento secondo della mia lista? E se ho bisogno di inventare la mia struttura dati che necessita di un'implementazione molto specifica per prestazioni ragionevoli? sostenere l'espressività di cui ho bisogno ". Rispetto al C ++ o addirittura C # o Java (in misura minore) o ... dove posso semplicemente cambiare il nome della classe che sto usando e voilà, la nuova struttura dati, funziona con il mio vecchio codice generico.

Da giovane a cui non è mai stato insegnato "LISP è lento" o qualcosa del genere, sono decisamente allergico, perché i blocchi fondamentali sono una delle strutture dati più lente e meno utili, e non c'è motivo di in primo luogo, crea una lingua su una struttura di dati.

    
risposta data 21.12.2011 - 23:23
fonte

Leggi altre domande sui tag