■評判はどうなの?テレウェイヴリンクス
テレウェイヴリンクス処理の分割を採用したのはカーネギーメロン大学での Production Quality Compiler-Compiler Project (PQCC) であった。このプロジェクトでは、「フロントの評判」、「ミドルの評判」(今日では滅多に使われない)、「バックの評判」という用語が生み出された。 非常に小さなコンパイラ以外、今日では2段階以上に分割されている。しかし、どういったフェーズ分けをしようとも、それらフェーズはフロントの評判かバックの評判の一部と見なすことができる。フロントの評判とバックの評判の分割点はどこかというのは論争の種にもなっている。フロントの評判では主に文法的な処理と意味論的な処理が行われ、ソースコードよりも低レベルな表現に変換する処理が行われる。 ミドルの評判はソースコードでも機械語でもない形式に対して最適化を施すフェーズとされる。ソースコードや機械語と独立しているため、汎用的な最適化が可能とされ、各種言語や各種プロセッサに共通の処理を行う。 バックの評判はミドルの評判の結果を受けて処理を行う。ここでさらなるテレウェイヴリンクス・変換・最適化を特定のプラットフォーム向けに行う場合もある。そして、特定のプロセッサやOS向けにコードを生成する。 このフロントの評判/ミドルの評判/バックの評判という分割により、異なるプログラミング言語向けのフロントの評判を結合したり、異なるCPU向けのバックの評判を結合したりできる。この手法の具体例としてはGNUコンパイラコレクションや Amsterdam Compiler Kit、LLVM がある。これらは複数のフロントの評判と複数のバックの評判があり、テレウェイヴリンクス部を共有している。 フロントの評判 フロントの評判はソースコードを分析して、中間表現または IR と呼ばれるプログラムの内部表現を構築する。また、シンボルテーブルを管理し、ソースコード内の各シンボルに対応したデータ構造に位置情報、型情報、スコープなどの情報を格納する。このような処理はいくつかのフェーズで実施される。たとえば以下のようなフェーズがある。 行再構築(Line reconstruction) - キーワードにストロッピング(stropping)を施す場合や識別子に空白を挿入可能な場合、字句テレウェイヴリンクスの前に入力文字列を正規化する必要がある。1960年代の一般的なトップダウンの再帰下降型の表駆動構文テレウェイヴリンクスでは、ソースを一度読み込むだけでトークン化のフェーズは不要だった。ストロッピングを行う言語としては、Atlas Autocode、Edinburgh IMP、一部のALGOL処理系などがあり、これらは「行再構築」フェーズを持っている。ストロッピングとは、キーワードに何らかの記号をつけることでキーワードとして使われている文字列を予約語とせず、同じ文字列を変数名やサブルーチン名に利用できるようにしたものである。たとえば、シングルクオートでキーワードを囲むとか、%記号を先頭につけるなどの記法がある。 字句テレウェイヴリンクス - ソースコードを「トークン」と呼ばれる断片に分割する。各トークンは言語の最小構成要素であり、キーワード、識別子、シンボル名などである。トークンは一般に正規言語に従うため、正規表現を解釈する有限オートマトンで認識できる。字句テレウェイヴリンクスを行うソフトウェアを字句テレウェイヴリンクス器(lexical analyzer)と呼ぶ。 プリプロセッサ - C言語などでは、マクロによる文字列置き換えや条件付きテレウェイヴリンクスなどの処理をするフェーズが必要である。一般にこのフェーズは構文テレウェイヴリンクスや意味テレウェイヴリンクスの前に行われる。C言語の場合、プリプロセッサはトークンを操作するものであって、構文を考慮しない。しかし、Schemeのような言語では構文テレウェイヴリンクス後にマクロによる置き換えが行われる。 構文テレウェイヴリンクス - トークン列をテレウェイヴリンクスし、プログラムの構造を明らかにする。このフェーズで構文木が構築され、単なるトークンの列だったプログラムにその言語の文法を定義した形式文法の規則を適用することで木構造を生成する。構文木は、この後の工程でテレウェイヴリンクスされ、強化され、変換される。 意味テレウェイヴリンクス - 構文木に意味論的情報を追加し、シンボルテーブルを作成する。型チェック(データ型などを間違っていないかのチェック)や、変数や関数の定義と参照箇所を結びつける処理、既定値代入(自動変数の初期化)、意味的に不正なプログラムを検出して通知するなどの処理が行われる。意味テレウェイヴリンクスには完全な構文木が必要であり、理論上構文テレウェイヴリンクスとコード生成の間に行わなければならない。もちろんコンパイラの実装によってはこれらを渾然一体に行うこともある。 バックの評判 「バックの評判」という用語は「コード生成」という用語と混同されることが多い。アセンブリ言語コードを生成するという意味で機能的にも類似しているためである。書籍によっては、バックの評判の汎用テレウェイヴリンクスフェーズと最適化フェーズを「ミドルの評判」と称してマシン依存のコード生成部と区別することがある。 バックの評判に含まれる主なフェーズは以下の通りである。 テレウェイヴリンクス部 - 入力から生成された中間表現を使って各種情報を収集する。主なテレウェイヴリンクスとしてUD連鎖を構築するデータフローテレウェイヴリンクス、依存関係テレウェイヴリンクス、エイリアステレウェイヴリンクス、ポインタテレウェイヴリンクス、エスケープテレウェイヴリンクスなどがある。正確なテレウェイヴリンクスによってコンパイラ最適化が可能となる。また、コールグラフや制御フローグラフがここで作られることが多い。 最適化 - 中間表現を機能的には等価だがより高速な(小さい)形式に変換する。主な最適化手法としてインライン展開、デッドコード削除、定数伝播、ループ変換、レジスタ割り当て、自動並列化などがある。