2009-07-30 20 views
5

En mi continuo esfuerzo por saciar mi sed insaciable de más conocimiento de programación, se me ocurrió la idea de intentar escribir un (al menos por ahora) lenguaje de programación simple que compila en bytecode. El problema es que no sé nada sobre el diseño del lenguaje. ¿Alguien tiene algún consejo sobre una metodología para construir un analizador sintáctico y cuáles son las características básicas que debe tener cada idioma? ¿Qué lectura recomendarías para el diseño del lenguaje? ¿Qué nivel de alto debería estar buscando? ¿No es realista esperar poder incluir una característica para permitir que uno ingrese bytecode de manera similar a gcc permitiendo el ensamblador en línea? ¿Al ver que codifico principalmente en C y Java, que sería mejor para la escritura del compilador?Metodologías para diseñar un lenguaje de programación simple

+0

Dupe of http://stackoverflow.com/questions/479013/requirements-for-compiler-design/479048 entre muchos otros. Además, está haciendo demasiadas preguntas, una a la vez es una buena regla. –

+1

Y este http://stackoverflow.com/questions/1669/learning-to-write-a-compiler es la respuesta definitiva de SO sobre el tema. –

+0

bien Lamento no haber visto que era un duplicado si solo se cierra como un duplicado o debería eliminar la pregunta? –

Respuesta

3

Hay tantas maneras ...

Se podría buscar a los idiomas pila adelante y hacia atrás. No es muy útil cuando se trata de diseñar otros idiomas, pero es algo que se puede hacer muy rápidamente.

Puede buscar en lenguajes funcionales. La mayoría de ellos se basan en algunos conceptos simples y tienen un análisis simple. Y, sin embargo, son muy poderosos.

Y, a continuación, los idiomas tradicionales. Ellos son los más difíciles. Tendrá que aprender sobre analizadores léxicos, analizadores sintácticos, gramáticas LALR, gramáticas LL, EBNF e idiomas regulares para pasar el análisis sintáctico.

La orientación de un bytecode no es solo una buena idea; de lo contrario, es una locura, y sobre todo inútil, en un ejercicio de aprendizaje.

Hazte un favor y busca libros y tutoriales sobre compiladores.

Cualquiera C o Java funcionarán. Es probable que Java tenga una ventaja, ya que la orientación a objetos es una buena opción para este tipo de tarea. Mi recomendación personal es Scala. Es un buen lenguaje para hacer este tipo de cosas, y le enseñará cosas interesantes sobre el diseño del lenguaje en el camino.

+0

* "Apuntar a un bytecode no es simplemente una buena idea" * A diferencia de para apuntar a una máquina real (p. ej.x86), escribir un intérprete u otra cosa? Sobre el tema, ¿escribir un compilador que se dirija incluso a una máquina virtual "ideal" (en comparación con una CPU donde se debe preocupar por la asignación de registros, etc.) tiende a ser significativamente más difícil que escribir un intérprete? Me imagino que uno podría hacer la compilación bastante fácil compilando en un árbol en lugar de una cadena de bytes planos, pero nunca lo había hecho antes, y me gustaría saber lo que otras personas tienen que decir al respecto. –

+0

@Joey En lugar de apuntar a una máquina real, de hecho. Incluso los compiladores que generan códigos de máquina a menudo generan una salida de bytecode intermedia (aunque los compiladores de gama alta pueden evitar hacerlo para obtener las máximas ganancias en velocidad de compilación y optimizaciones disponibles). Escribir un intérprete es más fácil, de hecho, particularmente si elige escribir un lenguaje dinámico. En cuanto a la compilación en un árbol, un árbol es la salida del análisis, por lo que es definitivamente más fácil, aunque no tanto. –

+0

Vaya, me confundí con tu frase (parecía que dijiste que el bytecode de orientación es insano e inútil, pero dijiste lo contrario). Además, estaba hablando más de las líneas de un árbol ajustado para la ejecución, distinto de la salida del analizador básico (aunque en configuraciones simples, podrían ser más o menos la misma estructura). –

1

Es posible que desee leer a book on compilers primero.

Para comprender realmente lo que está pasando, es probable que desee escribir el código en C

Java no sería una mala opción si quería escribir un lenguaje interpretado, como Jython. Pero ya que parece que usted quiere compilar a código de máquina, que podría ser más fácil en C.

1

recomiendo la lectura de los siguientes libros:

ANTLR

Language Design Patterns

Esto le dará herramientas y técnicas para crear analizadores, lexers y compiladores para lenguajes personalizados.

Cuestiones relacionadas