Tomé un curso sobre compiladores en mis estudios universitarios en el que escribimos un compilador que compila programas fuente en un lenguaje similar a Java de juguete a un lenguaje ensamblador de juguetes (para el cual teníamos un intérprete). En el proyecto hicimos algunas suposiciones sobre la máquina de destino estrechamente relacionada con los ejecutables nativos "reales", que incluyen:
- una pila en tiempo de ejecución, rastreada por un registro de puntero de pila dedicado ("SP")
- un montón para la asignación dinámica de objetos, seguido por un registro dedicado de puntero de montón ("HP")
- un registro de contador de programa dedicado ("PC")
- la máquina de destino tiene 16 registros
- Las operaciones sobre datos (en oposición a, por ejemplo, saltos) son operaciones de registro a registro
Cuando llegamos a la unidad sobre el uso de la asignación de registros como optimización, me pregunté: ¿Cuál es el número mínimo teórico de registros para una máquina de este tipo? Puede ver por nuestras suposiciones que utilizamos cinco registros (SP, HP, PC, más dos para usar como almacenamiento para operaciones binarias) en nuestro compilador. Si bien las optimizaciones como la asignación de registros sin duda pueden hacer uso de más registros, ¿hay alguna forma de sobrevivir con menos mientras se conservan estructuras como la pila y el montón? Supongo que con el direccionamiento de registros (operaciones de registro a registro) necesitamos al menos dos registros, pero ¿necesitamos más de dos?