Open3
Ribbon: 自分で自分をブートストラップする
そろそろRibbonをちゃんとしたScheme処理系としてデビューさせていきたい。というわけで単体で組込みSchemeインタプリタとして使えるように環境整備を進めていくことにする。
Bootstrapの各段階
他所のScheme処理系と異なり、Ribbonは 既存のR7RSまたはR6RS準拠のScheme処理系からbootstrap可能 という特徴がある。このため、開発中にこっぴどく互換性のない変更をしてしまったとしても、とりあえず起動するものを作ること自体は現実的な手間で可能となっている。
ここではRibbonをbootstrapできるような処理系を Yuni処理系 と呼ぶ。Yuni処理系はR5RS/R6RS/R7RSのメジャーどころの処理系は大抵抑えている。もちろん、Ribbon自体もYuni処理系であり、今後はRibbonがYuni処理系のリファレンス実装となっていくことを企図している。
Bootstrapには3段階考えられる:
- Yuni処理系を使用したRibbonのエミュレーション -- RibbonのVMはSchemeで掛かれたバージョンがあり、こちらをYuni処理系で実行することでブートストラップなしでRibbonのランタイムライブラリ(コンパイラやVM命令のシリアライザ)を実行できる
- Yuni処理系でブートスラップされたRibbonによるブートストラップ
- 最終的なRibbonの実行
従来はRibbonの完成度が十分でなかったため 2 が事故ることを恐れて常に 1 から実行していた。現状のRibbonの完成度であれば、1を省略しても大丈夫な気がする。
うまくいかない
- そもそも、通常のスクリプトローダーとbootstrapのビルドスクリプトが同居しているのが良くない。Bootstrapのバイナリに両方入ってしまうので、bootstrapのビルドスクリプトを修正するときにもBootstrapのやりなおしが必要になる
- 最初の最初
(rvm-primitives)
のビルドに失敗する。ネイティブVMとScheme版VMで差し替えてるんだっけか。。? - "1つ前のバイナリからbootstrap" する機能を作り込まないと、安全性を保証できない
とりあえず実装できた
ただ謎のクラッシュがある。。たぶんコンパイラのバグを踏んでいる。