¿Qué algoritmo debo usar para la generación de código para mi AST?

Ver generación de código en Andrew Appel’s
“Implementación del compilador de modelos en {ML, Java, C}”

Implementación moderna del compilador

El lenguaje utilizado como estudio de caso (Tiger) se mantiene muy simple para fines didácticos. Algo más simple que eso sería la generación de código limitada a, digamos, expresiones que solo involucran constantes enteras y operadores básicos. Ese último ejemplo a menudo se empleó como paradigmático para la asignación óptima de registros en presencia de operadores asociativos y conmutativos.

No existe tal cosa como “un ejemplo simple” independiente de los supuestos sobre la máquina de destino, que puede ser una máquina virtual. Para idear un esquema de generación de código, comience indicando un invariante útil y luego “pruebe” que el código generado lo mantendría. Por ejemplo, si asume una arquitectura (antigua) de un registro (acumulador), lo invariable podría ser que el código generado por el AST deja el valor del AST en el acumulador. En otra (antigua) máquina de registro cero, lo invariable sería que el valor está en la parte superior de la pila. El resto implica diseñar reglas de generación de código para cada nodo AST, mostrando, por inducción estructural en el árbol, que se mantiene la invariante. Entonces, algo como:

y: = (x + 1) * 3;

Puede traducirse así en una máquina de registro cero

EMPUJE x
EMPUJE 1
AÑADIR
EMPUJE 3
MUL
POP y