2011-01-06 16 views

risposta

5

Per i principianti, python è un linguaggio compilato, fa solo la compilazione in fase di esecuzione. Detto questo, tutto ciò che devi fare per implementare eval in qualsiasi altro linguaggio compilato è essere in grado di eseguire il compilatore (e caricare dinamicamente il codice dell'oggetto) - puoi farlo in Python (e in una litania di altre lingue) facilmente perché il compilatore è parte integrante del runtime. Non c'è tecnicamente nulla che fermi un programma scritto in C dal richiamo del compilatore e caricando il risultato in fase di esecuzione (usando dlopen), non è un evento comune perché il runtime C non richiede un compilatore, quindi la maggior parte degli utenti non ne ha uno .

+3

Non solo, ma C è anche un linguaggio che è noto per essere intrinsecamente difficile da compilare, quindi invocare il compilatore per "valutare" qualcosa può potenzialmente costringere l'utente ad aspettare 5 minuti o peggio. Python imbroglia un po 'perché non si compila con il codice macchina ma su una macchina virtuale in modo che tu possa fare in modo che la macchina virtuale supporti cose complesse per rendere il linguaggio più facile da compilare. Lisp è facile da compilare per cominciare perché il codice sorgente è fondamentalmente già un albero sintattico astratto. Un altro linguaggio facile da compilare è Forth: l'editor originale ha compilato ogni riga di codice durante la digitazione. – slebetman

+3

@slebetman: in realtà ci sono sistemi che invocano il compilatore C, e sono molto veloci (alcune modalità di PYPY ne sono un esempio) - I compilatori C moderni sono molto molto veloci (non C++), e di fatto il componente che consuma più tempo del ciclo di build in C è spesso il linker (a seconda della piattaforma), e se puoi accorciarlo/eliminarlo, la dimensione dei frammenti di codice che di solito stai evitando di solito non causa ritardi significativi (come punto di riferimento, 'icl' compila le righe di C per lavorare il codice più velocemente di quanto il compilatore python converte le linee di python in opcode di VM). –

5

Certamente, vari ambienti Lisp hanno avuto questa capacità per decenni. Un compilatore Lisp di solito funziona su una base per funzione, e il compilatore e il sistema di runtime lavorano insieme.

Quando viene richiesto a eval qualcosa, l'ambiente di runtime Lisp passerà l'elenco (una struttura di dati) al compilatore per la compilazione. Il compilatore può generare codice macchina (o forse un bytecode, a seconda del sistema), e quindi la funzione sarà richiamabile a livello macchina proprio come ogni altra funzione nel programma.

Problemi correlati