あけましておめでとうございます。今年もよろしくおねがいします。艮鮟鱇です。
さてつい先程、友人から「冬休みに言語処理系ちょっと書いてみたいんだけどいい資料ない?」(意訳)と言われました。新しい年も始まりましたし、これを機にコンパイラ・インタプリタを書き始める人も少なくないこともないかもしれません。
ということで私が把握している言語処理系開発のための資料を以下に一覧します。上から順に見ていって、自分に合うものを探して頂ければと思います。私がよく知っているものを並べたので、全体的にCコンパイラよりです。「自分が開発するときに見るやつが載ってない!」という方は是非コメントをくださるか、 Twitterで雑にリプライをお願いします。
低レイヤを知りたい人のためのCコンパイラ作成入門
セキュキャン2018 Cコンパイラ開発ゼミの講師の一人、Rui UeyamaさんのCコンパイラ作成入門資料です。タイトルでGoogle検索すると、この資料を読んで実際にコンパイラを開発している方のブログなども見ることができます。
この資料はセキュキャン2018をもとに書かれたものですが1 そのときの様子はCコンパイラゼミ講師のRuiさんのnote (「Cコンパイラ制作の夏期集中コースが思っていた以上にうまくいった話」)や同じく講師のhikaliumさんのスライド(3(0)日でできる!Cコンパイラ自作入門)などから参照できます。
(1/3 追記)講師のRuiさん・hikaliumさんが開発した/しているCコンパイラは次から参照できます:
- rui314/8cc: A Small C Compiler
- rui314/9cc: A Small C Compiler
- hikalium/compilium: C compiler + hikalium
Cコンパイラ開発ゼミ参加者の感想などは次から参照できます:
- セキュリティ・キャンプ2018参加記 – hsjoihs’s diary
- hsjoihs/c-compiler/misc/diary.md C(のサブセット)コンパイラ開発日記
- セキュリティ・キャンプ 2018 (Cコンパイラ自作ゼミ) に参加してきました – 0x19f (Shinya Kato) の日報
- セキュキャン2018に参加した話 ~集中コースYII Cコンパイラを自作してみよう!ゼミ~ – a symmetry
- 今更セキュリティ・キャンプ全国大会2018参加記 – uoo38’s blog
- セルフホストCコンパイラaqcc 開発記
簡単なプログラミング言語を作るライブコーディング
上の資料と同様にRui Ueyamaさんの、言語処理系ライブコーディングの動画。最終的にフィボナッチ数列を計算できるインタプリタが、約30分で完成します。
この動画にインスパイアされて似たようなインタプリタを作った私のスライドがこちらです(宣伝):「10ステップで作るお手軽インタプリタ開発」
プログラミング言語を作る
本にもなっている言語処理系作成ページ。インタプリタcrowbarと、バイトコードにコンパイルして実行するDiksamを開発されています。クロージャ・GC・VMなどが実装されています。 Cコンパイラ開発ゼミでは使用しなかったlex/yaccの使い方やLALRの説明2なども記載されています。
Compiler Explorer
Cコンパイラ開発者御用達。入力したCプログラムがgccやclangでどのようにアセンブリに変換されるかを見ることができます。自分で gcc -S hoge.c
などするよりも楽なのでよく使います。
Intel SDM
Intel CPUのSDM (Software Developer’s Manuals)。 IntelのCPUにおいて、どんなアセンブリをかけばどんな挙動をするのかが一覧されています。章ごとにダウンロードするのがおすすめです(Four-Volume Set of Intel® 64 and IA-32 Architectures Software Developer’s Manuals)。とくにINSTRUCTION SET REFERENCEが載っているVolume 2を多用します。
Intel SDMは文書量が膨大かつ記述言語が英語なので、全部読むのはいろいろとつらいところがあります。例えば「x86-64プロセッサでGNU assemblerを使う」や「x86-64プロセッサのスタックを理解する」などのまとめページを読むと、全体的な(簡易の)理解を得られます。
(PDF注意) System V Application Binary Interface AMD64 Architecture Processor Supplement
AMD64のABI(のドラフト)。Cの型のサイズや、関数引数の渡し方などが一覧されています。 va_start
やva_arg
の実装方法などが記載されており、 Cコンパイラで可変長引数関数に対応する時に重宝します。
C言語仕様書
いろいろあります。とりあえずC11の仕様(のドラフト)(PDF注意)を参照すれば大抵うまくいきます。英語が苦手な人はC99ベースのJIS規格を参照してください。
Annex AにBNFがあります。これを見ながら再帰下降するとパーサが書けます。ただしJIS規格ではAnnexが省略されているので注意です。
ドラゴンブック
正式名称は「コンパイラ―原理・技法・ツール (Information & Computing)」。コンパイラ作成の伝統的な名著――という噂です。筆者は買いましたがちゃんと読んでいません。
べらぼうに値段が高い書籍3ですが、原著(英語)でよければ、名前で検索するとPDFが落ちていたりいなかったりします。というかこれはライセンス的にどうなんだろう……。
同じような書籍で「タイガーブック」もありますが、こちらは持ってすら居ないので割愛4。
その他
より体系的な入門記事は「低レイヤーの歩き方 – るくすの日記 ~ Out_Of_Range ~」が有名です。言語処理系についても記載があります。
他には、Rui UeyamaさんによるポッドキャストTuring Complete FMでも Cコンパイラ開発ゼミの話や言語処理系の話がされています。