by shigemk2

当面は技術的なことしか書かない

ブートストラッピングで言語処理系を作った話 まとめ #kernelvm

  • 実装言語はアセンブリ(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の文法は標準ライブラリで定義されている
  • 起動時に自身の文法を構築する
  • マクロで文法増強
  • リッチな構文
  • オブジェクトシステム増強→継承が使える
  • ここで開発が止まる…

まとめ

だいぶ高級なところまで到達できたので満足