マイコン向けScheme処理系のRibbitを見てみる
マイコン向けに4Kのfootprintで動作する処理系 Ribbit がある。共著者には有名なScheme処理系であるGambitの作者も入っている。
これを改造してSchemeで書かれたアプリケーションを普通に実行したい。 ...この手の"ねるねるねるねで晩餐する"みたいな企画定期的にやってるよな。
処理系の概要
いくつか重要な特徴がある。
4Kフットプリントには eval
機能も含んでいる 。これはマイコン向けのScheme処理系としては割と珍しい特徴と言える。後述のようにVM型の処理系なのでreaderとコンパイラの合計ということになる。
メモリは特に節約していない 。 "rib" と呼ぶ3オブジェクトを纏めた単位でメモリを取り扱う。PICOBITのような他の省メモリ処理系は1ワードをビットフィールドに分割してメモリの節約を図っているが、そういうテクニックは一切使用していない。
GC付言語で実装した場合、ホスト言語のGCを流用できる 。Ribbit VMの実装はRubyやPythonのものもあるが、これらではGCを実装していない。"rib"ではポインタを加工する必要が無いため、ホスト言語のGCがそのまま使用できる。
存在しない機能
いろいろ有るが、マジで困るのは 可変長引数を実装していない 点。こればっかりは頑張って独自拡張するしかない。
VMコンパイラにはいわゆる syntax-rules
のようなマクロ機構は実装されていないが、それらはこちらで用意すれば十分なので問題ない。
また、 "rib" によるオブジェクト表現では O(1) でアクセスできるvectorが存在しない。これも丁度いい実装戦略が今のところ思いついていない。
とりあえず適当にyuniに移植
とりあえずHELLO!を出力するサンプルだけは動いた状態。大量のバグを yuni
側に発見してしまったのでひたすら修正が必要。。 (R6RS系の処理系でライブラリパスの設定漏れがある)
... なんか debug
を有効にすると動かないけどそれは元々の実装も一緒だった。
const 10
@30 STACK = (10)
jump #<symbol "">
@31 STACK = (10*** ERROR IN loop, "rvm.scm"@271.24 -- (Argument 1, vector) VECTOR expected
(vector-ref 0 2)