2023 03 16 - qnighy/umo GitHub Wiki
ツリーベースインタプリタから作っている。 https://github.com/qnighy/umo/commit/793408e98cd027dab7ed5442e1e6e4271641c0ee
とりあえず整数と配列のある型のない言語から始めれば広げやすいはず。
Rustは低レイヤプログラミングをサポートしている都合上、高レイヤでの意味論上は区別しなくていいものが区別されていたりする。Umoではそのあたりの区別を減らすことでわかりやすく、書きやすくしたい。
まずRustではRefCellやMutexなどの内部可変性コンテナがインラインに埋め込めるようになっているが、これは参照の意味論を難しくしてしまっている。Umoでは内部可変性コンテナはそれ自体が共有参照とセットで提供されることにしたい。たとえば、Rustでいう Arc<Mutex<T>>
をUmoでは Mutex<T>
として扱う。
すると以下が全て同じ意味になる:
T
&T
Box<T>
Arc<T>
ただし、パフォーマンス上の理由からこれらを区別したくなることはあるので、その場合は何らかの外部的なアノテーションで対応する。
またシングルスレット/マルチスレッドの区別もなるべく減らして単純化したい。
最小限のインターフェースとして、バイト列を入力してバイト列を返すことができれば色々書けるようになるので、その中で十分な表現力を持たせることをまずは目指す。具体的には以下があればいいはず。
- データ型
- 整数
- ブール値
- 配列
- 関数
- 操作
- 整数の基本操作
- 比較と分岐
- 配列生成・配列の更新・インデックスクセス
- let
- クロージャ・関数呼び出し
とりあえずは型は後回しにする。あとで型をつける前提は置きつつ、とりあえずは値をenumで保持して動的に使う感じ。
ここまで書いていて思ったが、配列をちゃんと使おうとするとコピーをなるべく減らす必要があるので、もしかしたら早い段階でVM化が必要になるかもしれない。