son que prácticas programación programacion practicas las cuáles buenas compiler-construction programming-languages interpreter scripting-language

compiler-construction - que - cuáles son las buenas prácticas de programación



Sugerencias para escribir un lenguaje de programación? (10)

¿Qué consejos le puede dar a una persona que está buscando escribir un lenguaje de programación o script? No me preocupa cómo programar o diseñar un compilador, sino cómo desarrollarlo rápidamente usando herramientas y generadores de código.

La última vez que probé lo codifiqué en c ++ y los estados y la sintaxis tardaron casi tanto como escribir la lógica real. Sé que las siguientes herramientas ayudarían.

Estaba pensando que podía generar código c ++ y tener gcc compilar eso. Usando las herramientas anteriores, ¿cuánto tiempo estimaría que tomaría escribir un programa o lenguaje de script?

Las variaciones en esta pregunta se han hecho repetidamente, desde el aprendizaje de escribir un compilador . Aquí hay una lista incompleta de recursos SO sobre el tema.


Como una persona que conoce muy bien C ++, ¿qué consejos le puede dar a una persona que está buscando escribir un lenguaje de programación o script?

No lo hagas (¡o al menos piensa mucho antes de hacerlo!)

Si está intentando escribir un lenguaje de scripting para exponer los métodos / propiedades de algunos objetos escritos a la medida, sería mejor implementarlos en Java (o .NET / VB o todos esos simpáticos microsismos) y luego usar uno de los Lenguajes de Bean Scripting Framework como su lenguaje de scripting. (con lo que sea el equivalente en el extremo de Microsoft).


Cualquier pregunta sobre los compiladores tendrá una respuesta "ir a leer el libro de dragón, leer ese libro, este libro ..." en SO, independientemente de su contenido en unos minutos. Así que omito esa parte (como estaba diciendo en primer lugar). Leer estos libros para aprender a usar las herramientas que desea es tan útil como leer sobre el momento angular para aprender a andar en bicicleta.

Por lo tanto, para responder a lo que ha preguntado, sin cuestionar su intención, puedo recomendar fácilmente antlr y antlrworks para principiantes. Puedes generar tu AST fácilmente (creo que es la magia real) y depurar tu gramática visualmente. Genera una buena porción de un compilador funcional para usted.

Si conoce sus cosas y quiere tener más control o no le gusta antlr, puede usar el generador de analizador de limón y el compilador de máquina de estado de Ragel (tienen soporte especial para léx) juntos.

Si no necesita demasiado rendimiento y piensa generar código C / C ++, puede omitir las optimizaciones y dejar eso en el compilador C / C ++.

Si puede vivir con un tiempo de ejecución lento, puede acortar aún más su esfuerzo de desarrollo simplemente haciendo la interpretación, ya que a menudo es más fácil implementar funciones dinámicas de esta manera.


Dave Hanson, quien con Chris Fraser pasó 10 años creando uno de los compiladores más cuidadosamente diseñados del mundo , me dijo una vez que una de las cosas principales que aprendió de la experiencia no era intentar escribir un compilador en C o C ++.

Si desea desarrollar algo rápidamente, no genere código nativo; apunte a una máquina virtual existente como CLR, JVM o la máquina virtual Lua . Generar código usando maximal munch.

Otra buena opción si está escribiendo un intérprete es utilizar la administración de memoria y otras funciones de su lenguaje de programación subyacente. Parse a un AST y luego interpretar por árbol de la AST. Esto te permitirá despegar rápidamente. El rendimiento no es el mejor, pero es aceptable. (Utilizando esta técnica, una vez escribí un intérprete de PostScript en Modula 3. La primera implementación tardó una semana y, aunque posteriormente se sometió a un ajuste del rendimiento, principalmente en el Lexer, nunca tuvo que ser reemplazado).

Evite los generadores de analizadores LALR; utilice algo que le ahorre tiempo, como ANTLR o el generador de analizadores Elkhound GLR.


Estimar cuánto tiempo tomará algo así depende de muchos factores diferentes. Por ejemplo, un programador experimentado puede eliminar fácilmente un evaluador de expresiones aritméticas simple en un par de horas, con pruebas unitarias. Pero un programador principiante puede tener que aprender sobre técnicas de análisis sintáctico, descenso recursivo, representación abstracta de árboles de expresión, estrategias para caminar sobre árboles, etc. Esto fácilmente podría tomar semanas o más, solo para expresiones aritméticas.

Sin embargo, no dejes que eso te desanime. Mientras Jeff y Joel discutían con Eric Sink sobre un reciente podcast de , escribir un compilador es una excelente manera de aprender sobre muchos aspectos diferentes de la programación. He creado algunos compiladores y se encuentran entre mis proyectos de programación más memorables.

Algunos libros clásicos sobre la construcción de compiladores son:


Los libros clásicos sobre diseño de compiladores son

"Principios del diseño del compilador" por Alfred V. Aho y Jeffrey D. Ullman. Ha existido desde hace bastante tiempo y su caballo rosa y su dragón verde son bien conocidos por al menos un par de generaciones de estudiantes de CS.

También...

"Compiladores: Principios, técnicas y herramientas" por Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman

Si está interesado en escribir un compilador, estos son sin duda los mejores lugares para comenzar.


Si planeas escribir un intérprete o compilador, no lo hagas porque quieres escribir el próximo gran evento. Escríbalo porque ya tiene un propósito para eso o para aprender. Si haces esto, es posible que hayas escrito accidentalmente el siguiente gran acontecimiento.


Recomiendo encarecidamente buscar intérpretes de bytecode existentes. Si puede hacer que su idioma encaje en CIL (.NET) o Java (o incluso en otros como Python o Parrot), se ahorrará todo el esfuerzo de crear un entorno de soporte factible y podrá experimentar con conceptos de lenguaje.


Si no desea escribir un compilador para reducir su lenguaje a ensamblado / máquina, su próxima opción es escribir un compilador en una máquina virtual de lenguaje de código de bytes, como JVM, PVM o .NET.

Por supuesto, si ni siquiera quiere hacer eso, solo quiere crear su propio "lenguaje específico de dominio", lo construiría en Common Lisp. Las macros Lisp proporcionan un método bastante directo para crear la sintaxis que desee y analizarla en Lisp. Y no tiene que preocuparse por el código byte o el ensamblaje. Por supuesto, necesitas aprender Lisp.


Una buena herramienta que he usado para LALR es el sistema de análisis GOLD . Es gratis, la gramática es Backus-Naur Form, y hay varios ejemplos, incluidos los motores escritos en C #, VB.NET, Java y otros. Esto le permite escribir una gramática, compilar la gramática en un archivo y luego usar un motor para analizar la gramática.

Como se recomendó anteriormente, recomendaría orientar un código de bytes de algún tipo, como IL. Esto le permitirá aprovechar las enormes cantidades de marcos existentes.

Buena suerte


Creo que a todos les falta un punto muy importante.

¿POR QUÉ quieres escribir un compilador / intérprete / analizador, etc.?

Esto determinará seriamente mucho de lo que haces.

He trabajado en bastantes implementaciones de lenguaje, algunas bastante extrañas, algunas específicas del dominio, algunas simplemente secuencias de comandos a través de entornos de comandos (a menudo donde el entorno de comando se ocultaba más tarde). Cada uno requirió diferentes niveles de habilidad.

Muchos libros disponibles. Uno de los que más me encantó fue un libro de BYTE: Lenguajes Interpretados Roscados, apueste que está agotado.

Los motores de script simples se pueden diseñar con algunas reflexiones y un poco de prueba y error.

Pero apuesto a que ahora hay cursos en línea que le ahorrarán un montón de tiempo.