web-dev-qa-db-ja.com

GCCがB ++からC ++およびCの再帰的降下パーサーに切り替えたのはなぜですか?

それを必要とする言語の変更、またはバイソンがもはや適切または最適ではなくなった実際的な理由はありましたか?

wikipedia で、それらが切り替わったことを確認しました GCC 3.4 および GCC 4.1 リリースノートを参照してください。

これらのリリースノートには次のように記載されています。

手書きの再帰降下C++パーサーは、以前のGCCリリースからのYACC派生のC++パーサーに取って代わりました。新しいパーサーには、C++ソースコードの適切な解析、拡張機能の処理、適切なセマンティクス分析と解析の間の(可能な場合は)明確な分離に必要な、大幅に改善されたインフラストラクチャが含まれています。新しいパーサーは、古いパーサーで見つかった多くのバグを修正します。

そして:

古いBisonベースのCおよびObjective-Cパーサーは、新しい、より高速な手書きの再帰下降パーサーに置き換えられました

私が知りたいのは、彼らが抱えていた実際の問題と、Bisonを使用して解決することが不可能/非実用的である理由です。

10
neelsg

ここで説明しました のように、再帰降下法を使用するとエラーメッセージがより意味を持つため、GCCは手書きの解析に切り替えました。

また、C++は、(構文的に)構文解析する複雑な言語になりつつあり、パーサージェネレーターを使用する価値はありません。

最後に、実際のコンパイラの作業の大部分は解析ではなく、最適化しています。 GCCミドルエンド最適化パスは、その解析よりもはるかに複雑です。

(ところで、プラグインや [〜#〜] melt [〜#〜] を使用してGCCをカスタマイズできますが、受け入れている言語の構文を実際に拡張することはできません-属性とプラグマを追加する以外は)。

16