Fiz um curso sobre compiladores em meus estudos de graduação, nos quais escrevemos um compilador que compila programas de origem em uma linguagem semelhante a Java de brinquedo a uma linguagem de montagem de brinquedos (para a qual tínhamos um intérprete). No projeto, fizemos algumas suposições sobre a máquina de destino intimamente relacionada aos executáveis nativos "reais", incluindo:
- uma pilha de tempo de execução, rastreada por um registro apontador de pilha dedicado ("SP")
- um heap para alocação dinâmica de objetos, rastreado por um registro dedicado de heap pointer ("HP")
- um registro de contador de programa dedicado ("PC")
- a máquina de destino possui 16 registros
- operações em dados (em oposição a, por exemplo, saltos) são operações de registro a registro
Quando chegamos à unidade usando a alocação de registros como uma otimização, fiquei me perguntando: qual é o número mínimo teórico de registros para uma máquina dessas? Você pode ver pelas nossas suposições que usamos cinco registradores (SP, HP, PC, mais dois para armazenamento como operações binárias) em nosso compilador. Embora otimizações como a alocação de registros certamente possam fazer uso de mais registros, existe uma maneira de sobreviver com menos, mantendo estruturas como a pilha e a pilha? Suponho que, com o endereçamento de registro (operações de registro para registro), precisamos de pelo menos dois registros, mas precisamos de mais de dois?