13

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

+0

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. –

+0

@romkyns: per un compilatore IL, questo non ha importanza; tutto ciò che serve è un insieme di strutture dati collegate da indici/puntatori. –

risposta

17

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).

+0

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 ... –

+1

Trovo deludente che la tua risposta paragoni Stack vs Register, mentre la domanda si interroga su Expression Trees vs Stack/Register . –

+0

@romkyns: abbastanza giusto. Risposta riveduta. –

Problemi correlati