2009-08-22 20 views
5

por favor necesito algunos recursos para comenzar (soy un estudiante de cs)¿Cuál es el mejor lenguaje de programación para escribir analizadores y compiladores?

+1

Dupe of http://stackoverflow.com/questions/1669/learning-to-write-a-compiler entre muchos, muchos otros –

+0

Si se trata de una solicitud abierta de recursos, Neil tiene razón. Si está pidiendo comparar y contrastar, entonces bordea "subjetivo y argumentativo" – dmckee

+0

Vea [what-is-the-best-language-to-write-a-compiler-in] (http://stackoverflow.com/ questions/809710/what-is-the-best-language-to-write-a-compiler-in) – nawfal

Respuesta

9

La respuesta puede ser muy subjetiva aquí. Pero recomendaría usar ANTLR si desea escribir un analizador. Actualmente ANTLR admite C, C#, ActionScript, JavaScript y objetivos de Java. Desde mi experiencia, la versión de Java es realmente estable de usar y se ha utilizado en muchos proyectos de código abierto de gran alcance: Drools y Hibernate.

2

Lisp/Scheme fue lo que se nos encargó con el uso de nuevo en la universidad.

Se prestaron bastante bien a la tarea.

Dan

2

Mientras que una vez tuve un libro de texto titulado 'aplicación compilador moderno en Java' Creo que los profesionales siguen utilizando C. Aparte de demostrar que su lengua puede compilarse a sí mismo.

6

¿Tiene que estar escrito en un lenguaje de programación? ¿O puede usar Flex y Bison?

+1

Estaba a punto de sugerir Flex y Bison también. :-) –

+4

Los generadores de analizadores no eliminan la necesidad de un lenguaje de programación. Generan un analizador en un idioma particular. El lenguaje tradicional Flex/Bison (LEX/YACC) es C. – Brannon

+0

@ Branon +1 para su comentario; todavía necesitas un lenguaje de programación. Sin embargo, me gustaría añadir que Flex/Bison o Lex/Yacc son bastante obsoletos. Si usó algo como Coco/R y va a Lex/Yacc, se encontrará desesperado por características, entre las que destacan lookaheads mayores de uno. – Imagist

0

¿Desea escribir un analizador para un lenguaje de propósito general? En este caso, se recomienda claramente la escritura (y el arranque) en el idioma de destino. Deberías comer tu propia comida para perros.

+1

Yo diría que "recomendado en muchos casos", no "claramente recomendado". El "lenguaje de propósito general" es un nombre inapropiado, ya que no hay ningún lenguaje apropiado para * todas * tareas. No escribiría una aplicación web en C y no escribiría un sistema operativo en Python. No es que no puedas hacer ninguna de estas cosas; es simplemente que no sería apropiado hacerlo. Si acepta esta lógica, entonces tiene sentido que uno escriba un lenguaje de propósito general que no sea apropiado para el análisis sintáctico y, por lo tanto, no debería usarse para analizarse a sí mismo. – Imagist

+1

He aquí un buen ejemplo: el intérprete JavaScript * completo * del proyecto STEPS es solo 170 líneas de código fuente OMeta, y una persona tardó una tarde en escribir. En el intérprete JavaScript de Narcissus, el analizador * solo * tiene más de 1000 líneas de JavaScript, con otras 1000 líneas para el visitante AST. Entonces, usar JavaScript para implementar JavaScript es 10 veces más detallado que usar OMeta. –

+0

Pero eliminas una gran cantidad de errores, si realmente usas tu analizador/compilador. Y realmente lo usa al implementarlo en este idioma. – Mnementh

1

Si implementa un compilador desde cero, la mayoría de los lenguajes de programación están a la altura de la tarea. (Incluso sé de compiladores/analizadores escritos en Fortran IV y COBOL, aunque no recomendaría intentarlo!)

Pero si el lenguaje que intentas implementar tiene incluso una gramática no trivial, lo harías es mejor usar un generador lexer y/o un generador de analizador para implementar el front-end. Obtendrás un analizador mucho más rápido y confiable.

Por lo tanto, sobre esa base, los lenguajes de programación adecuados para los que un generador de analizador decente está disponible. Hay una página en Wikipedia que compara una gran cantidad de generadores de analizadores sintácticos. ¡No me di cuenta de que había tantos!

1

Si su objetivo es aprender las técnicas detrás de analizadores sintácticos (y tokenizadores), tal vez es mejor escribir uno usted mismo desde cero. Puede hacer esto en la mayoría de los lenguajes de programación, para que pueda elegir uno con el que se sienta cómodo.

Hace un tiempo, escribí una serie de publicaciones en el blog que muestran lo fácil que es escribir un analizador para un lenguaje de programación ficticio similar al BASIC, en C#. No quiero enviar correo no deseado aquí, así que no proporcionaré un enlace directo, pero si visitas el blog (mira mi perfil) y vas al final, puedes encontrar un enlace "Escribir un analizador" en "mis publicaciones "-sección.

3

Querrá ver los generadores de analizadores sintácticos. Si eres un estudiante de CS, probablemente quieras echarle un vistazo al Libro del Dragón: http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools.

Probablemente sería más fácil construir un analizador utilizando C# o Java, ya que no tendrá que preocuparse por cosas como la gestión de memoria, etc. y puede centrarse en la gramática.

Un buen generador de analizadores C# es GPPG: http://plas.fit.qut.edu.au/gppg/.

+0

¿Alguien puede explicar por qué esto ha sido degradado? El Dragon Book es un excelente recurso, y C#/java pasa a seguir la palabra de la pregunta. Aunque creo que la pregunta en sí es estúpida. – gimpf

4

Los analizadores y compiladores son dos problemas separados. Por ejemplo, podría escribir un compilador en C, pero nunca escribiría un analizador en C (usaría un generador de analizador).Para analizadores muy simples en los que la velocidad no es una prioridad alta, podría codificar manualmente el analizador en Perl o Python, que tienen buenas funciones de manipulación de texto. Pero para algo más allá de un analizador muy básico, usaría algún tipo de herramientas de generación de analizadores. Los más comúnmente utilizados son ANTLR, Coco/R y Lex/Yacc y la implementación de GNU Flex/Bison. Mi preferencia personal es Coco/R, pero ANTLR parece ser más popular en estos días.

Si está escribiendo un lenguaje de programación de propósito general, es posible que desee considerar escribirlo en sí mismo. Hay muchos beneficios en esto, incluida la portabilidad (las personas solo tienen que portar la primera versión del lenguaje) y la demostración de capacidades (el análisis es un problema difícil, por lo que si se puede hacer en su idioma, eso es un testimonio de su idioma). Si se interpreta su idioma, puede que esto no sea apropiado por motivos de rendimiento.

Cuestiones relacionadas