Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GopherCon 2024 Recap: Exploring the Go Compiler...

task4233
September 03, 2024
570

GopherCon 2024 Recap: Exploring the Go Compiler: Adding a "four" loop / 構文追加で学ぶGoコンパイラの処理

Go 1.23 リリースパーティ & GopherCon 2024 報告会での発表資料です。
ref: https://gocon.connpass.com/event/324888/

GopherCon 2024 で発表された Exploring the Go Compiler: Adding a "four" loop に沿って、次のトピックを紹介しました:
・セッションの概観
・Goコンパイラ処理の概観
・フロント / ミドル / バックエンドの処理
・解析時に便利なツールほか

ハンズオンのための記事: https://qiita.com/task4233/items/3a65f39b232bfe7bb3b6

task4233

September 03, 2024
Tweet

More Decks by task4233

Transcript

  1. 1 構文追加で学ぶGoコンパイラの処理 Recap: Exploring the Go Compiler: Adding a "four"

    loop Go 1.23 リリースパーティ& GopherCon 2024 Recap @task4233
  2. 5 Exploring the Go Compiler: Adding a "four" loop ・2つの構文追加の実例に沿って、Goコンパイラの処理を紹介した発表

    1. Recap対象のセッション概要 1: four statement 2: unless statement // Post stmtを4回繰り返すループ four i:=0; i<16; i++ { fmt.Println(i) } // 以下のforループと等価 for i:=0; i<16; i+=4 { fmt.Println(i) } // if notのシンタックスシュガー unless i%2==0 { fmt.Printf("odd number!") } // 以下のif文と等価 if !(i%2==0) { fmt.Printf("odd number!") }
  3. 6 Exploring the Go Compiler: Adding a "four" loop ・2つの構文追加の実例に沿って、Goコンパイラの処理を紹介した発表

    1. Recap対象のセッション概要 1: four statement 2: unless statement // Post stmtを4回繰り返すループ four i:=0; i<16; i++ { fmt.Println(i) } // 以下のforループと等価 for i:=0; i<16; i+=4 { fmt.Println(i) } // if notのシンタックスシュガー unless i%2==0 { fmt.Printf("odd number!") } // 以下のif文と等価 if !(i%2==0) { fmt.Printf("odd number!") } 今回こちらのみ
  4. 7 コンパイラ処理は次の3ステージに大別される ・フロントエンド : ソースコードを解析して中間表現(IR)を構築するステージ ・ミドルエンド  : IRを最適化するステージ ・バックエンド  :

    最適化されたIRを機械語へ変換するステージ 2. コンパイラ処理の概要 1. 字句解析 2. 構文解析 3. 型チェック 4. IRの構築 1. ASTに対する最適化 2. ASTの巡回 1. SSA形式の構築 2. 機械語生成 フロントエンド ミドルエンド バックエンド
  5. 8 1. 字句解析 2. 構文解析 3. 型チェック 4. IRの構築 1.

    ASTに対する最適化 2. ASTの巡回 1. SSA形式の構築 2. 機械語生成 フロントエンド ミドルエンド バックエンド
  6. 11 ・既存のif statementの構文を踏襲 3-1: unless statementの構文 if <init>; <cond> {

    <body> } <else> unless <init>; <cond> { <then> } unless statement if statement unless statementの struct(ref)
  7. 21 1. 字句解析 2. 構文解析 3. 型チェック 4. IRの構築 1.

    ASTに対する最適化 2. ASTの巡回 1. SSA形式の構築 2. 機械語生成 フロントエンド ミドルエンド バックエンド
  8. 22 3-2-1: ASTに対する最適化 最適化手法名 説明 デッドコード削除 呼ばれていない処理を削除する 仮想関数の実体化 (Devirtualization) インタフェースのメソッド呼び出しを

    structのメソッド呼び出しに 置き換える 関数のインライン化 (Inlining) 関数呼び出しのコードを呼び出し元に展開することで、 関数呼び出しのオーバーヘッドを高速化する エスケープ解析 プログラムの実行時にオブジェクトがどこで対比されるか、 どのスコープやスレッドの外部で利用されるかを分析する技術
  9. 27 1. 字句解析 2. 構文解析 3. 型チェック 4. IRの構築 1.

    ASTに対する最適化 2. ASTの巡回 1. SSA形式の構築 2. 機械語生成 フロントエンド ミドルエンド バックエンド
  10. 29 プログラムがブロックに分割されて各変数が一度だけ割り当てられる形式 3-3-1: SSA(Static Single-Assignment)形式 x := 1 x :=

    2 y := x x_1 := 1 x_2 := 2 y_1 := x_2 通常のソースコード SSAが適用されたコード デッドコード
  11. 30 3-3-1: 構文木 vs AST vs SSA形式 概要 強み 構文木

    ・構文解析(Parsing)後に得られる木 ・あらゆるトークンが反映される ・文法の検証やソースコードの  再構築に役立つ 抽象構文木 (AST) ・IR構築(Noding)後に得られる木 ・構文木から不要な構文要素が除去  されたもの ・意味的な解析やプログラムの  最適化に適している SSA形式 ・SSA形式の構築後に得られる形式 ・各変数に一意な定義が存在し、  プログラムの再代入が存在しない ・ASTよりも高度な最適化が可能になる  ・変数のリネーム・共通部分式の除去   デッドコードの削除など ・データフローの解析が容易になる
  12. 37 各パッケージの Dump関数 ・internal/syntaxならFdump(ref) ・internal/irならDump(ref) など The Go SSA Playground

    ・SSA等の情報をオンラインで生成してくれるツール ・ローカルで見たい時は、GOSSAFUNC=${FUNC_NAME} go build . ・詳しくはinternal/ssaのREADMEに 4. 解析に便利なツールほか
  13. 38 生成される SSAを見ると一致している (not(if-stmt), unless-stmt) 4. not(if-stmt) と unless-stmt の

    SSA の比較 not(if-stmt)から 生成されたSSA unless-stmtから 生成されたSSA
  14. 39 コンパイラの処理、ざっくり理解できましたか? 5. まとめ 1. 字句解析 2. 構文解析 3. 型チェック

    4. IRの構築 1. ASTに対する最適化 2. ASTの巡回 1. SSA形式の構成 2. 機械語生成 フロントエンド ミドルエンド バックエンド 興味があれば、ご自身の環境で試してみてください! やり方はハンズオン形式で こちらのブログ にまとめてあります