Una lingua del programma può essere sufficientemente malleabile per consentire ai programmi di estendere la semantica della lingua


15

Con riferimento a funzionalità in linguaggi come ruby ​​(e javascript), che consentono a un programmatore di estendere / sovrascrivere le classi in qualsiasi momento dopo averlo definito (comprese le classi come String), è teoricamente fattibile progettare un linguaggio che consenta ai programmi di estenderli in seguito la sua semantica.

es: Ruby non consente l'ereditarietà multipla, tuttavia posso estendere / sovrascrivere il comportamento linguistico predefinito per consentire un'implementazione dell'ereditarietà multipla.

Ci sono altre lingue che lo consentono? Questo è effettivamente un argomento di preoccupazione per i progettisti di lingue? Considerando la scelta dell'utilizzo di ruby ​​per la creazione di framework di rotaie per lo sviluppo di applicazioni Web, tali linguaggi possono essere molto potenti per consentire la progettazione di framework (o DSL) per un'ampia varietà di applicazioni.


2
Conti come estensioni semantiche le macro igieniche dello Scheme o le riflessioni di newspeak che consentono di implementare le eccezioni come codice di libreria? Che dire delle estensioni sintattiche come Perligata: Romana ?

Questa sembra essere una domanda che richiede un elenco di lingue anziché concetti. In attesa di modifiche che cambiano la direzione della domanda, voto virtualmente a chiudere come offtopico.
Raffaello

Se ricordo bene, anche Java otterrà funzionalità che consentono ai programmi di estendere il sistema dei tipi.
Raffaello

1
@Raphael, stai pensando a JSR 305 ? Le annotazioni Java sono state progettate (in parte) da Gilad Bracha che ha progettato Newspeak che ho collegato nella mia risposta di seguito e ha anche sostenuto i sistemi di tipo collegabile . JSR 305 fornisce annotazioni di sistema di tipo simili @Nullablee @NonNullutilizzate da controllori esterni come findbugs.
Mike Samuel,

Non è chiaro cosa si intende con "estendere la sua semantica". Se guardo Boost.Spirit , questo sta già attraversando la mia soglia personale di "estensione della semantica": gli operatori matematici del C ++ sono invece usati per descrivere una sintassi del linguaggio, che il compilatore trasforma quindi in un parser per detto linguaggio. So che questo non è ciò che si intende per "estendere la semantica del linguaggio" dai topi di laboratorio, ma penso che sia piuttosto impressionante.
DevSolar,

Risposte:


12

Convergere ha alcune funzionalità di meta-programmazione piuttosto impressionanti.

A un livello semplice, questo può essere visto come una struttura simile a una macro, sebbene sia più potente della maggior parte delle strutture macro esistenti poiché il codice arbitrario può essere eseguito in fase di compilazione. Usando questo, si può interagire con il compilatore e generare codice in modo facile e sicuro come ITrees (aka alberi di sintassi astratti).

che è un passo avanti rispetto alle macro igieniche di Scheme che consentono definizioni di macro referenzialmente trasparenti.

Meccanismi come i quasiliterali hanno consentito la costruzione e la destrutturazione di alberi di analisi in altre lingue, ma questi sono più spesso utilizzati per interagire con linguaggi specifici di dominio (DSL) anziché auto-modifica.


La riflessione di Newspeak consente di implementare le eccezioni come codice libreria.

7.6 Gestione delle eccezioni

Poiché Newspeak fornisce un accesso riflessivo (7.2) ai record di attivazione (3.6), la gestione delle eccezioni è puramente un problema di libreria. La piattaforma fornirà una libreria standard che supporta il lancio, la cattura e la ripresa delle eccezioni, proprio come in Smalltalk.


Perligata: Romana dimostra come una nuova sintassi può essere abbinata a una lingua.

Questo documento descrive un modulo Perl - Lingua :: Romana :: Perligata - che consente di scrivere programmi Perl in latino.


Probabilmente non semanticamente significativo, PyPy è un generatore di interpreti per linguaggi la cui semantica è specificata in un sottoinsieme altamente analizzabile staticamente di Python e lo usano per sperimentare nuovi costrutti linguistici in Python come aggiungere thunk alla lingua.


Anche di interesse potrebbe essere Ometa .

Questa tesi si concentra sulla sperimentazione in informatica. In particolare, mostrerò che nuovi linguaggi e costrutti di programmazione progettati specificamente per supportare la sperimentazione possono semplificare sostanzialmente il lavoro di ricercatori e programmatori.

Vi presento un lavoro che affronta due tipi molto diversi di sperimentazione. Il primo obiettivo è quello di aiutare i ricercatori del linguaggio di programmazione a sperimentare le proprie idee, rendendo più semplice la prototipazione di nuovi linguaggi di programmazione ed estensioni a linguaggi esistenti. L'altro indaga sulla sperimentazione come paradigma di programmazione, consentendo ai programmi stessi di sperimentare azioni e possibilità diverse - in altre parole, è un tentativo di fornire supporto linguistico per cosa succede se ...? o possibili ragionamenti sui mondi.

La tesi di Alex Warth dimostra come usare una Ometa per definire una semantica significativamente nuova (semantica transazionale attraverso i mondi) in JavaScript + Ometa.


8

"È teoricamente fattibile? *

Ovviamente è. Si può sempre scrivere un interprete in una lingua (L) per un'altra lingua (S) e scrivere programmi nella nuova lingua. Le persone spesso non lo fanno perché potrebbe essere necessario un sacco di lavoro per scrivere un tale interprete e ci sarà un successo prestazionale (un fattore di 10-100) per il livello aggiuntivo di interpretazione.

Entrambi i problemi hanno soluzioni. La linguaLpuò essere progettato con potenti funzionalità di metaprogrammazione in modo che sia facile implementare interpreti. Lingue come Scheme hanno questo.

Si può implementare un valutatore parziale in modo che l'interprete possa essere trasformato in un compilatore (daS per L). Quindi non si ottiene il colpo di prestazione perché il livello di interpretazione aggiuntivo viene eliminato.

Il nuovo linguaggio potrebbe comunque funzionare lentamente se il suo modello di runtime è significativamente diverso dal linguaggio di implementazione. In tal caso, i bit dell'interprete appariranno nel codice tradotto e continueranno a funzionare lentamente. Tuttavia, se la nuova lingua è per lo più uguale alla lingua originale, con solo alcune modifiche, allora dovrebbe essere possibile eliminare la maggior parte dei bit dell'interprete nel codice target mediante un'accurata regolazione della valutazione parziale. Quindi il colpo di performance sarà lì solo per le nuove funzionalità.

In effetti, questa è la tecnologia di "virtualizzazione" per i linguaggi di programmazione.


6

Storicamente, Lisp è stato il primo importante linguaggio di programmazione a introdurre strutture di metaprogrammazione. Il sistema macro di Lisp consente al programmatore di definire nuove strutture di controllo, nuovi modelli di dati, ecc. Ad esempio, il sistema di oggetti Lisp comune può essere definito interamente con macro sopra un linguaggio di base che non sa nulla di oggetti o classi. Il sistema macro consente anche la definizione di linguaggi specifici del dominio .

Ruby ha preso molta ispirazione da Lisp, inclusa la sua capacità di riflettività e metaprogrammazione. Molte lingue tipizzate dinamicamente hanno preso ispirazione da Lisp in questo senso. (La tipizzazione statica complica le cose, perché molte estensioni non si adattano al sistema di tipi originale.)


4

Non ancora menzionato nelle risposte / commenti:

il sondaggio:

Astratto: linguaggi estensibili sono linguaggi di programmazione che consentono a un utente di modificare o aggiungere sintassi e associare le nuove forme sintattiche alla semantica. A cosa servono queste lingue? Quali tipi di funzionalità sono facili da aggiungere e quali no? Sono abbastanza potenti da essere presi sul serio? In questo sondaggio cercheremo di rispondere a tali domande quando consideriamo i linguaggi estensibili procedurali, orientati agli oggetti, funzionali e generici. Siamo principalmente interessati al potere espressivo (regolare, senza contesto), avvertenze associate (antigieniche, ambiguità) e facilità d'uso dei vari meccanismi.

e

Riassunto: la capacità di estendere una lingua con nuove forme sintattiche è uno strumento potente. Un macro sistema sufficientemente flessibile consente ai programmatori di costruire da una base comune verso un linguaggio progettato appositamente per il loro dominio problematico. Tuttavia, le macro strutture integrate, capaci e allo stesso tempo abbastanza semplici da essere ampiamente utilizzate sono state finora limitate alla famiglia di lingue Lisp. In questo documento introduciamo una funzione macro, chiamata Java Syntactic Extender (JSE), con la potenza e la facilità d'uso superiori dei sistemi macro Lisp, ma per Java, un linguaggio con una sintassi algebrica più convenzionale. ...


1
Scrivi una o due frasi riassuntive per ogni riferimento; le raccolte pure link non sono quasi mai risposte "buone".
Raffaello
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.