好きな言語ではじめる
低レイヤゆるっと入門
低レイヤゆるっと入門
今日紹介するもの
私はRで実装したけど、他の言語でもできるはず。
みんな好きな言語でチャレンジしてほしい。
コンパイラ作るのってすごく難しそうなイメージだったけど
Cのソースコードを
文字列を読んで文字列を書ければコンパイラは作れる
どの言語でどの言語のコンパイラを書いても良いはず
私は
packageを読み込むと
Rのコードをコンパイルできる
コンパイルしてアセンブル
実行ファイルが出力される
コンパイルしてアセンブルして実行
変数も使える
四則演算が動くようになったけど
ここから先はCとRで乖離がある
Rの関数はファーストクラスオブジェクト
単なる値
無名関数もあり得る
どうやってコンパイルすれば良いんだ?
https://github.com/andycraig/functional-compiler-presentation
おかげで関数オブジェクトの生成、関数呼び出しを実装できた。
Thanks @andrew_cb2!
テキストと違う言語を実装しようとしてつまづいたが、それも含めて楽しかった。
Rでもコンパイラを作れるし低レイヤを学べる。
みんなも好きな言語で実装しよう。
きっかけ
本日の「PHP で JVM を実装して Hello World を出力するまで」の登壇資料です。PHP だけには限らず、 JS や Go など、他の言語でも JVM は実装可能なので、ぜひ試してみてくださいね!🙆 #builderscon https://t.co/sUgQNIAzi4
— めもりー (@m3m0r7) August 31, 2019
公式ドキュメントにも書いてある
To implement the Java Virtual Machine correctly, you need only be able to read the class file format and correctly perform the operations specified therein.
https://docs.oracle.com/javase/specs/jvms/se23/html/jvms-2.html
「クラスファイルを読めて、そこに書いてある命令を実行できればJVMを実装できるよ」
私はRで実装した。
Javaのコードを
コンパイルしたら
Rで読み込んで
実行できる
Fizz Buzzも
コンパイルしたら
R上で動く
詳細は
みんなも好きな言語で実装しよう。
「コンピュータを理解するための最善の方法はゼロからコンピュータを作ることです。」
コンピュータシステムの理論と実装
通称 nand2tetris (Nand to Tetris)
コンピュータの構成要素
をひとつずつ実装していく
NANDゲートから始まって

最終的にゲームが動くようになるよ
(Nand to Tetrisと言いつつテトリスではない)
この本で実装する階層
| アプリケーション |
| OS |
| コンパイラ |
| バーチャルマシン |
| アセンブラ |
| 機械語 |
| ハードウェア |
ハードウェアはHDLで記述
| ハードウェア |
これらは好きな言語で実装できる
| コンパイラ |
| バーチャルマシン |
| アセンブラ |
私はRで実装した。
順に紹介します。
| アプリケーション |
| OS |
| コンパイラ |
| バーチャルマシン |
| アセンブラ |
| 機械語 |
| ハードウェア |
アセンブリ言語をバイナリに変換する
アセンブリ言語を
バイナリに変換
ハードウェアに対する命令なので低水準
ちなみにこれは 2 + 3 を計算するコード
Rによるアセンブラの実装
Virtual Machine (VM)
抽象化されたコンピュータ
この本で作るのはVM変換器 (VM translator)
VMコードをアセンブリコードに変換する
| アプリケーション |
| OS |
| コンパイラ |
| バーチャルマシン |
| アセンブラ |
| 機械語 |
| ハードウェア |
2 + 3 を計算するVMコード
アセンブリより読みやすい
という計算モデル
RによるVM変換器の実装
高級言語をVMコードに変換する
| アプリケーション |
| OS |
| コンパイラ |
| バーチャルマシン |
| アセンブラ |
| 機械語 |
| ハードウェア |
Jack言語のコード
class Main {
function void main() {
do Output.printString("Hello world!");
do Output.println();
return;
}
}普通に読める
RによるJackコンパイラの実装
実装にかかった行数
| 行数 | |
|---|---|
| アセンブラ | 206 |
| VM変換器 | 323 |
| コンパイラ | 788 |
強力な抽象は実装が大変
| 行数 | |
|---|---|
| アセンブラ | 206 |
| VM変換器 | 323 |
| コンパイラ | 788 |
でも楽しい。
みんなも好きな言語で実装しよう。
低レイヤの入り口を紹介
動くものを作るのは楽しい。
ものが動く仕組みを知ることは楽しい。