I compilatori spesso scelgono le rappresentazioni intermedie (IR) che sono sia a pila che a registro infinito. Quali sono i vantaggi di questi alberi sovraespressi?Vantaggi dei bytecode basati su stack o di macchine a registro infinito
risposta
Gli alberi di espressione funzionano per le espressioni, ma non sono efficaci per la modellazione dell'intero programma. In particolare, una buona rappresentazione di un programma è in realtà un grafico (di operazioni e azioni) collegato da controlli e flussi di dati. Di solito le persone parlano di usare "tripli" che formano esattamente un grafico del genere.
Il codice macchina dello stack è facile da generare per il front end, ma più difficile per l'eventuale processo di allocazione del registro necessario per generare codice reale, perché ha un set di posizioni temporanee ("lo stack") che non hanno nulla da fare chiaramente con l'architettura di destinazione e rendere i flussi di dati scomodi da elaborare. ("quale codice usa il risultato di questo add?").
Le macchine di registro sono un po 'più difficili da generare codice per, ma tendono a preservare il flusso di dati utilizzando quei registri infiniti come fili di flusso di dati essenzialmente. Il flusso di dati e la capacità di allocarlo facilmente ai registri reali (c'è un'assegnazione di registro standard "mediante colorazione del grafico") rende relativamente facile generare un buon codice.
Se si decide di generare codice macchina virtuale direttamente da questi, si ottengono caratteristiche di prestazione diverse. In sostanza, le macchine stack tendono a ottenere impronte di codice più piccole. Le macchine a registro infinito tendono a ottenere una rapida esecuzione interpretativa. Google Dalvik è diverso dalla JVM proprio per questo motivo. (Forse non volevano essere denunciati da Sun/Oracle anche su formati di file di classe.)
Suggerisco il seguente documento: Virtual Machine Showdown: Stack Versus Registers. (PS: qualsiasi cosa con Anton Ertl come autore tende ad essere una lettura interessante).
Stavo postando la stessa identica risposta! : D BTW, direi anche che lo stack VM è più facile da avviare perché è più facile generare codice per loro ... –
Trovo deludente che la tua risposta paragoni Stack vs Register, mentre la domanda si interroga su Expression Trees vs Stack/Register . –
@romkyns: abbastanza giusto. Risposta riveduta. –
- 1. Macchine a stati basati su Coroutine
- 2. Gli array basati su stack sono possibili in C#?
- 3. Crittografia o lavaggio dei file di registro dei binari
- 4. Funzionamento dei motori di rendering 2D basati su Scansione?
- 5. Perché non riesco a leggere correttamente i valori del registro a 32 bit in HKCU su macchine a 64 bit?
- 6. In che modo le lingue/i runtime basati su JVM generano bytecode Java?
- 7. strtok su macchine a 64 bit
- 8. Esecuzione di bytecode Java su Android - Sun JVM su DalvikVM
- 9. Vantaggi di Parcelable su JSON
- 10. Giochi di grandi e/o open source basati su SlimDX
- 11. Archivi colonne: confronto dei database basati su colonne
- 12. Come creare report personalizzabili basati su modelli basati su Excel
- 13. Test dei grafici basati su matplotlib in Travis CI
- 14. Inserire il registro XMM nello stack
- 15. Chiarimenti su Bytecode e oggetti
- 16. Vantaggi di [HandleError] su Application_Error
- 17. Strumenti di costruzione basati su Python
- 18. Process.WaitForExit incoerente su diverse macchine
- 19. Test di regressione basati su Java
- 20. carico infinito su Firefox: il trasferimento dei dati da maps.googleapis.com
- 21. Vantaggi di MVVM su MVC
- 22. Vantaggi di Tesla su GeForce
- 23. Vantaggi dell'utilizzo di Enums su collezioni
- 24. Vantaggi/svantaggi dei puntatori automatici
- 25. Esclusione di record basati su join uno a molti SQL
- 26. Compilare a bytecode java (senza utilizzare Java)
- 27. Posso scrivere programmi di rete basati su Ethernet in C++?
- 28. Vantaggi di MySQLi su MySQL
- 29. Tabella vs layout basati su CSS per pagine web
- 30. Progettazione Bytecode?
Un vantaggio che posso pensare è che gli alberi di espressione sono un po 'più difficili da rappresentare come una serie di byte, mentre un programma VM basato su stack è molto naturalmente traducibile in un flusso di byte. –
@romkyns: per un compilatore IL, questo non ha importanza; tutto ciò che serve è un insieme di strutture dati collegate da indici/puntatori. –