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
Respuesta
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.
* "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. –
@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. –
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). –
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.
recomiendo la lectura de los siguientes libros:
Esto le dará herramientas y técnicas para crear analizadores, lexers y compiladores para lenguajes personalizados.
- 1. ¿Cómo harías para escribir un lenguaje de programación simple?
- 2. Metodologías de programación de Excel
- 3. Creación de un lenguaje de programación simple en Python
- 4. ¿Cuáles son algunas metodologías de programación para desarrolladores en solitario?
- 5. Diseñar una asignación para la programación multiproceso
- 6. ¿Cómo diseñar un lenguaje de programación adaptado a los instrumentos financieros?
- 7. .NET lenguaje para programación simultánea
- 8. Siri lenguaje de programación
- 9. ¿Qué lenguaje de programación para cloud computing?
- 10. lenguaje de programación universal para Windows
- 11. UML para el lenguaje de programación C
- 12. tutoriales o introducciones para escribir un lenguaje de scripting simple?
- 13. Mejores prácticas para escribir un analizador de lenguaje de programación
- 14. ¿Qué características de lenguaje se requieren en un lenguaje de programación para hacer un compilador?
- 15. ¿Qt 4 es un lenguaje de programación?
- 16. Lenguaje de programación más nuevo que Prolog para programación lógica
- 17. ¿Qué significa para un lenguaje de programación estar "on rails"?
- 18. ¿Los comentarios son necesarios para un lenguaje de programación?
- 19. Plataforma para crear un lenguaje de programación visual
- 20. ¿Qué es un lenguaje de programación formal?
- 21. ¿XSLT es un lenguaje de programación funcional?
- 22. ¿Cómo crear un lenguaje de programación .Net?
- 23. Lenguaje de programación y compilador
- 24. Control de lenguaje de programación visual
- 25. simple c programación gui
- 26. Metodologías de prueba
- 27. Windows: ¿Qué lenguaje de programación?
- 28. GBA ROM Lenguaje de programación
- 29. Programación de principiante: consejos para diseñar una aplicación web
- 30. Lenguaje de script PHP o lenguaje de programación?
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. –
Y este http://stackoverflow.com/questions/1669/learning-to-write-a-compiler es la respuesta definitiva de SO sobre el tema. –
bien Lamento no haber visto que era un duplicado si solo se cierra como un duplicado o debería eliminar la pregunta? –