なんてシンプル! 新時代の オープンソース・コンパイラの全体像

第 1 部 新時代オープンソース・コンパイラ入門
第
1章
昔の教科書を暗記したままで大丈夫ですか?
シンプル
・
イズ・
ベスト
なんてシンプル! 新時代の
オープンソース・コンパイラの全体像
村井 和夫
広義のコンパイラ
hello.c
プリプロセッサ
GCC
コンパイラ本体
アセンブラ
cpp
cc1
リンカ
gas
hello.out
gld
実行可能ファイル
ソースコード
(Cプログラム)
hello.i
展開後の
Cプログラム
hello.s
アセンブリ言語
プログラム
hello.o
オブジェクト・
コード
リンカ・スクリプト
やライブラリなどを
読み込んでリンク処
理を行う
図 1 これだけは教科書を思い出しておこう…コンパイラ(広義)の基本構造
従来の GCC の例
教科書のおさらい…
従来のコンパイラの基本構造
まず,一般的なコンパイラの例として,オープン
ソースのコンパイラとして広く使われてきた従来の
GCC の構成について説明します(最近の GCC はコラ
ム 1 を参照).
広義のコンパイラ(GCC)の全体構成は,4 段階に分
けられます.具体的にはプリプロセッサ,コンパイラ
本体(狭義のコンパイラ)
,アセンブラ,リンカの 4 段階
です.図 1に従来の GCC の全体構成を示します.GCC
では次のように 4 段階に分けてコンパイルできます.
表 1 コンパイラの各段階ごとの処理内容
項目
一般名称
第 1 プリプロ
段階 セッサ
処理内容
コンパイル前にソースコードの処理を施す.
#include や #define などを処理する
ソースコードにコンパイル処理を施し,使
第 2 コンパイラ
用するプロセッサ用のアセンブリ言語に変
段階 本体
換する
第3
アセンブリ言語からオブジェクト・コード
アセンブラ
段階
(機械語)を生成する
第4
リンカ
段階
22
各々バラバラに生成されたオブジェクト・
コードやライブラリを一つのファイルに結
合して実行可能ファイルを生成する
第 1 段階:gcc -Ecpp のみ実行し結果を標準出力
に表示
第 2 段階:gcc -Sコ ンパイラ本体 cc1 まで実行し
て hello.s を作成
第 3 段階:gcc -cア セ ン ブ ラ gas ま で 実 行 し て
hello.o を作成
第 4 段階:gcc
リンカgldまで実行して hello.
out を作成
各段階で行う処理内容を表 1 に示します.最も重要
なコンパイラ本体は第 2 段階にあたります.
もうちょっと掘り下げてみる
● キモとなるコンパイラ本体の構造
第 2 段階のコンパイラ本体では,ソースコードにコ
ンパイル処理を施し,使用するプロセッサ用のアセン
ブリ言語に変換します.
コンパイラ本体の内部構造は,図 2 に示すとおり,
フロントエンド,最適化(Optimizer)とバックエンド
の 3 段階に分かれています.それぞれの処理内容は次
の通りです.
▶その 1…フロントエンド
フロントエンドでは図 3 に示すように,ソースコー
ドを読み込んで字句解析や構文解析を行って構文木を
2015 年 3 月号