Slide 1

Slide 1 text

GoでCコンパイラを 作った話 Fukuoka.go #23

Slide 2

Slide 2 text

自己紹介 レプ # seccamp 26 # Go言語 @repunit11 # 分散アルゴリズム # システムプログラミング # マジック # アニメ # ステッカー帳 2

Slide 3

Slide 3 text

目次 01 自作Cコンパイラの紹介 02 printの実装 3

Slide 4

Slide 4 text

自作Cコンパイラ の紹介 4

Slide 5

Slide 5 text

コンパイラとは ソースコードを別の言語や形式に変換するプログラム Cプログラム アセンブリ コード コ ン パ イ ル 自作Cコンパイラの紹介 オブジェクト ファイル ア セ ン ブ ル 実行 ファイル リ ン ク 5

Slide 6

Slide 6 text

コンパイラとは ソースコードを別の言語や形式に変換するプログラム 今回:C言語からLinuxx86-64アセンブリへの変換 Cプログラム アセンブリ コード コ ン パ イ ル 自作Cコンパイラの紹介 オブジェクト ファイル ア セ ン ブ ル 実行 ファイル リ ン ク 6

Slide 7

Slide 7 text

コンパイルの流れ シンプルなコンパイラのステップ 字句解析 構文解析 トークン AST 抽象構文木 自作Cコンパイラの紹介 意味解析 最適化 コード生成 型システム 中間表現 IR アセンブリ 7

Slide 8

Slide 8 text

実際にコンパイルできるもの 自作Cコンパイラの紹介 8

Slide 9

Slide 9 text

Cコンパイラを作ろうと思った理由 去年の12月ごろ:低レイヤ開発に興味が出てきた CコンパイラをC言語で書く教科書はあるのでそれをやってみる Goが好きなのでGoで実装してみる この登壇を機にprintを実装した 自作Cコンパイラの紹介 参考にした教科書:低レイヤを知りたい人のためのCコンパイラ作成入門 9

Slide 10

Slide 10 text

printの実装 10

Slide 11

Slide 11 text

実装したprintの内容 printの実装 11

Slide 12

Slide 12 text

printの仕組み print:メモリ上の文字列を標準出力へ書き出す処理 ~処理の流れ~ 文字列を用意する アドレスと長さを指定する writeシステムコールを呼ぶ ファイルディスクリプタ、配置されているメモリアドレス、文字数 (0:標準入力、1:標準出力、2:エラー出力) printの実装 12

Slide 13

Slide 13 text

システムコールとは printの実装 13

Slide 14

Slide 14 text

アセンブリでHello Worldする方法 x86-64 上のLinux printの実装 引用:『Goならわかるシステムプログラミング 第2版』 14

Slide 15

Slide 15 text

Goパッケージのシステムコールの実装 システムコールをアセンブリから呼び出したいとき 使いたいシステムコールの番号、引数をネットやmanを使って調べる syscallパッケージを読もう printの実装 15

Slide 16

Slide 16 text

Goパッケージのシステムコールの実装 syscallパッケージ:GoからOSのシステムコールを呼びだすためのパッケージ Goはlibcを経由せずにシステムコールを呼べる システムコールがOSまで届く流れをGoのソースコードだけで追いやすい 今回参考にした実装:syscall/zsyscall_linux_amd64.go ※ syscallパッケージは現在は更新されていないので、新しく使いたい場合は golang.org/x/sys/unix を使うべき printの実装 詳しくは:https://go.googlesource.com/proposal/+/refs/heads/master/design/freeze-syscall.md 16

Slide 17

Slide 17 text

まとめ 17

Slide 18

Slide 18 text

まとめ CコンパイラをGoで実装してみた アセンブリでシステムコールを呼びだす方法 システムコールの使い方はsyscallパッケージに書いてあるので助かる まとめ 18