- 実装言語はアセンブリ(Cなどは使わない)
- 既存ライブラリは使わない(libcなど)
- コード生成ツールは使わない
- ブートストラッピング→Amber→Amberでセルフホスティング
何の意味があるのか
- 純粋に楽しみとして
- 知識技術ノウハウを磨くのに役立つかも
- ツール群を作った先人への感謝
ダイジェスト
- アセンブリ言語でrowl0を作る(rlc) トークンの正規表現から状態遷移図からパーサ
- メモリ管理が面倒なのでヒープない
- 変数管理ない
- 関数引数はp0 p1 p2
ローカル変数はスタックメモリを確保してから参照
インタプリタrowl-coreをつくる(LISPをつくる) レキサパーサを作る
- libc使わないのでmalloc freeないのでメモリ管理まだしていない
不要になったメモリを回収しないので、動かし続けると死ぬ
rowl-coreでVM記述用言語を作る
LISPの活用して言語内DSLを作る(VM用コンパイラを書く) 言語内DSLでVMのコードを書く
メタプログラミングの活用
- テーブルを作っておいて、その命令テーブルから色々と自動生成する。命令の追加削除を自動的に反映
LISPだとこういう仕組みを作るのが楽な気がする
多倍長整数演算は必須なので用意する
例外機構 継続なども用意
仮想マシン rlvmが完成
- 186命令
- スタックマシン
- コピーGC
- 例外機構
VM用のツールチェインを作る
- VMは出来たがプログラミング環境がない
- VM用中級言語
- アセンブラ
- ディスアセンブラ
- コンパイラ
- リンカ VM上で動く。リンカはメモリを食うのでGCのある環境でやりたかった
VM上でプログラミングが可能に。
普通を楽しめるよろこび。
rowl1でAmberの実装に入る。
- 動的スクリプティング言語
- インターベースオブジェクト指向
動的パターンマッチングエンジンと部分関数の融合プログラム
VM→オブジェクトシステム→パターンマッチングエンジン→コンパイラ→パーサ(通常はVMの上にコンパイラは作らない)
VM上で動作
- すごく高級になってきた
Amberのモジュール
- 自己拡張性の追求
- Amberの文法は標準ライブラリで定義されている
- 起動時に自身の文法を構築する
- マクロで文法増強
- リッチな構文
- オブジェクトシステム増強→継承が使える
- ここで開発が止まる…
まとめ
だいぶ高級なところまで到達できたので満足