2009-01-15 18 views
11

Tengo algunos idiomas que he estado creando como intérpretes. Cuando esté listo para dar "el siguiente paso", ¿qué opciones son mejores para los formatos compilados no nativos ... cuáles son los pros y los contras de cada uno?Destino del mejor compilador

He estado buscando compilar para CLR o LLVM, y contemplé C-midcompile varias veces, pero no estoy del todo seguro.

Unas características que espero ser capaz de puerto son los siguientes:

  1. REPL - Uno de los idiomas que estoy construyendo es compatible con la evaluación a nivel de bloque durante el tiempo de ejecución.
  2. Macros robustas: uno de los idiomas que estoy creando requiere la capacidad de filtrar el código por separado antes de la creación de tokens, y en el medio paso entre tokenizar y analizar.

Ok, no realmente "unos pocos", solo dos. Me gusta pensar que puedo portar cualquier otra característica que mis idiomas admitan a "cualquier cosa".

¿Cuáles son mis mejores opciones y sus ventajas y desventajas?

Respuesta

16

pro/contras:

  • CLR:

    • pro: ambiente CLR fácilmente disponible; un montón de cosas para enlazar a
    • con: bound to CLR (;-); que apuntan a algunos sistemas será difícil o imposible (. incrustado, ordenadores centrales, etc. CLR impl podrían ser menos maduros en sistemas que no es MS)
  • LLVM:

    • Pro: independiente de la EM.
    • con: la orientación de algunos sistemas puede implicar la transferencia de LLVM (?); interfaz con .Net, Java, etc. podría ser problemático (posiblemente necesita FFI)
  • C como idioma de destino:

    • Pro: casi todos los objetivos posibles; fácil generación de código
    • con: tendrá que implementar algunas cosas de VM como biblioteca de tiempo de ejecución (GC, dynload, compilación dyn, etc.); algunas cosas son difíciles de hacer en C (continuación, retroceso, seguimiento de pila, excepciones); algunas cosas son difíciles de hacer de manera eficiente y portátil en C (GC, tipos dinámicos, dependencia del diseño de la pila).
  • Java ByteCode como objetivo:

    • Pro: probablemente el mayor conjunto de posibles plataformas de destino (incluso los teléfonos móviles y otras cosas incorporados); muchas herramientas existentes alrededor; una fácil interconexión a las bibliotecas existentes
    • con: algunas cosas son difíciles de implementar o difícil de implementar de manera eficiente (tipos dinámicos, continuaciones, dando marcha atrás)

De todo lo anterior, creo que la orientación bytecode de Java sería probablemente ser lo mejor para ti

EDITAR: en realidad una respuesta a un comentario, pero 300chars no son suficientes.

JByteCode iffy - Estoy de acuerdo (ser un Smalltalker, JBytecode es demasiado limitado para mí).

VM-wise, creo que hay una gama relativamente amplia de rendimiento que puede obtener como JVM, comenzando con intérpretes de bytecode lentos hasta sofisticados VM de JITting de gama alta (IBM). Supongo que CLR VM se pondrá al día, ya que MS está robando e integrando todas las innovaciones de todos modos tarde o temprano, y las técnicas para acelerar la traducción dinámica se publican (lea los documentos de Self, por ejemplo). LLVM probablemente progresará un poco más lento, pero quién sabe. Con C, se beneficiará de mejores compiladores de forma gratuita, pero cosas como la retraducción dinámica, etc. son difíciles de implementar con C como objetivo. Mi propio sistema usa una mezcla de código precompilado y compilado dinámicamente (teniendo todo: un intérprete de bytecode lento, JITter y código C estático precompilado en un espacio de memoria).

+2

Java ByteCode es algo que siempre he sido dudoso. Llámalo mala experiencia pasada. ¿Alguno de ellos tiene ventajas con respecto a la potencia de su VM interna (que no sean solo llamadas a la biblioteca?) – user54650

+6

La generación de código C parece fácil hasta que lo haya estado haciendo durante 6 a 18 meses. Entonces, de repente las cosas se vuelven imposibles. –

3

LLVM parece prometedor. El equipo afirma tener mejores rendimientos de tiempo de ejecución en gcc con su backend en comparación con los nativos. La capacidad de compilación del AST es realmente interesante (eche un vistazo al tutorial). Puede compilar y optimizar en tiempo de ejecución, que es imprescindible para la dinámica. También puede ejecutarse como un intérprete puro.

Considero usar LLVM en un proyecto que implica la creación de un lenguaje similar a Tcl. Tcl es muy dinámico, así que no sé lo que esto implica en esta etapa, pero estoy seguro de que obtendré mejores resultados que el núcleo actual basado en códigos de bytes.

25

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: seria respaldo de Apple
    • Pro: muchas mejoras en el rendimiento interesantes
    • contra: un tanto comple x interfaz
    • Con: historial de agujeros 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: proyecto no tiene futuro
  • 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.

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

+2

Solo un poco Nota: no tiene que usar la API de LLVM, sino que puede orientar su lenguaje como ensamblador. – Frank

Cuestiones relacionadas