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.
- ¿Cuáles son algunas optimizaciones comunes que los clientes de GPS como Google Maps usan además de los algoritmos elementales de ruta más corta como la búsqueda A *?
- ¿Cuál es el mejor algoritmo de detección de colisión de vehículos?
- ¿Encontrar XOR de pares ordenados en una matriz que está incluso con O (n)?
- ¿Qué deben leer todos los libros como Embedded / System / Kernel Engineer y por qué? ¿Incluyendo estructura de datos y algoritmos?
- ¿Qué algoritmo usa Arrays.sort?
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