好きな言語ではじめる
低レイヤゆるっと入門
低レイヤゆるっと入門
今日紹介するもの
私は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 |
でも楽しい。
みんなも好きな言語で実装しよう。
低レイヤの入り口を紹介
動くものを作るのは楽しい。
ものが動く仕組みを知ることは楽しい。