ねぎ嫌い

始業前に学んだことを小出しに。最近はHacker Newsの人気記事をまとめてみたり。

2017-08-14 An Intro to Compilers

原文:Nicole Orchard

コンパイラについてのざっくりとした説明を行っている。

コンパイラは、ソースコードを機械が解釈できる形に翻訳する。
(ソースをソースに変換するものはトランスコンパイラとか呼ばれる。)

伝統的なコンパイラは、以下の3つにわけられる

  • ソースコードを中間表現(IR)に変換するフロントエンド
    LLVMではclangなどのツールがある
  • 中間表現を最適化するオプティマイザ
    LLVMではopt
  • 中間表現から各ハードウェアが命令できる形にマシンコードを生成するバックエンド
    LLVMではllc

フロントエンドの流れ

  1. C言語におけるフロントエンドのフェーズでは、中間表現に変換する前にソースコードに変更を加える。
    外部ファイルを取り込んでソースコード内に展開をしている。

  2. 字句解析のために、文字を単語に変換する。
    変換された単語は、句読, キーワード, 識別子, リテラル, コメントに分類される。

  3. 単語の流れが各言語で有効な文体で構成されているかを分析する。
    分析が終わると、抽象構文木が出力される。
    各ノードは、宣言, ステートメント, を表す。

  4. 抽象構文木を辿り、ステートメントが有効な意味を持つかを分析する。
    このフェーズで型チェックが行われる。

  5. 抽象構文木から中間表現に翻訳する。

オプティマイザ

オプティマイザはプログラムの実行中の振る舞いを把握して、効率的なものに改善する。
オプティマイザは中間表現を入力として受取り、改善した中間表現を出力する。

バックエンドの流れ

  1. 中間表現をハードウェアにマッピングする。
    この際、仮想レジスタ名前空間が使用される。
  2. 仮想レジスタから実際のレジスタに再マッピングする。
    ハードウェアの要件にあうようにマッピングされる。
  3. ハードウェアのパフォーマンス制約を反映するようにオペレーションの並び替えを行う。