Esiste un linguaggio di programmazione personalizzabile che puoi usare per convertire in altri?

11

Esiste un linguaggio di programmazione in cui puoi impostare le tue configurazioni di sintassi e converte il codice in una lingua che scegli?

Ad esempio, scegli configurazioni specifiche come "I blocchi indicizzati di Python", [a,b,c] inizializza gli array, ^ per l'esponenziazione e altri. Uno script lo convertirà in equivalente della lingua scelta.

    
posta Dokkat 21.01.2012 - 17:55
fonte

11 risposte

13

Sì, ma probabilmente non nel modo in cui stai pensando.

Lisp ei suoi parenti hanno potenti sistemi macro che ti permettono di eseguire trasformazioni arbitrarie sulla tua fonte, quindi in linea di principio puoi usare macro (e macro di lettori, a livello di personaggio) per creare praticamente tutte le estensioni che ti piacciono. Le lingue concatenative (e le lingue degli autori nelle aree correlate) hanno il potenziale per simili metaprogramming power. Un buon esempio di questo è Forth , in cui molti costrutti sintattici (come i commenti) possono essere definiti dall'utente. Per un esempio contemporaneo, non esoterico, c'è uno sforzo per dare Perl 6 supporto migliorato su Perl 5 per sintassi definita dall'utente .

    
risposta data 21.01.2012 - 18:24
fonte
3

Sembra programmazione di concetti .

Non ho familiarità con questo, ma XL è un linguaggio progettato appositamente per questo.

XL features programmer-reconfigurable syntax and semantics. Compiler plug-ins can be used to add new features to the language.

Lisp e Forth supportano anche la programmazione di concetti, sebbene inferiore a XL. Suggerisco Lisp in quanto è molto pratico ed efficace. La cosa più importante è una sintassi chiara e flessibile, non una notazione, fornita da Lisp.

For instance, you would choose specific configurations like "Python's indexed blocks", "[a,b,c]" initializes arrays, "^" for exponentiation and others.

Potresti essere interessato a una lingua come Haskell che ha una sintassi molto flessibile ma uniforme.

    
risposta data 22.01.2012 - 02:18
fonte
2

Non a mia conoscenza.

Non penso che sarebbe una buona idea neanche - uno dei principali vantaggi di una sintassi di linguaggio standard è che molte persone possono leggerlo, e se tutti hanno inventato la propria sintassi, nessuno sarebbe in grado di capire nessuno codice di else ..... quindi questa lingua potrebbe essere divertente per un hobbista ma non molto utile per nulla di pratico.

La cosa più vicina che esiste sarebbe probabilmente Lisp, in cui il sistema macro ti consente di scrivere i tuoi nuovi costrutti di linguaggio in un modo molto flessibile. Normalmente rimarrai fedele alla sintassi Lisp, ma puoi davvero ridefinire tutto se lo desideri.

Di conseguenza, i Lisp tendono ad essere particolarmente popolari per l'implementazione dei DSL. Un bell'esempio è questo DSL di accesso ai dati in Clojure (Korma) che si occupa di tutto il codice standard necessario per l'accesso al database.

    
risposta data 22.01.2012 - 01:24
fonte
2

Scala è spesso usato in questo modo per creare DSL, lingue specifiche del dominio.

Principalmente questo perché Scala non ha operatori, e il metodo Scala che chiama sintassi può essere abbreviato. Ad esempio:

5 è un oggetto intero. Per calcolare 5 più 7 potresti scrivere

val ans = 5.add (7) con la differenza che il metodo di addizione è in realtà chiamato "+" per scrivere:

val ans = 5. + (7) ma in Scala, non è necessario includere "." nelle chiamate di metodo o nelle parentesi "()" attorno agli argomenti in modo da chiamare il metodo + sull'oggetto 5, dovresti scrivere

val ans = 5 + 7 che funziona perfettamente perché Scala non ha operatori che interferiscano con il tuo intelligente schema di denominazione dei metodi. Ora estendi l'idea alle tue classi e oggetti, incluso il fatto che puoi "sovrascrivere" metodi come + e anche creare i tuoi metodi chiamati > > > o ::! o @ * @ o solo semplici nomi di testo come fancify.

    
risposta data 22.01.2012 - 07:23
fonte
1

Non dicendo che dovresti usarlo poiché è ancora prevalentemente sperimentale, ma un interessante paradigma di programmazione recente è Programmazione orientata alla lingua (LOP).

The concept of Language Oriented Programming takes the approach to capture requirements in the user's terms, and then to try to create an implementation language as isomorphic as possible to the user's descriptions, so that the mapping between requirements and implementation is as direct as possible.

Sergey Dmitriev lo spiega in modo più dettagliato .

Questa è l'ideologia, ma in pratica si riduce che supporta il comportamento che stai chiedendo. Puoi:

  • Estendi una lingua esistente.
  • Scrivi diverse lingue.
  • Utilizza un "linguaggio di trasformazione" esistente per convertire le parole chiave appena definite in una lingua di base.

L'ambiente di programmazione più attivo che conosco di seguire questo paradigma è il sistema di programmazione Meta gratuito. (MPS) di JetBrains.

In realtà sta iniziando a essere utilizzato anche nei software commerciali, quindi forse sta iniziando a uscire dalla sua fase "sperimentale":

  • Realaxy è un editor di actionscript interamente costruito su MPS. Usando la potenza di LOP sono stati in grado di implementare per es. chiusure per AS3.
  • mbeddr C è un linguaggio C estensibile basato su MPS.
risposta data 22.01.2012 - 15:16
fonte
0

AFAIU sei alla ricerca di lingue che possano aiutarti a scrivere il tuo DSL (Domain Specific Language). Ci sono molti buoni candidati. Personalmente raccomanderei Ruby o Io, perché offrono 1) un facile sovraccarico dell'operatore, 2) meta-programmazione e 3) meccanismi di fallback come method_missing che puoi usare per creare la tua API. Ad esempio, dai un'occhiata a sqldsl , una DSL scritta in Ruby che genera SQL leggendo il codice Ruby.

    
risposta data 22.01.2012 - 02:01
fonte
0

In realtà non ho usato di per sé, ma se ricordo male, TXL è specificamente progettato per la traduzione di codice sorgente. Come tale dovresti essere in grado di usarlo per specificare come tradurre dalla tua lingua e / o le estensioni della lingua a qualsiasi lingua di destinazione reale.

Sembra che sia disponibile una grammatica per Javascript. Ma, non averlo usato prima, non sono sicuro di come ti possa aiutare.

    
risposta data 22.01.2012 - 05:49
fonte
0

C'è un bel preprocessore chiamato PPWizard, piuttosto potente. Una volta imparata la sintassi, è possibile creare macro def come target per lingue diverse, non che sia infallibile o divertente, ma è uno strumento utile.

    
risposta data 22.01.2012 - 14:18
fonte
0

I linguaggi specifici del dominio sono comunemente usati nella comunità di Tcl. Ad esempio, non è affatto raro vedere un programma Tcl che contiene sia C che SQL come DSL incorporati (tramite i pacchetti Critcl e Sqlite). L'unica restrizione su un DSL incorporato è che è molto meglio se la lingua incorporata equilibra le parentesi graffe, e in pratica risulta essere un requisito davvero non oneroso!

Un altro linguaggio che semplifica i DSL è lo standard ML, che consente di accedere ai token grezzi dal tokenizzatore di sistema generico (da prima del punto in cui gli identificatori vengono convertiti in parole chiave). Ciò semplifica l'utilizzo di un'ampia classe di DSL, a condizione che rispettino alcune delle regole di sintassi di base di SML, in particolare in relazione a commenti, stringhe e limiti di token - ed è in effetti utilizzato in un numero di le principali applicazioni di guida per la lingua (dimostratori di teoremi, ecc.)

Non tutte le lingue lo rendono così facile. In particolare, i linguaggi che analizzano automaticamente il contenuto dei termini rinforzati (molti molti di loro!) Non possono farlo, quindi richiedono che la DSL sia costruita da operatori che eseguono l'override, inserendo la sotto-lingua all'interno di una stringa, o con l'utilizzo di un pre-processore che riscrive la DSL in qualcosa che può essere gestito all'interno della lingua host.

    
risposta data 22.01.2012 - 17:30
fonte
0

Può essere ciò che stai cercando come compilatore di compilatori. Un compilatore di compilatori prende una definizione di lingua scritta in un linguaggio formale e crea un compilatore per questa lingua.

Dai un'occhiata al link

    
risposta data 22.01.2012 - 19:36
fonte
0

Un modo comune di personalizzare parzialmente un linguaggio di programmazione consiste nell'utilizzare un pre-processore macro. Ad esempio, è possibile eseguire "dokkat-lang" tramite il preprocessore C prima di inserire il risultato in un ambiente javascript per scaricarlo.

Quanto puoi fare dipende dalla raffinatezza del tuo preprocessore. Si noti che le prime versioni di C ++, Objective C e vari linguaggi sperimentali venivano eseguite preelaborando il codice sorgente prima di passare a una toolchain del compilatore C standard.

    
risposta data 22.01.2012 - 21:35
fonte

Leggi altre domande sui tag