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


13

Esiste un linguaggio di programmazione in cui è possibile impostare le proprie configurazioni di sintassi e convertire il codice in una lingua scelta?

Ad esempio, dovresti scegliere configurazioni specifiche come "i blocchi indicizzati di Python", [a,b,c]inizializzare le matrici, ^per esponenziazione e altre. Uno script lo convertirà nell'equivalente della lingua scelta.


1
Spero proprio di no. TIMTOWTDI è probabilmente pessimo, ma "inventare tutti i modi incompatibili che desideri" avrebbe sicuramente gli stessi lati negativi per centinaia di volte, e sarebbe ancora meno utile. Le DSL a volte ne valgono la pena, ma ridefinendo metà della sintassi (o peggio - scambiando due operatori, dando apparente compatibilità ma semantica diversa) solo per il diavolo ...

Lo chiedo perché in particolare sto programmando su JavaScript e mi piacerebbe davvero, davvero, poter impostare alcuni zuccheri di sintassi sul mio codice, ma il linguaggio non lo consente. Non è neppure possibile il sovraccarico dell'operatore.
Dokkat,

2
In una certa misura, ciò che stai descrivendo suona come macro preprocessore . Ora, se solo potessimo avere una funzione simile per il perl ...
yannis,

5
@Dokkat: aggiorna la domanda per indicare specificamente che si tratta di JavaScript. La domanda - come posta - è un incubo di manutenzione e supporto. Aggiungere una nuova sintassi a una lingua esistente (o usare un pre-processore per cambiare la tua lingua privata in una lingua pubblica) è davvero terribile. Tuttavia. Se si elencano problemi specifici relativi allo zucchero nella sintassi JavaScript, è possibile ottenere assistenza specifica .
S.Lott

3
Questi "linguaggi di programmazione personalizzati" sono normalmente chiamati "linguaggi specifici di dominio" o DSL.
Michael Dillon,

Risposte:


14

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

Lisp e i suoi parenti hanno potenti sistemi macro che ti consentono di eseguire trasformazioni arbitrarie sulla tua fonte, quindi in linea di principio puoi usare le macro (e le macro dei lettori, a livello di carattere) per fare praticamente tutte le estensioni che ti piacciono. Le lingue concatenative (e le lingue degli autori nelle aree correlate) hanno il potenziale per un simile potere di metaprogrammazione . Un buon esempio di ciò è Forth , in cui molti costrutti sintattici (come i commenti) possono essere definiti dall'utente. Per un esempio contemporaneo, non esoterico, c'è uno sforzo per fornire a Perl 6 un supporto migliore su Perl 5 anche per la sintassi definita dall'utente .


8
In qualche modo sapevo che Perl sarebbe stata (parte di) la risposta. Immagino che anche le macro del preprocessore C si adattino alla descrizione, in piccola parte.
yannis,

Anche il sovraccarico dell'operatore in C ++ può essere utile. L'esempio di ciao mondo mi viene in mente. cout << "Ciao";
Lord Tydus,

@LordTydus: In effetti, e anche solo il sovraccarico dell'operatore ti consente di fare un po 'di magia dietro un'interfaccia sana. Sarebbe bello se C ++ avesse capacità di sovraccarico più generali, diciamo, sovraccarico operator[]per argomenti multipli o introduzione di nuovi operatori come in Haskell; ma dubito che la commissione avrebbe superato i problemi di analisi.
Jon Purdy,

3

Sembra una programmazione concettuale .

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

XL presenta sintassi e semantica riconfigurabili dal programmatore. I plug-in del compilatore possono essere utilizzati per aggiungere nuove funzionalità alla lingua.

Lisp e Forth supportano anche la programmazione concettuale, 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.


Ad esempio, dovresti scegliere configurazioni specifiche come "Blocchi indicizzati di Python", "[a, b, c]" inizializza le matrici, "^" per esponenziazione e altre.

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


Questo è quello che stavo cercando.
Dokkat,

2

Non a mia conoscenza.

Non penso che sarebbe neanche una buona idea - uno dei principali vantaggi di una sintassi del linguaggio standard è che molte persone possono leggerlo, e se tutti inventassero la propria sintassi, nessuno sarebbe in grado di capire il codice di qualcun altro. .... quindi questo linguaggio potrebbe essere divertente per un hobbista ma non molto utile per qualcosa di pratico.

La cosa più vicina che esisterebbe probabilmente sarebbe Lisp, dove il sistema macro ti consente di scrivere i tuoi nuovi costrutti di linguaggio in modo molto flessibile. Normalmente continueresti a seguire la sintassi di Lisp, ma puoi ridefinire efficacemente tutto se lo desideri davvero.

Di conseguenza, Lisps tende ad essere particolarmente popolare per l'implementazione di DSL. Un bell'esempio è questo DSL di accesso ai dati in Clojure (Korma) che si occupa di tutto il codice del boilerplate richiesto per l'accesso al database.


2

Scala viene spesso utilizzato in questo modo per creare DSL, linguaggi specifici di dominio.

Soprattutto perché Scala non ha operatori e il metodo Scala che chiama la sintassi può essere abbreviato. Per esempio:

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

val ans = 5.add (7) tranne per il fatto che il metodo di addizione è in realtà chiamato "+", quindi dovresti scrivere:

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

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


Questo e spettacolare. Dò un'occhiata su scala.
Dokkat,

1

Non dire che dovresti usarlo in quanto è ancora per lo più sperimentale, ma un recente paradigma di programmazione recente è la programmazione orientata al linguaggio (LOP).

Il concetto di programmazione orientata al linguaggio adotta l'approccio per acquisire i requisiti nei termini dell'utente e quindi provare a creare un linguaggio di implementazione il più isomorfo possibile per le descrizioni dell'utente, in modo che la mappatura tra requisiti e implementazione sia il più diretta possibile.

Sergey Dmitriev lo spiega in modo più dettagliato .

Questa è l'ideologia, ma praticamente si riduce a sostenere il comportamento che stai chiedendo. Puoi:

  • Estendi una lingua esistente.
  • Componi lingue diverse.
  • Utilizzare 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 seguendo questo paradigma è il Meta Programming System (MPS) gratuito di JetBrains.

In realtà sta iniziando a essere utilizzato anche nel software commerciale, quindi forse sta iniziando a uscire dalla sua fase 'sperimentale':

  • Realaxy è un editor di ActionScript interamente basato su MPS. Utilizzando la potenza di LOP sono stati in grado di implementare, ad esempio, chiusure per AS3.
  • mbeddr C è un linguaggio C estensibile basato su MPS.

1

I linguaggi specifici del dominio sono abbastanza comunemente usati nella comunità 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 il linguaggio incorporato bilancia le parentesi graffe, e in pratica si rivela un requisito davvero non oneroso!

Un altro linguaggio che semplifica le DSL è Standard ML, che consente di accedere a token non elaborati dal tokenizer di sistema generico (dal punto precedente il punto in cui gli identificatori vengono convertiti in parole chiave). Ciò semplifica l'esecuzione di un'ampia gamma di DSL, a condizione che obbediscano ad alcune delle regole di sintassi di base di SML, in particolare in relazione a commenti, stringhe e limiti di token, ed è di fatto ampiamente utilizzato in alcune delle principali applicazioni di guida per il linguaggio (dimostratori di teoremi, ecc.)

Non tutte le lingue lo rendono così facile. In particolare, le lingue che analizzano automaticamente il contenuto di termini controventati (molti di loro!) Non possono farlo, quindi richiedono che il DSL sia creato da entrambi gli operatori prioritari, inserendo la sotto-lingua all'interno di una stringa, oppure mediante l'uso di un pre-processore che riscrive il DSL in qualcosa che può essere gestito nella lingua host.


0

AFAIU stai cercando lingue che possano aiutarti a scrivere il tuo DSL (Domain Specific Language). Ci sono molti buoni candidati. Personalmente consiglierei Ruby o Io, perché offrono 1) facile sovraccarico dell'operatore, 2) meta-programmazione e 3) meccanismi di fallback come quelli method_missingche è possibile utilizzare per creare la propria API. Ad esempio, dai un'occhiata a sqldsl , un DSL scritto in Ruby che genera SQL leggendo il codice Ruby.


0

In realtà non l'ho usato di per sé, ma se ricordo bene, TXL è specificamente progettato per la traduzione del codice sorgente. Pertanto, dovresti essere in grado di utilizzarlo per specificare come tradurre dalla tua lingua e / o estensioni di lingua a qualsiasi lingua reale di destinazione.

Sembra avere una grammatica disponibile per Javascript. Ma, non avendolo mai usato prima, non sono sicuro di come ti possa aiutare.


0

C'è un bel preprocessore là fuori chiamato PPWizard, abbastanza potente. Una volta appresa la sua sintassi, è possibile creare macro def per indirizzare lingue diverse, non che sia infallibile o divertente, ma è uno strumento utile.


qui alcuni link: CONTENUTI PPWIZARD (documenti ufficiali), PPWizard - EDM2 (un riferimento esterno). Lo strumento è potente, ma la sua documentazione non è facile da leggere (forse a causa della sua potenza).
Lupo,


0

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

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

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.