2009-03-21 16 views
7

He creado un compilador que produce un código intermedio. No tengo tiempo para escribir el backend para mi proyecto.Necesita un compilador de fondo

¿Hay algún software que pueda utilizar para evaluar el código intermedio producido? ¿Dónde podría descargar este software?

La salida se ve algo como esto:

t1 = 0.67596e-7 
    sum = t1 

    t1 = 2 
    t2 = 3 
    t3 = t2 + t1 
    i = t3 

L0: 
    t1 = sum 
    t2 = 20 
t3 = compare(t1 <= t2) 
    t4 = sum 
    t5 = 12 
t6 = compare(t4 ~= t5) 
t7 = t3 | t6 
    t8 = sum 
    t9 = 20 
t10 = compare(t8 > t9) 
t11 = t7 & t10 
if t11 true then goto L1 else goto L2 
L1: 
    t1 = 2 
    t2 = sum 
    t3 = t2 + t1 
    sum = t3 

    t1 = 1 
    t2 = i 
    t3 = t2 + t1 
    i = t3 
    goto L0 
L2: 

Gracias por leer.

+0

No es un duplicado exacto, pero muy cerca de http://stackoverflow.com/questions/446883/best-compiler-destination/ –

Respuesta

6

Su código emitido se ve bastante cerca de C - no tiene su compilador emitiendo C y usa un compilador de C como el backend - esa es la forma en que funcionó el compilador original de C++.

11

Eche un vistazo a llvm compiler infrastructure project. Se usa en muchos proyectos del mundo real. LLVM es una máquina virtual de bajo nivel, fácil de crear código y fácil de traducir a código nativo.

2

Por qué no apuntar a otro idioma de alto nivel como salida intermedia, por ejemplo, podría generar código C y usar cualquier compilador de C para compilarlo. Esto ha sido utilizado por varios idiomas de alto nivel en el pasado.

Otra opción de nivel ligeramente inferior sería generar código IL y usar el tiempo de ejecución .NET. Si el compilador está escrito en .NET, puede usar el espacio de nombres Reflection.Emit para generar un ensamblado .NET que luego se puede ejecutar en cualquier entorno .NET.

2

Puede tener mejor suerte al seleccionar una pila de compilador y usar el código intermedio admitido por esa pila. Por ejemplo, gcc usa RTL, registra el lenguaje de transferencia como un denominador común para todos los idiomas soportados por gcc. Sospecho que .net tiene algo similar que se usa para cosas como IronPython.

Si desea utilizar algo que suministre una máquina virtual para evaluar el código, la vm SPIM MIPS es compatible con la arquitectura Motorola 68000 y es realmente fácil de usar.

1

NekoVM está diseñado para aceptar un IL de alto nivel similar al suyo y luego ejecutarlo. La sugerencia de Neil Butterworth de usar C también es una buena opción.

1

Si puede tolerar una dependencia en la JVM, entonces es bastante simple generar código de bytes usando ASM.

Si no puede, entonces gnu lightning se puede utilizar para la generación de código sobre la marcha (más pequeño y más simple que LLVM, pero sin las optimizaciones).

0

Dado que su código es C -ish, puede intentar C--. Es un C como lenguaje para compiladores backends. IIRC, es utilizado por uno de los principales compiladores de Haskell.

13

La generación de código es mi negocio :-)

Comentarios sobre algunas opciones:

  • CLR:

    • Pro: apoyo a la industria
    • contra: usted tiene que comprar en su sistema de tipos bastante completo; dependiendo de lo que quiere hacer con tipos, esto puede no importa
    • contra: Sólo plataforma Windows es realmente prime-time calidad
  • LLVM:

    • Pro: comunidad de usuarios entusiastas con el carismático líder
    • Pro: muchas mejoras en el rendimiento interesantes
    • Con: interfaz algo complejo
    • contra: la historia del orificio s en la ingeniería; como LLVM madura espera que los orificios de la ingeniería para ser conectado mediante la adición a la complejidad de la interfaz
  • C--

    • Pro: diana es un lenguaje escrito real, no una API; se puede inspeccionar fácilmente, depurar y editar el código de C--
    • Pro: el diseño es bastante maduro y razonablemente limpia
    • Pro: apoya la recolección de basura precisa
    • Pro: la mayoría de los usuarios informan de que es muy fácil de usar
    • contra: muy pequeño equipo de desarrollo
    • contra: a principios de 2009, apoya sólo tres plataformas de hardware (x86, PPC, ARM)
    • en contra: no se entrega con un recolector de basura
    • contra: futuro del proyecto es incierto
  • C como idioma de destino

    • Pro: parece fácil
    • contra: casi imposible obtener un rendimiento decente
    • contra: le vuelven loco en el largo plazo; pregunte a la larga lista de personas que han intentado compilar Haskell, ML, Modula-3, Scheme y más usando esta técnica. En algún momento, cada una de estas personas abandonó y construyó su propio generador de código nativo.

Resumen: nada excepto C es una opción razonable. Para la mejor combinación de flexibilidad, calidad y longevidad esperada, probablemente recomendaría LLVM. Pero su código de ejemplo está muy cerca de C--, por lo que puede ser una ventaja.

Descripción completa: Estoy afiliado al proyecto C--.

3

Recomiendo escupir el código Pascal y usar Free pascal.

Compilado de forma nativa, la compilación es increíblemente rápida y puede apuntar a una plétora de plataformas.

0

altamente recomendamos llvm, una infraestructura de plataforma cruzada, soporte de generación de código de máquina y muchos pases de optimización. El tutorial en llvm.org es muy simple.

Cuestiones relacionadas