¿Por qué GCC cambió de Bison a un analizador de descenso recursivo para C ++ y C?

10

¿Hubo un cambio de idioma que lo requirió o alguna razón práctica por la cual Bison ya no era apropiado u óptimo?

Vi en Wikipedia que cambiaron, refiriéndose a las notas de lanzamiento de GCC 3.4 y GCC 4.1 .

Estas notas de la versión indican:

Un analizador C ++ de descenso recursivo escrito a mano ha reemplazado el analizador C ++ derivado de YACC de versiones anteriores de GCC. El nuevo analizador contiene una infraestructura muy mejorada necesaria para un mejor análisis de los códigos fuente de C ++, manejo de extensiones y separación limpia (cuando sea posible) entre el análisis semántico adecuado y el análisis. El nuevo analizador corrige muchos errores que se encontraron en el antiguo analizador.

Y:

El antiguo analizador C y Objective-C basado en Bison ha sido reemplazado por un nuevo analizador de descenso recursivo escrito a mano más rápido

Lo que me gustaría saber es qué problemas reales tenían y por qué era imposible / poco práctico resolver usando Bison

neelsg
fuente
1
finalmente todos los analizadores se convertirán en homebrewn después de bastantes modificaciones cuando el generador de análisis no puede manejar los requisitos
monstruo de trinquete
1
Compartir su investigación ayuda a todos . Cuéntanos qué has probado y por qué no satisfizo tus necesidades. Esto demuestra que te has tomado el tiempo para intentar ayudarte a ti mismo, nos salva de reiterar respuestas obvias y, sobre todo, te ayuda a obtener una respuesta más específica y relevante. También vea Cómo preguntar
mosquito
1
@gnat amplié mi pregunta
neelsg
1
C ++ es un lenguaje extraordinariamente complejo para analizar en comparación con la mayoría de los otros lenguajes de programación. Mi instinto es un analizador de uso general que probablemente no podría admitir ciertas optimizaciones que podría utilizar un analizador casero.

Respuestas:

16

GCC cambió a análisis escrito a mano porque los mensajes de error son más significativos cuando se utilizan técnicas de descenso recursivo, como expliqué aquí .

Además, C ++ se está convirtiendo en un lenguaje tan complejo (sintácticamente) para analizar que no vale la pena usar generadores de analizadores sintácticos.

Por fin, la mayor parte del trabajo de un compilador real no se analiza, se optimiza. Los pases de optimización de gama media de GCC son mucho más complejos que su análisis.

(Por cierto, puede personalizar GCC, por ejemplo, con complementos o usando MELT , pero realmente no puede extender la sintaxis del idioma que está aceptando, excepto agregando atributos y pragmas).

Basile Starynkevitch
fuente