x64 UEFI 対応 OS 自作入門 ~実機で動作する OS を作ってみよう~
  • まえがき
  • 第1章:準備
  • 第2章:32 ビット整数式の x64 JIT コンパイラを試作する
    • 2.1 コンパイラを自作する理由
    • 2.2 全体の処理の流れ
    • 2.3 コーディングの方針
    • 2.4 字句解析
    • 2.5 構文解析
    • 2.6 意味解析
    • 2.7 中間コード(WebAssembly)生成
    • 2.8 x64 コード生成
    • 2.9 デバッグとテストコード
    • 2.10 改善を検討すべき点
    • 2.11 参考文献・資料
  • 第3章:クロス開発環境を作る(1)
  • 第4章:UEFI アプリを自作開発環境でビルドする
    • 4.1 UEFI
      • 4.1.1 初めての UEFI アプリ
      • 4.1.2 GPT と MBR
      • 4.1.3 UEFI セットアップ画面
      • 4.1.4 FreeType の利用
      • 4.1.5 UEFI セキュアブート
    • 4.2 まとめ
    • 4.3 参考文献・資料
  • 第5章:クロス開発環境を作る(2)
  • 第6章:シングルタスク OS をデバッグ可能にする
  • 第7章:対応するデバイスを増やす
  • 第8章:マルチタスク/マルチコア対応
  • 第9章:インストーラを作る
  • 第10章:開発環境を移植する
  • 第11章:TCP/IP・印刷機能を作る
  • 第12章:GitHub サポート機能を作る
  • 第13章:日本語入力機能を作る
  • 第14章:ハイパーバイザを作る
  • あとがき
  • 索引
GitBook提供
このページ内
  • 2.2.1 データに着目したコンパイラの処理の流れ
  • 2.2.2 実際のコンパイラの処理の流れ
  • 2.2.2.1 ソースコードをコンパイルする通常の処理の流れ
  • 2.2.2.2 ソースコードをコンパイルせず、コンパイラに内蔵されたテスト用の WebAssembly 生成処理から処理を開始する場合
  • 2.2.3 その他のソースコード・ファイルについて
  1. 第2章:32 ビット整数式の x64 JIT コンパイラを試作する

2.2 全体の処理の流れ

前へ2.1 コンパイラを自作する理由次へ2.3 コーディングの方針

最終更新 6 年前

2.2.1 データに着目したコンパイラの処理の流れ

以下の各データは、ソースコードを除き、 の記号表(TP_SYMBOL_TABLE 構造体)に格納されます。 トークン列の各要素には、ソースコード上の行と桁が記録されます。

  1. ソースコード(UTF-8)

  2. トークン列

  3. 構文木

  4. 中間言語(WebAssembly バイナリ表現)

  5. x64 フラット・バイナリ・ファイル(flat binary file)

2.2.2 実際のコンパイラの処理の流れ

  1. :main 関数 で、 コンパイラ本体(静的ライブラリ)の tp_compiler 関数を呼び出し

  2. :tp_compiler 関数 が compiler_main 関数を呼び出し

  3. compiler_main 関数で、コンパイラの初期化処理 init_symbol_table 関数を呼び出し

2.2.2.1 ソースコードをコンパイルする通常の処理の流れ

  1. 字句解析(トークン列を出力): :tp_make_token 関数

  2. 構文解析(再帰降下構文解析。構文木を出力): :tp_make_parse_tree 関数

  3. 意味解析(未定義の変数の参照や、重複する変数の定義をチェックする): :tp_semantic_analysis 関数

  4. 中間コード生成(WebAssembly バイナリ表現を出力): :tp_make_wasm 関数

  5. コード生成(アセンブラを利用せず、機械語を直接出力): :tp_make_x64_code 関数

2.2.2.2 ソースコードをコンパイルせず、コンパイラに内蔵されたテスト用の WebAssembly 生成処理から処理を開始する場合

  1. 中間コード生成: int_calc_compiler/src/lib/tp_compiler/tp_make_wasm.c:tp_make_wasm 関数

  2. コード生成: int_calc_compiler/src/lib/tp_compiler/tp_make_x64_code.c:tp_make_x64_code 関数

2.2.3 その他のソースコード・ファイルについて

  • WebAssembly で利用する可変長整数の LEB128 関連の関数定義:

  • コード生成の実装詳細部(x64 機械語を生成する主な関数定義):

  • ファイルの読み書きに必要な関数定義:

  • メッセージ出力やメモリ解放などの関数定義:

int_calc_compiler/src/lib/tp_compiler/tp_compiler.h
int_calc_compiler/src/main.c
int_calc_compiler/src/lib/tp_compiler/tp_compiler.c
int_calc_compiler/src/lib/tp_compiler/tp_make_token.c
int_calc_compiler/src/lib/tp_compiler/tp_make_parse_tree.c
int_calc_compiler/src/lib/tp_compiler/tp_semantic_analysis.c
int_calc_compiler/src/lib/tp_compiler/tp_make_wasm.c
int_calc_compiler/src/lib/tp_compiler/tp_make_x64_code.c
int_calc_compiler/src/lib/tp_compiler/tp_leb128.c
int_calc_compiler/src/lib/tp_compiler/tp_make_x64_code_body.c
int_calc_compiler/src/lib/tp_compiler/tp_file.c
int_calc_compiler/src/lib/tp_compiler/tp_utils.c