2010-03-05 14 views
6

Come si chiama un linguaggio di programmazione in grado di eseguire il proprio codice (passato come una stringa letterale)? L'impostazione nella mia mente è qualcosa di simile a questo (dimenticando per un attimo la digitazione di codice, risultati, ecc):Nome della classe dei linguaggi di programmazione che eseguono il proprio codice

string eight = "5+3" 
int result = run(eight) 

Dove run è parola chiave. È un linguaggio di programmazione riflessivo?

+1

Intendi dire interpretato? http://en.wikipedia.org/wiki/Interpreted_language – Pool

+1

In SQL lo chiamano "SQL Injection"; in C/C++ lo chiamano "exploit". –

+4

"ha una funzione eval" è un modo comune di riferirsi ad esso. – Javier

risposta

1

Penso che stiate parlando di Meta-circular evaluators. Il comando run è il eval nel eval-apply cycle, descritto nella Struttura e implementazione dei programmi per computer.

+1

Questo è fondamentalmente il termine che abbiamo usato nella mia classe di design della lingua dei laureati. LISP è un buon linguaggio per giocare con questo genere di cose. Prova a scrivere un semplice valutatore LISP usando LISP in ~ 150 linee. È divertente! : D –

1

Self-hosting possibilmente. So che il Lisp è un tale linguaggio e Wikipedia lo ha definito un compilatore self-hosting.

+0

AFAIK, lingua auto-ospitata significa che esiste un'implementazione scritta nella stessa lingua. – Javier

0

Sì, ho sempre pensato che questo fosse compreso da Reflection.

+0

Come ho capito, la riflessione riguarda un programma che è in grado di esaminare i propri costrutti, non di essere in grado di eseguire codice arbitrario. Ad esempio, sia C# che Java dispongono di funzioni di riflessione, ma nessuno dei due ha una parola chiave per l'esecuzione del codice fornito come stringa. – itowlson

+0

Dalla pagina di Wikipedia: "Valuta una stringa come se fosse un'istruzione di codice sorgente in fase di esecuzione" Questa non è l'unica cosa che la riflessione è, ma è un sottoinsieme di essa. –

+0

sì qualcosa come la citazione di Wikipedia. –

1

Homoiconicity è un concetto correlato, ma non penso che sia esattamente quello che stai cercando.

Nella programmazione di computer, homoiconicity è una proprietà di alcuni linguaggi di programmazione, in cui la rappresentazione primaria dei programmi è anche una struttura di dati in un tipo primitivo del linguaggio stesso, da homo significato stesso e icona significato rappresentazione. Ciò semplifica la metaprogrammazione rispetto a una lingua senza questa proprietà.

+0

Quello che cercavo evaliva il codice in un costrutto di stringa. Da quello che vedo, l'omoiconicità include un tipo 'code'. Ma sì, abbastanza vicino. –

2

La classe di lingue che chiedi è equivalente alle lingue "self-hosting". Una lingua auto-hosting è quella per cui esiste un'implementazione di compilatore o interprete nella stessa lingua.

Ecco una prova.

Ogni lingua di self-hosting è in grado di eseguire i propri programmi. Se si passa, ad esempio, il codice C a un programma C, quel programma può includere un compilatore (scritto in C) che compila ed esegue il codice. In questo modo un programma C esegue codice C arbitrario.

Supponiamo ora di avere una lingua X con tale proprietà che sia in grado di eseguire un codice arbitrario in quella lingua, il codice viene passato come una stringa. Quindi puoi creare un programma che accetta una stringa come input ed esegue il codice al suo interno. Questo sarà un interprete per il linguaggio X implementato in X. E questa è la definizione di un linguaggio di self-hosting.

Qui è ciò che questo interprete sarà simile:

execute ARGV[0] 

Quindi, abbiamo dimostrato che ogni lingua con la proprietà desiderata è self-hosting, e ogni lingua self-hosting ha questa proprietà. Ciò significa che la classe richiesta è uguale alla classe delle lingue di self-hosting.

+0

Ma cosa succede quando finisci le tartarughe? – SamB

3

Il meglio che riesci a trovare è esattamente quello che chiedi è "ha una funzione eval" (come menzionato da Javier nel suo commento alla tua domanda).

L'auto-hosting non è necessario né fa necessariamente quello che vuoi. Due esempi sono: C è un linguaggio auto-ospitato che non può eseguire il proprio codice in una stringa ma Tcl non è un linguaggio auto-ospitato in grado di eseguire il proprio codice fornito in una stringa.

  • Come nota laterale, la metà del tempo C viene eseguito in ambienti dove non c'è API per eseguire processi esterni. Quindi, mentre in alcuni ambienti è possibile configurare il sistema in modo che C possa eseguire il proprio compilatore e quindi eseguire il proprio codice in generale non è proprio ciò che si richiede.

  • Nota a margine. Se possiamo imbrogliare e utilizzare il percorso "Esegui compilatore esterno" per fare ciò, allora un linguaggio non ha bisogno di essere auto-hosting per fare quello che vuoi. Ha solo bisogno di una funzione exec per chiamare il proprio compilatore (che è spesso scritto in C).

Stessa cosa con la riflessione/Introspezione, avere la capacità di fare da soli introspect non significa che si può eseguire codice in una stringa. Due esempi di lingue che hanno Reflection ma non hanno un eval incorporato sono C# e Java.

  • Come nota a margine, una volta che si dispone di una funzione eval, di solito si può fare Riflessione/Introspezione anche se in modo maldestro.

L'autointerpretazione ha lo stesso problema con la sua definizione di self-hosting. Tcl è un linguaggio in cui la sua funzione eval non è scritta in se stessa, ma espone semplicemente il valutatore del codice Tcl implementato in C.

A prima vista, gli analizzatori di meta-circonferenza sembrano ciò che si desidera. È definito come auto-interpretativo in cui la funzione eval è costruita piuttosto che implementata nel linguaggio stesso. Ma guardando oltre noterai che è definito dal meccanismo utilizzato per ottenere la funzione piuttosto che dalla funzionalità stessa. Tcl è di nuovo un'eccezione dove non soddisfa tutte le definizioni di cosa siano i valutatori meta-circolari ma ha comunque una funzione eval (non applicabile, non necessario). Quindi mi sembra che un valutatore meta-circolare sia un'implementazione specifica della funzione "ha una funzione eval".

Quindi, vorrei semplicemente dire che qualsiasi linguaggio che "ha una funzione eval" può fare quello che stai chiedendo.

Problemi correlati