Por que o GCC mudou de Bison para um analisador de descida recursiva para C ++ e C?

10

Houve uma mudança de idioma que exigia isso ou algum motivo prático pelo qual Bison não era mais apropriado ou ideal?

Vi na wikipedia que eles mudaram, referindo-se às notas de versão do GCC 3.4 e do GCC 4.1 .

Essas notas de versão afirmam:

Um analisador C ++ de descida recursiva manuscrita substituiu o analisador C ++ derivado do YACC de versões anteriores do GCC. O novo analisador contém uma infraestrutura muito melhorada necessária para uma melhor análise dos códigos-fonte C ++, manipulação de extensões e separação limpa (sempre que possível) entre análise semântica e análise adequadas. O novo analisador corrige muitos erros encontrados no analisador antigo.

E:

O antigo analisador C e Objective-C baseado em Bison foi substituído por um novo analisador de descida recursiva à mão, mais rápido e escrito à mão

O que eu gostaria de saber é que problemas reais eles estavam tendo e por que era impossível / impraticável resolver usando o Bison

neelsg
fonte
1
eventualmente todos os analisadores se tornarão homebrewn após modificações suficientes quando o gerador do analisador não puder lidar com os requisitos #
catraca freak
1
Compartilhar sua pesquisa ajuda a todos . Conte-nos o que você tentou e por que ele não atendeu às suas necessidades. Isso demonstra que você reservou um tempo para tentar ajudar a si mesmo, evita reiterar respostas óbvias e, acima de tudo, ajuda a obter uma resposta mais específica e relevante. Veja também How to Ask
gnat
1
@gnat I expandiu minha pergunta
neelsg
1
C ++ é uma linguagem extraordinariamente complexa para analisar em comparação com a maioria das outras linguagens de programação. Meu pressentimento é que um analisador de uso geral provavelmente não poderia suportar certas otimizações que um analisador fabricado em casa poderia usar.

Respostas:

16

O GCC mudou para a análise manuscrita porque as mensagens de erro são mais significativas ao usar técnicas de descida recursiva, como expliquei aqui .

Além disso, o C ++ está se tornando uma linguagem tão complexa (sintaticamente) para analisar que o uso de geradores de analisador não vale a pena.

Por fim, a maior parte do trabalho de um compilador real não está analisando, está otimizando. Os passes de otimização de extremidade intermediária do GCC são muito mais complexos que sua análise.

(Você pode personalizar o GCC, por exemplo, com plug-ins ou usando o MELT , mas não pode realmente estender a sintaxe do idioma que está aceitando - exceto adicionando atributos e pragmas).

Basile Starynkevitch
fonte