2012-08-01 20 views
5

Estoy tratando de crear algún tipo de herramienta lint para el C/AL programming language. Entonces, básicamente, necesito realizar una sintaxis y un análisis léxico del código fuente. He planeado escribir el analizador desde el principio, pero luego descubrí que hay muchas herramientas que ayudan a generar estos analizadores automáticamente.¿Quién es más rápido: PEG o GLR?

Necesito rendimiento, ya que ver 20 megabytes de código en una sola pieza es el escenario normal, y necesito que esa herramienta sea extensible mediante reglas personalizadas. Así que decidí ir con JavaScript.

Hasta ahora he encontrado dos generadores que puedo usar Jison y PEG.js.

¿Cuál de ellas me da más rendimiento de análisis? Tal vez no comparando bibliotecas, ¿pero algoritmos?

¿Cuál es mejor para mis necesidades (análisis de lenguaje de programación de propósito general)?

ACTUALIZACIÓN: he encontrado Q similares & Como:

Respuesta

7

En general se obtendría un rendimiento muy bueno análisis de un analizador sintáctico por desplazamiento y reducción como el que Jison implementa. Es un poco viejo, quizás, pero puede funcionar con requisitos de memoria muy ajustados y en tiempo lineal.

PEG produce un tipo diferente de analizador que es quizás más capaz, pero requeriría más memoria para producir el mismo resultado. Es decir. PEG requerirá una cantidad de memoria proporcional a la entrada, mientras que un analizador LALR lo hará en mucho menos espacio (algunas tablas y una pila pequeña).

+0

¡Gracias! ¿Y qué hay de la comparación de rendimiento? – shytikov

+0

Si las restricciones que se le aplicarán a su gramática desde un analizador LR como GLR o LALR (GLR solo usa un poco más de memoria y es un poco más lento), entonces es probable que LR sea un analizador más rápido. Sin embargo, el analizador tarda más en generar ya que necesita calcular sus tablas. Pero en el caso general, los analizadores LR son máquinas muy eficientes. – Dervall

+0

Nadie más que el tipo que usa el generador de analizadores sintácticos, se preocupa por cuánto tiempo tarda el generador del analizador en ejecutarse. Incluso a él no le importa mucho; los analizadores grandes se generan en segundos, al menos para los generadores de analizadores LALR y la mayoría de los otros que conozco. –

5

"Necesito rendimiento (para 20Mb) ... así que decidí Javascript". Estos son contradictorios

Los analizadores de descenso recursivo cuidadosamente codificados pueden ser bastante rápidos, pero debe escribir mucho código. En general, los analizadores LALR (1) (generados por Bison a partir de una gramática, etc.) son bastante rápidos y bastante fáciles de codificar. (Hay documentos técnicos que muestran cómo compilar los analizadores LALR directamente a código de máquina; estos analizadores son increíblemente rápidos, pero es necesario implementar una gran cantidad de maquinaria personalizada para compilar uno).

Si quieres un análisis de alto rendimiento con un mínimo de sudor, debes considerar LRStar. (Conozco y respeto mucho al autor, pero por lo demás no tengo nada que hacer). Esto produce analizadores LALR muy rápidos. Desventaja: tienes que hacer tu gramática LALR compatible. Tendrá que ampliar sus "reglas" de la misma manera que extender cualquier otro programa C: escribiendo el código C. Eso no parece mucho peor que escribir JavaScript en mi humilde opinión, pero las reglas probablemente se ejecutarán mucho más rápido y en la escala que está contemplando esto importará.

El análisis de GLR es necesariamente más lento que LALR porque tiene más contabilidad por hacer. Pero eso es solo un factor constante. Puede ser significativo (p. Ej., 100x) en comparación con un motor de alto rendimiento , como LRStar. Puede valer la pena, porque es mucho más fácil adaptar tu gramática a tu forma, y ​​una gramática menos intrincada probablemente hará que escribir reglas personalizadas sea más fácil.Si realmente tiene 1 archivo MSLOC, a estos analizadores les gustará tener una velocidad media en el mejor de los casos.

PEG básicamente es un retroceso. Tiene que probar cosas, y retroceder cuando no funcionan. Deben ser más lentos que los analizadores LALR al menos por la cantidad de retrocesos que realizan. También tienes el problema de configuración gramatical.

Lo que descubrirá, sin embargo, es que el análisis simplemente no es suficiente si desea hacer algo un poco sofisticado. En ese caso, no desea optimizar al analizar; desea optimizar en la infraestructura para el análisis de programas. Vea mi ensayo en Life After Parsing para otra alternativa.

+0

¡Gracias! Ya mencioné que quiero tener reglas personalizadas en 'lint', así que definitivamente necesito lenguaje de scripting y JavaScript (implementación de V8 node.js) parece ser más rápido que python, ruby ​​... – shytikov

+0

No creo que hayas entendido mi punto sobre "La vida después de analizar". Parece que ha arreglado su elección de un lenguaje de reglas en JavaScript, donde básicamente tiene cero infraestructura para sus tareas de análisis. De modo que tiene la ventaja de contar con un lenguaje ampliamente disponible para codificar sus reglas, y no admite el uso de esas reglas. Soy pesimista sobre tu éxito real, a menos que tus reglas sean básicamente triviales ... entonces, ¿cuál es el punto? –

+0

Estoy leyendo "La vida después de analizar". Es largo y estoy impaciente. Lo siento. Estoy mirando a JS debido al hecho de que hay algunas herramientas 'lint' con código fuente disponible que estaban escritas en JavaScript. Espero que me ayude Pero estás en lo correcto. La tarea es enorme ... – shytikov

1

Como he encontrado dos generadores, puedo usar Jison y PEG.js. ¿Cuál de ellos me da más rendimiento de análisis?

De acuerdo con el punto de referencia de JavaScript Analizador Bibliotecas He creado Parece que PEG.js es más rápido (al menos en Chrome/V8).

Se puede ejecutar en línea aquí: http://sap.github.io/chevrotain/performance/

Tenga en cuenta que este punto de referencia utiliza la gramática muy simple JSON para comparar el rendimiento de las bibliotecas de análisis no una gramática lenguaje de programación más grande y más compleja.

Cuestiones relacionadas