PL|どのフェーズ

皆さんが用いているCコンパイラ(gcc)は約50万行のプログラムです。字句解析、構文解析、意味解析、コード生成、最適化フェーズの中で一番多くの行数を食っているのは、どのフェーズだと思いますか。(そう思う理由も書き添えてください。)

結論

GNUからgcc4.8.1バージョンをチェックアウトし、実際に見てみました。コードを読むのは不可能だったので、ファイル名による予測、それぞれのフェーズが実際どのような処理を行うかを理解した上での予測から、意味解析ではないかという結論に達しました。(*どの理由も無理矢理な解釈です。)

理由Ⅰ

理由としてはTreeとつくファイル名が大分多くファイルの容量(行数は計っていません)もある程度大きかったというのと、Go, Java, C, objc(Objective-C?)など、言語に関するフォルダがあったため、多数の言語の意味を解釈するのか?という感じがして、意味解析に重点が言っているのではないかと解釈したためです。

理由Ⅱ

また、かなり無理矢理な解釈ですが、論理的(勘)消去法でも意味解析になりました。理由としては字句解析、構文解析はファイル読み込みと考えれば意外に簡単かもしれないから、×。最適化コード生成もただ出力するだけと解釈すれば、簡単と考えられるので×。よって、意味解釈ではないか。

理由Ⅲ

また、意味解釈は変数宣言漏れがないかチェックしたり、引数チェックをしたりして、ファイルの中を何度も行き来する可能性が在るので複雑なアルゴリズムになる可能性がある。これらの事象から、意味解釈のコードが一番行数を食っていると私は考える。

その他、感想

GNU gcc

バイトコードに直すまでにこれだけの行程を経ているなど考えたこともなかったので、実際にコンパイルするまたはインタプリタする過程(フェーズ)を知って、一つの言語を作る大変さ、恐ろしさを改めて感じました。そして、gccのソースコードの量だけ見ても、1ファイル5000行もあったりして、改めてプロジェクトの規模に圧倒され、また基礎プロでC言語を勉強したときの知識では、追いつかないもの(書き方の知らないもの)があって、C言語はまだまだマスターできないなと感じました。

アップデート

開発ツール等のアップデートをいくつか怠っていたので、バージョンは常に気にするようにしようと思います。また最近、東京招致, iOS7, Mavericks, 景気回復など良い意味での変化が起こる年な気がするので、提出するWebページも近いうちに最新版にアップデートしたいと思います。

Python
それから、Pythonでのコーディングということで、夏休みにライブラリの関係上C++で作ることになったために、Pythonをあまり使っていなかったので、良い機会になりそうです。それから、Pythonに関する書籍が少ないのと相談する人がいなかったので、ちょうど良いコミュニティができてうれしいです。

トップページへ戻る