L'equivalente di eval ed exec può esistere in un linguaggio compilato? Se sì, come sarebbero stati compilati (approssimativamente parlando)?Se l'esecuzione e la valutazione di Python sono state compilate?
risposta
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 .
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.
- 1. Perché le mie visualizzazioni MVC sono state compilate con PDB?
- 2. Come si può verificare quali opzioni sono state compilate con vim?
- 3. Determina se le impostazioni di privacy dell'utente sono state reimpostate
- 4. Debug di Python con estensioni compilate
- 5. Come posso verificare se sono già state lanciate delle eccezioni?
- 6. I nomi delle ruote sono indipendenti dalla piattaforma anche se il mio pacchetto include librerie compilate
- 7. valutazione Eager/ordine applicativo e la valutazione pigra/ordine normale
- 8. Quante righe sono state cancellate?
- 9. "Sono state apportate modifiche che non possono essere compilate". zero errori e Abilita e modifica e continua è verificato in vs2010
- 10. AngularJS modifica l'ordine di quali direttive sono compilate
- 11. sessioni PHP che sono già state iniziate
- 12. Valutazione ternaria Java (immediata se)
- 13. Valutazione degli attributi di classe e generatori
- 14. Web Api Sono state trovate più azioni
- 15. Le cartelle sono state saltate durante l'aggiornamento di SVN?
- 16. Un modo affidabile per determinare se le autorizzazioni ntfs sono state ereditate
- 17. Quanti byte sono le istruzioni compilate nell'assembly x86?
- 18. JavaScript State State Machine
- 19. Le applicazioni di diffusione impazziscono se le funzioni nel file sono state riordinate
- 20. Web mobile: rilevamento di quando le immagini sono state disabilitate
- 21. Scopri quali funzioni sono state allineate
- 22. GHC Valutazione parziale e compilazione separata
- 23. DbContext di Entity Framework salva le modifiche se non sono state apportate modifiche?
- 24. Come rilevare se sono state concesse le autorizzazioni di microfono in cromo
- 25. Differenza tra la valutazione e l'esecuzione dei termini di Gradle
- 26. django: django.core.exceptions.AppRegistryNotReady: le app non sono ancora state caricate
- 27. python se condizione e "e"
- 28. Perché le espressioni regolari non compilate e utilizzate più volte sono molto più lente in Python 3?
- 29. C/C++ più efficiente se valutazione dell'istruzione
- 30. Rileva quando le mappe di Android v2 sono state caricate
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
@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). –