2008-12-02 21 views
19

La base de software en la que estoy desarrollando usa una cantidad significativa de yacc que no necesito tratar. 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.¿Todavía se usa Yacc en la industria?

Mi pregunta es ¿hay suficientes proyectos nuevos por ahí que todavía usan yacc para garantizar el tiempo que necesitaré para aprenderlo?

Editar: Dado que la respuesta es principalmente a favor de aprender Yacc, ¿hay un lenguaje similar que usted recomendaría sobre yacc?

Respuesta

30

Sí, estas herramientas valen la pena si alguna vez necesita crear o modificar 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 niños nuevos en la cuadra, pero el principio es el mismo: usted escribe una gramática declarativa en un formato que es más o menos en Backus-Naur Form (BNF) y yacc/bison/lo que sea que genere algún 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 forma efectiva.

editar: Dado su pregunta de seguimiento sobre otras herramientas, Yacc/Bison por supuesto son las mejores para los proyectos C/C++, ya que generan el 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

+0

Totalmente de acuerdo con Bill: los analizadores descendentes son parte fundamental del patrimonio de desarrollo que parece haberse olvidado. – stephbu

6

No conozco los nuevos proyectos que lo utilizan pero estoy involucrado en siete trabajos de mantenimiento diferentes que usan lex y yacc para procesar archivos de configuración.

No XML para mí, no-sir-ee :-).

Soluciones usando lex/yacc son un paso adelante respecto a los antiguos archivos de configuración de key=val líneas 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 hacer eso 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 de Java).

Eso es porque prefiero entregar el software a tiempo y con el presupuesto en lugar de ofrecer la mejor tecnología nueva de whiz-bang: mis clientes no pagan mi educación, quieren resultados antes que nada y yo soy experto en Lex/yacc y tiene todo el código de la plantilla para hacerlo rápidamente.

+4

Acepto que las gramáticas como las anteriores son mejores para los archivos de configuración, pero no por la razón que usted reclama. No tener tiempo para aprender es una razón horrible. Una mejor razón es que los archivos de configuración XML son, de hecho, feos, inflados y adecuados para ser procesados ​​por programas en lugar de personas. –

+4

No tiene nada que ver con no tener tiempo para aprender. Al igual que con todas las decisiones comerciales, hay un análisis de costo-beneficio: ¿por qué aprender una nueva forma de hacerlo más lento (para mí) cuando hay una manera perfectamente rápida? Dirijo un negocio, no una institución educativa. El tiempo libre se pasa mejor con la familia. – paxdiablo

2

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í, lo considero vale la pena aprender si se trabaja en C.

también considerar el aprendizaje antlr, u otros generadores de analizadores sintácticos más modernas.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.

3

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 cantidad de tiempo enorme para 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 sea lo suficientemente común que debería familiarizarse con esto, porque lo verá de nuevo algún día. Quién sabe: al familiarizarse con esto, tal vez haya agregado una herramienta útil a su caja de herramientas ...

Yacc es una de estas tecnologías: probablemente se encontrará con ella de nuevo, no es tan difícil, y la Los principios que aprenderá se aplican a toda la familia de constructores de analizadores sintácticos.

+0

Entiendo los dos primeros puntos que está haciendo (con respecto a la probabilidad de que el sw todavía esté cerca y tope con yacc) pero la compañía está tirando el producto actual y comenzando desde cero, así que realmente no se aplica a mí :) – hhafez

2

No sé acerca de yacc/bison específicamente, 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 más agradable que algunos analizadores "simples" (basados ​​en expresiones regulares). 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.

+0

since Mi próximo rol será Java. Echaré un vistazo a jlex/javacc – hhafez

+0

Vale * el tiempo invertido para elegir la herramienta que mejor se adapte al tipo de gramática que está utilizando para describir el idioma. CUP es LALR Antlr es LL * JavaCC es LL (k) Y algunos lexers y analizadores funcionan mejor o peor juntos. Fuimos con CUP + JLex, pero todo se reduce al idioma. – Draemon

2

No he tenido la oportunidad de compararlo con otros sistemas de análisis, pero definitivamente puedo recomendar ANTLR según mi propia experiencia y también con su gran base de usuarios activos.

Otro punto a favor para ANTLR es ANTLRWorks: The ANTLR GUI Development Environment que es de gran ayuda durante el desarrollo y la depuración de sus gramáticas. Todavía tengo que ver otro sistema de análisis compatible con un IDE de este tipo.

+0

ANTLR tiene en su mayoría la misma sintaxis que YACC pero también se usa junto con java. Los principios son lo mismo. – boutta

3

PEGs son el nuevo hotness, pero todavía hay un montón 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, no me preocuparía. Aprenderá yacc si y cuando lo necesita para hacer algo.

1

Estamos escribiendo un nuevo código yacc en mi empresa para el envío de productos. Sí, esto todavía se usa.

Cuestiones relacionadas