コンパイラについてのざっくりとした説明を行っている。
コンパイラは、ソースコードを機械が解釈できる形に翻訳する。
(ソースをソースに変換するものはトランスコンパイラとか呼ばれる。)
伝統的なコンパイラは、以下の3つにわけられる
- ソースコードを中間表現(IR)に変換するフロントエンド。
LLVMではclangなどのツールがある - 中間表現を最適化するオプティマイザ。
LLVMではopt - 中間表現から各ハードウェアが命令できる形にマシンコードを生成するバックエンド。
LLVMではllc
フロントエンドの流れ
C言語におけるフロントエンドのフェーズでは、中間表現に変換する前にソースコードに変更を加える。
外部ファイルを取り込んでソースコード内に展開をしている。字句解析のために、文字を単語に変換する。
変換された単語は、句読, キーワード, 識別子, リテラル, コメントに分類される。単語の流れが各言語で有効な文体で構成されているかを分析する。
分析が終わると、抽象構文木が出力される。
各ノードは、宣言, ステートメント, 型を表す。抽象構文木から中間表現に翻訳する。
オプティマイザ
オプティマイザはプログラムの実行中の振る舞いを把握して、効率的なものに改善する。
オプティマイザは中間表現を入力として受取り、改善した中間表現を出力する。