Pourquoi GCC est-il passé de Bison à un analyseur de descente récursif pour C ++ et C?


10

Y avait-il un changement de langue qui l'exigeait ou une raison pratique pour laquelle Bison n'était plus approprié ou optimal?

J'ai vu sur wikipedia qu'ils ont changé, se référant aux notes de publication de GCC 3.4 et GCC 4.1 .

Ces notes de version indiquent:

Un analyseur C ++ descendant récursif manuscrit a remplacé l'analyseur C ++ dérivé de YACC des versions précédentes de GCC. Le nouvel analyseur contient une infrastructure bien améliorée nécessaire pour une meilleure analyse des codes source C ++, la gestion des extensions et une séparation nette (si possible) entre l'analyse sémantique appropriée et l'analyse. Le nouvel analyseur corrige de nombreux bogues trouvés dans l'ancien analyseur.

Et:

L'ancien analyseur C basé sur Bison et Objective-C a été remplacé par un nouvel analyseur de descente récursive manuscrit plus rapide

Ce que j'aimerais savoir, c'est quels problèmes réels rencontraient-ils et pourquoi il était impossible / impossible de résoudre en utilisant Bison


1
finalement tous les analyseurs deviendront homebrewn après suffisamment de modifications lorsque le générateur d'analyseur ne peut pas gérer les exigences
ratchet freak

1
Partager vos recherches aide tout le monde . Dites-nous ce que vous avez essayé et pourquoi cela n'a pas répondu à vos besoins. Cela démontre que vous avez pris le temps d'essayer de vous aider, cela nous évite de réitérer des réponses évidentes, et surtout vous aide à obtenir une réponse plus spécifique et pertinente. Voir aussi Comment demander
moucher

1
@gnat J'ai développé ma question
neelsg

1
C ++ est un langage extraordinairement complexe à analyser par rapport à la plupart des autres langages de programmation. Mon intuition est qu'un analyseur généraliste ne pourrait probablement pas prendre en charge certaines optimisations qu'un analyseur maison pourrait utiliser.

Réponses:


16

GCC est passé à l'analyse manuscrite car les messages d'erreur sont plus significatifs lors de l'utilisation de techniques de descente récursive, comme je l'ai expliqué ici .

De plus, C ++ devient un langage (syntaxiquement) complexe pour analyser que l'utilisation de générateurs d'analyseurs ne vaut pas la peine.

Enfin, l'essentiel du travail d'un vrai compilateur n'est pas l'analyse, il est l'optimisation. Les passes d'optimisation de milieu de gamme GCC sont beaucoup plus complexes que son analyse.

(BTW vous pouvez personnaliser GCC par exemple avec des plugins ou en utilisant MELT , mais vous ne pouvez pas vraiment étendre la syntaxe du langage qu'il accepte - sauf en ajoutant des attributs et des pragmas).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.