2011-07-29 18 views
7

Estoy implementando un lenguaje funcional simple y lento con LLVM como back-end en Haskell. He leído dos libros escritos por Simon Peyton Jones ("La implementación de lenguajes de programación funcionales", así como "Implementación de lenguajes funcionales: el tutorial") y sobre la base de eso logré implementar el G-Machine compiler and interpreter.Traducción de la fuente G-Machine a LLVM IR

Ahora estoy atascado en el problema de generar el código IR LLVM de las instrucciones de G-Machine. El problema principal es que G-Machine es una máquina de apilar, mientras que LLVM IR es una máquina de registro. Por lo tanto, para traducir G-Machine a LLVM IR, tengo que mantener algún tipo de pila de tiempo de ejecución en LLVM IR (corríjanme si estoy equivocado). Estaba pensando en asignar nodos de pila subsecuentes en la pila LLVM usando sus instrucciones IR, pero luego tendría que crear esa pila en una lista enlazada, donde cada elemento de pila tiene un puntero al anterior y el primero tiene una puntero nulo. Sin embargo, este enfoque no es muy óptimo y en el caso de la operación "Push n" de G-Machine, tendría una complejidad de O (n) en lugar de O (1) preferido. Otra idea podría ser asignar bloques enteros de memoria en lugar de celdas individuales.

Mi pregunta es si ves una forma mejor/diferente de resolver mi problema.

+1

Cualquier razones para no implementar una máquina de STG en su lugar? No hace falta mencionar que ya hay un compilador de STG a LLVM al que puede consultar. –

+1

Bueno, la máquina G es agradable y simple. Y un clásico – augustss

Respuesta

9

No hagas listas enlazadas, eso es una locura. Usó bloques de memoria fija. Puede usar una pila de punteros y una pila que no sea de puntero, y con un puntero me refiero a algo que apunta al montón. Entonces es bastante fácil hacer recolección de basura ya que todas las raíces de GC están en la pila de punteros.

Mantenga algunas cosas en los registros LLVM: puntero del montón, puntero del límite del montón, los dos punteros de la pila.

Si tiene suerte, el optimizador de LLVM convertirá las operaciones de pila ineficientes en operaciones de registro eficientes.