Ho seguito un corso sui compilatori nei miei studi universitari in cui abbiamo scritto un compilatore che compila i programmi sorgente in un linguaggio simile a Java giocattolo in un linguaggio di assemblaggio giocattolo (per il quale avevamo un interprete). Nel progetto abbiamo formulato alcune ipotesi sulla macchina target strettamente correlate a eseguibili nativi "reali", tra cui:
- uno stack di runtime, seguito da un registro puntatore dello stack dedicato ("SP")
- un heap per l'allocazione dinamica degli oggetti, monitorato da un registro del puntatore heap ("HP") dedicato
- un registro contatore programmi dedicato ("PC")
- la macchina target ha 16 registri
- le operazioni sui dati (al contrario, ad esempio, i salti) sono operazioni da registro a registro
Quando siamo arrivati all'unità utilizzando l'allocazione dei registri come ottimizzazione, mi sono chiesto: qual è il numero minimo teorico di registri per tale macchina? Dai nostri presupposti si può vedere che nel nostro compilatore sono stati utilizzati cinque registri (SP, HP, PC, più due da utilizzare come memoria per operazioni binarie). Mentre le ottimizzazioni come l'allocazione dei registri possono certamente fare uso di più registri, c'è un modo per cavarsela con meno mantenendo le strutture come stack e heap? Suppongo che con l'indirizzamento dei registri (operazioni da registro a registro) siano necessari almeno due registri, ma ne abbiamo bisogno più di due?