Open3

マイコン向けScheme処理系のRibbitを見てみる

okuokuokuoku

マイコン向けに4Kのfootprintで動作する処理系 Ribbit がある。共著者には有名なScheme処理系であるGambitの作者も入っている。

https://github.com/udem-dlteam/ribbit

https://www.iro.umontreal.ca/~feeley/papers/YvonFeeleyVMIL21.pdf

https://dl.acm.org/doi/10.1145/3486606.3486783

これを改造してSchemeで書かれたアプリケーションを普通に実行したい。 ...この手の"ねるねるねるねで晩餐する"みたいな企画定期的にやってるよな。

okuokuokuoku

処理系の概要

いくつか重要な特徴がある。

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が存在しない。これも丁度いい実装戦略が今のところ思いついていない。

okuokuokuoku

とりあえず適当にyuniに移植

https://github.com/okuoku/yuniribbit-proto/commit/682ad833222780a4495136d990379e6bedbaa853

とりあえず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)