parsing - stanford - the anatomy of a large-scale hypertextual web search engine español
¿Todavía se usa Yacc en la industria? (8)
No sé específicamente sobre yacc / bison, pero he usado antlr, cup, jlex y javacc. Pensé que solo tendrían importancia académica, pero resultó que necesitábamos un lenguaje específico de dominio, y esto nos dio una solución mucho mejor que algunos analizadores "simples" (basados en expresiones regex). Sin embargo, el mantenimiento puede ser un problema en muchos entornos, ya que la mayoría de los programadores actualmente no tendrán experiencia con las herramientas de análisis.
La base de software en la que estoy desarrollando usa una cantidad significativa de yacc con la que no tengo que lidiar. Algunas veces creo que sería útil para comprender algunos problemas que encuentro, pero la mayoría de las veces puedo salirse con la suya con mi completa ignorancia de yacc.
Mi pregunta es si hay suficientes proyectos nuevos que todavía usen yacc para garantizar el tiempo que necesitaré para aprenderlo.
Editar: Dado que la respuesta es principalmente a favor de aprender Yacc, ¿hay algún lenguaje similar que recomendarías sobre yacc?
No he tenido la oportunidad de compararlo con otros sistemas de análisis, pero definitivamente puedo recomendar ANTLR en función de mi propia experiencia y también con su amplia y activa base de usuarios.
Otro punto a favor de ANTLR es ANTLRWorks: El entorno de desarrollo GUI de ANTLR, que es de gran ayuda al desarrollar y depurar sus gramáticas. Todavía tengo que ver otro sistema de análisis compatible con un IDE de este tipo.
Sí, vale la pena aprender estas herramientas si alguna vez necesitas crear o modificar un código que analiza una gramática.
Durante muchos años, la herramienta de facto para generar código para analizar una gramática era yacc, o su primo GNU, bisonte.
Últimamente he escuchado que hay un par de chicos nuevos en la cuadra, pero el principio es el mismo: escribes una gramática declarativa en un formato que es más o menos en Backus-Naur Form ( BNF ) y yacc / bison / whatever genera un código para usted que sería extremadamente tedioso escribir a mano.
Además, los principios detrás de las gramáticas pueden ser muy útiles para aprender, incluso si no necesita trabajar en dicho código directamente. No he trabajado mucho con analizadores desde que hice un curso de diseño de compiladores en la universidad, pero comprender las pilas de tiempo de ejecución, los analizadores sintácticos anticipados, la evaluación de expresiones y muchas otras cosas relacionadas me ha ayudado muchísimo a escribir y depurar mi código de manera efectiva.
editar: Dada tu pregunta de seguimiento sobre otras herramientas, Yacc / Bison por supuesto son las mejores para proyectos C / C ++, ya que generan código C. Hay herramientas similares para otros idiomas. No todas las gramáticas son equivalentes, y algunos generadores de analizadores solo pueden asimilar gramáticas de cierta complejidad. Por lo tanto, es posible que necesite encontrar una herramienta que pueda analizar su gramática. Ver http://en.wikipedia.org/wiki/Comparison_of_parser_generators
Trabajo en proyectos que usan Yacc. No es un código nuevo, pero si fueran nuevos, seguirían usando Yacc o un pariente cercano (Bison, Byacc, ...).
Sí, considero que vale la pena aprender si trabajas en C.
También considere aprender ANTLR u otros generadores de analizadores más modernos. Pero el conocimiento de Yacc te servirá de mucho; también te ayudará a aprender otras herramientas similares, ya que gran parte de la teoría básica es similar.
Una regla general: el código dura mucho tiempo, por lo que las tecnologías utilizadas en ese código también duran mucho tiempo. Tomaría una enorme cantidad de tiempo reemplazar la base de código que menciona (tomó 15 años construirla ...), lo que a su vez implica que seguirá existiendo en 5, 10 o más años. (¡Incluso hay una posibilidad de que alguien que lea esta respuesta termine trabajando en ello!)
Otra regla de oro: si una tecnología de propósito general es lo suficientemente común como para haberla encontrado ya, es probable que se familiarice con ella, porque la verá nuevamente algún día. Quién sabe: al familiarizarse con él, tal vez haya agregado una herramienta útil a su caja de herramientas ...
Yacc es una de estas tecnologías: probablemente te encuentres con ella de nuevo, no es tan difícil, y los principios que aprenderás se aplican a toda la familia de constructores de analizadores sintácticos.
Los PEG son el nuevo hotness, pero todavía hay una tonelada de proyectos que usan yacc o herramientas más modernas que yacc. Frunciría el ceño ante un nuevo proyecto que eligió usar yacc, pero para los proyectos existentes, la migración a una herramienta más moderna puede no tener sentido. Esto hace que tener una familiaridad con Yacc sea una habilidad útil.
Si no está familiarizado con el tema de los generadores de analizadores, le recomiendo que aprenda acerca de uno, cualquiera. Muchos de los conceptos son portátiles entre ellos. Además, es una herramienta útil para tener en el cinturón: una vez que conoces uno, entenderás cómo a menudo pueden ser superiores en comparación con los analizadores pesados escritos a mano de regex. Si ya te sientes cómodo con el tema de los analizadores sintácticos, no me preocuparía. Aprenderá yacc si y cuando lo necesita para hacer algo.
Estamos escribiendo un nuevo código yacc en mi empresa para enviar productos. Sí, esto todavía se usa.
No sé si hay nuevos proyectos que lo utilicen, pero estoy involucrado en siete trabajos de mantenimiento diferentes que usan lex y yacc para procesar archivos de configuración.
Sin XML para mí, no-sir-ee :-).
Las soluciones que usan lex / yacc son un paso adelante de los viejos archivos de configuración de key=val
líneas key=val
, ya que permiten mejores estructuras jerárquicas, como:
server = "mercury" {
ip = "172.3.5.13"
gateway = "172.3.5.1"
}
server = "venus" {
ip = "172.3.5.21"
gateway = "172.3.5.1"
}
Y, sí, sé que puede hacerlo con XML, pero estas son principalmente aplicaciones heredadas escritas en C y, para ser honesto, probablemente también usaría lex / yacc para trabajos nuevos (que no sean Java).
Eso es porque prefiero entregar software a tiempo y con presupuesto en lugar de ofrecer la mejor tecnología nueva de whiz-bang: mis clientes no pagarán mi educación, quieren resultados antes que nada y yo ya soy experto en lex / yacc y tengo todo el código de la plantilla para hacerlo rápidamente.