まえがき

 コンパイラは,何らかのプログラミング言語で書かれたプログラムを実際の計算機で実行できるように変換するソフトウェアである.計算機で実行されるほとんどすべてのプログラムは,コンパイラの世話になっており,そのコンパイラの良し悪しによって,プログラムの作り易さも影響されるし,ハードウェアの機能や性能が生かされる度合いも決まるから,コンパイラはオペレーティングシステムとともに,計算機の最も基本的で重要なソフトウェアである.
 本書は,コンパイラについて,入門的な解説から,コンパイラを構成する各要素技術の解説,さらに,より実行効率の良い目的コードを生成するための各種の最適化の技法までを網羅的に解説したものである.
 依然として個人の経験と技能に頼って作られることが多いソフトウェアの中で,コンパイラは最も理論的によく研究されているものであり,その研究の成果が実際のコンパイラの開発にも生かされてきている.その範囲は,字句解析や構文解析などの,コンパイラの前半の部分だけでなく,目的コードの最適化の部分まで及んでいる.
 コンパイラに関する理論のうち,字句解析や構文解析の基本的な理論については,1980頃までにほぼ確立したといってもよいが,最適化については,1950年代の最初のコンパイラから始まっていまだに研究が続けられている.
 そもそも,1957年に開発された最初のFORTRANコンパイラは最適化に最も努力をしたコンパイラの一つである.その理由は,それまでアセンブリ言語でプログラムを書いてきた人に使ってもらうためには,アセンブリ言語で書いたものに負けない性能が出せることを示す必要があったからである.FORTRANが世の中に認められた後は,それほど最適化を行わないコンパイラでも使われるようになったが,高性能を追及するマシンでは目的コードの最適化が常に最重要課題であった.計算機アーキテクチャにおいては,性能向上あるいはコストパーフォーマンス向上のために,VLIWマシン,RISCマシン,スーパスカラマシン,ベクトル計算機,並列計算機,と種々のものが開発されてきているが,それらのマシンの性能はコンパイラによる最適化がなければ本当には生かされないからである.
 最適化のための理論や技術は長年にわたって積み重ねられており,現在でも続いている.さらに進んだ研究をしたり,実際のコンパイラの開発に当たっては,そうした積み重ねの利用が不可欠である.アメリカでは,コンパイラの研究や開発が活発であり,そのための共通の基盤も必要であるとしてNCI(National Compiler Infrastrucure)というプロジェクトも進められている.
 一方,日本では,メーカでスーパコンピュータの開発をしている人などはコンパイラの研究の重要性を認識をしているが,学会全体としては,コンパイラに対する関心は高くない.このままでは,アーキテクチャとコンパイラという計算機の基本の分野でますます日本が遅れをとる心配がある.コンパイラの技術は広く深く発展してきており,そうした技術の蓄積がなければ優れたものを生み出すことが困難になってきているからである.
 本書は,今までコンパイラに関して積み重ねられてきた技術や最近研究されていることを出来るだけ1冊の本にまとめてみようとして書き始めたものであるが,こうした試みが,上記のような事情を改善するのに少しでも役立てば,望外の幸せである.しかし,それを完全に近い形に仕上げるのは,筆者のような人間一人ではほとんど不可能である.実際に抜けている部分も多いし,項目の説明にとどまっている部分もある(ただし,そのような部分では,出来るだけ参考文献を列挙するようにした).それらの不足部分や内容の不完全なものについては,読者の皆さんからのご指摘,ご教示を受けて,機会があれば追補改訂をしていきたいと思っている.
 本書の構成は以下のようになっている.
 第1部では,コンパイラの入門として,簡単な例を使って,コンパイラの基本的な概念を説明する.
 第2部では,コンパイラを構成する基本的な要素について説明する.3章から7章までで字句解析,構文解析,意味解析などプログラムの解析の方法を述べ,8,9章でプログラムの実行の方法や目的コードの生成法を述べる.具体的な解析のプログラムは,主としてJava言語またはC言語で書いてある.ここでは,従来のコンパイラの本にはあまり書かれていなかった,オブジェクト指向言語の目的コード,実行時コード生成,目的コード生成系の生成,などについても触れる.
 第3部では,10章で,行列の掛け算のプログラムを例として各種のマシンでの最適化の例を挙げ,11章で最適化の種類を挙げ,12章で最適化をするための種々のアルゴリズムを説明する.
 12章の1,2節では,最適化の基本的な技法として使われてきた,制御フローグラフを使ったデータの流れの解析とそれによる最適化の方法を述べる.
 12.3節では,比較的新しい技法として,静的単一代入形式(SSA形式)とそれを使った解析の方法を述べている.また,プログラム依存グラフの求め方にも触れる.
 12.4節では,命令レベルで並列実行出来るマシンのための,命令スケジュールの方法,特にループに対するソフトウェアパイプライニングの方法を述べる.
 12.5節では,レジスタを出来るだけ活用するためのレジスタ割付けの方法を述べる.
 12.6節では,ループの中で定義/使用されている配列要素の依存関係を解析するための方法を述べている.この依存関係は,ループに関する最適化変換の可能性を調べるのに必要となるものである.
 12.7節では,ループ変換の種類,その変換の効果,適用条件などを述べる.これらのループ変換は,ベクトル計算機,共有メモリ型並列計算機,キャッシュを含む記憶階層などを活用するための変換である.
 12.8節では,分散メモリ型並列計算機を対象として,配列を各要素計算機に分散する方法,各計算機への計算の分散と通信(配列データの転送)の方法などを述べる.
 最後に,あとがきとして,筆者自身のコンパイラに関するいままでの経験,およびその経験と本書の内容との関連について述べる.

 本書を書くに至るまでには,あとがきでも述べているように多くの方々に大変お世話になり,いろいろのことを教えていただいた.また,本書の執筆のための文献調査に当たっては,渡邊坦氏,藤波順久氏,中澤喜三郎氏,齋藤秀樹氏,田浦健次朗氏,など多くの方々に参考文献などについてのご教示をいただいた.秡川友宏君,糸賀裕弥君には原稿の一部をチェックしていただいた.ここに深く感謝する.
 最後に,本書の執筆を勧めて下さり,辛抱強く原稿をお待ちいただいた朝倉書店編集部の方々に深く感謝する.

 本書の目次と参考文献のリストは,筆者のホームページ(現在は//www.ulis.ac.jp/~nakata/)で見ることが出来る.今後出てくることが予想される本書の正誤表や参考文献の追加なども適宜そのページに載せていく予定である.なお,コンパイラの参考文献や関連情報を集めて紹介しているホームページ(//compilers.cs.uec.ac.jp)からも多くの有用な情報が得られると思われる.