2010-07-20 7 views
8

Voy a intentar escribir un compilador para un lenguaje dinámico. Preferiblemente a alguna máquina virtual existente --- No (todavía) quiero tratar con la recolección de basura y la miríada de otras preocupaciones que una buena VM maneja para usted. ¿Qué máquinas virtuales sugieres?Escribir un compilador; que VM?

Estoy en Linux, así que no sé si .NET (a través de Mono) es una buena idea. He oído que Parrot es bueno para lenguajes dinámicos, pero no he oído hablar de cualquier uso de lenguaje que. ¿Debería inventar el mío? ¿LLVM incluso cuenta como una VM sobre la que debo compilar, o es tan difícil como straight x86?

Además, ¿qué pros y contras hay para las máquinas virtuales basadas en pila y las basadas en registros?

El soporte de herramientas y rendimiento sería importante. Voy a escribir el compilador en Haskell, por lo que una buena interfaz con eso es una ventaja.

+0

¿Qué hay de la "Máquina mítica" que el famoso Donald E. Knuth diseñó para explicar sus algoritmos? Todavía hay varios emuladores MIX alrededor. – Abel

Respuesta

9

JVM (Java) y CLR (.NET) parecen ser los dos objetivos más comunes para esto, ya que ambos manejan la mayoría de estos problemas para usted. Ambos proporcionan conjuntos de instrucciones bastante sencillos para trabajar.

El CLR tiene una ventaja: fue diseñado con el objetivo de admitir varios idiomas desde el principio, y es (IMO) un poco más fácil trabajar con él, especialmente si no va a escribir un idioma que se ajuste en el "molde" original de los lenguajes iniciales que apuntan a ese tiempo de ejecución. Mono funciona lo suficientemente bien como para no rehuir un objetivo de CLR por eso.

+0

Pero, ¿los lenguajes dinámicos, a la Python, tienen que usar soluciones malvadas para funcionar? .NET, después de todo, fue diseñado para C# ... Además, ¿cómo es el soporte de herramientas para lenguajes que no son de C? Quiero decir, estoy seguro de que habrá depuración de nivel de código de bytes, pero ¿qué tan fácil sería escribir herramientas de nivel superior? – pavpanchekha

+2

@pavpanchekha: El CLR no fue diseñado específicamente para C#, tenía en mente otros lenguajes (como VB.NET) desde el principio. Con el DLR, también es más agradable: vea IronPython, IronRuby, VB.NET, C# y todos los idiomas aquí: http://en.wikipedia.org/wiki/Microsoft_.NET_Languages ​​ –

+1

Esa es la razón principal por la que dije el CLR tiene algunas ventajas aquí: se diseñó con "lenguaje neutral" desde el día 1, donde la JVM se puede hacer de esta manera, se diseñó para Java desde el principio ... –

1

.NET tiene Dynamic Language Runtime, como lo menciona Reed Copsey. Pero ni siquiera conozco el CLR, mucho menos el DLR; no puedo decir nada sobre ninguno de los dos. El LLVM debería ser mejor que el simple x86, pero aún es de bajo nivel. Pero tampoco puedo decir mucho al respecto, solo unas pocas miradas.

Miré a Parrot, sin embargo. La idea en sí es bastante buena, y la implementación parece sólida. Si alguna vez hago un lenguaje dinámico, estoy bastante seguro de que se centrará en el loro. El PIR (representación intermedia del loro) es de muy alto nivel para una máquina virtual. Tienes azúcar sintáctica (operadores ariméticos, asignaciones, subrutinas y regresar de ellos es pan comido, ...), no te metas con los números exactos de registro, solo toma todos los que quieras y asignales cualquier número. ¡e incluso tienen variables nombradas!

Si tuviera que elegir, supongo que preferiría una máquina virtual basada en registros. La investigación indica que estos comercio bytecode tamaño para la velocidad de ejecución, que me parece bien. Además, las operaciones de pila demasiado complejas tienden a fundir mi cerebro cuando intento comprenderlas: las operaciones de registro se vuelven más naturales.

4

LLVM le ofrece un modelo de programación mucho mejor que el ensamblaje x86 directo. Sí, es de bajo nivel. Pero no tiene que preocuparse por registrar Schedulign u optimizar completamente su salida. Además, mientras escribes el front-end, puedes aprovechar su sistema de tipos para detectar los errores que podrías cometer.

Dicho esto, deberá desarrollar su propia capa de tiempo de ejecución para ocuparse de las partes "dinámicas" de su idioma. Solo por esa parte solo, podría tender a quedarme con CLR.

+0

* todavía * necesita preocuparse por completo optimizando tu salida. Y es cuestionable si la programación de registros es de alguna utilidad en x86. ¿Qué beneficios de rendimiento obtiene de sus 6 registros de "propósito general"? – Cheery

+0

El conjunto de instrucciones de LLVM expone una cantidad ilimitada de registros SSA. Como programador, no tendría que preocuparse por ajustar todas sus variables en la cantidad de registros que realmente ofrece una plataforma o preguntándose cuál es la mejor manera de distribuirlos en la pila. – Karmastan

+0

En LLVM, llegar a la representación de IR es solo el primer paso realizado por la interfaz del compilador. La mayoría de la optimización se realiza en ese IR en el back-end. Si escribe una herramienta para generar IR, puede aprovechar el optimizador de back-end existente para que no tenga que, por ejemplo, diseñar su sistema para realizar un movimiento de código invariante de bucle. – Karmastan

Cuestiones relacionadas