TBSKmodemの開発がひと段落したので、制御ソフトを書くことにした。
マイコンで動作する簡単なスクリプト言語を実装しようということで、調査をしていると、TinyBasicとForthが候補に挙がった。
Basicは人間が親しみやすい言語ではあるが、規格と仕様の境界が曖昧である。
Forthはなんだかよくわからないので一度却下した。
まずは馴染みのあるBasicを作ることにして、機能要素の実装を始めた。
とりあえずBasic
Basicの機能要素は3つある。
- ラインエディタ
- 変数バッファ
- 逆ポーランド記法計算機とパーサ
ラインエディタ
ラインエディタはGapVectorのアルゴリズムに行番号のインデクスをつけて実装した。
行探索は線形探索。
変数バッファ
変数バッファは同じくGapVectorにハッシュマップを組み合わせて実装した。
キーワード探索は線形探索でハッシュマップのキーは8bit
逆ポーランド記法の計算機
逆ポーランド記法の計算機は簡単なスタックマシンとトークンパーサで実装した。
括弧やカンマ、符号値と境界値の取り扱いで煩雑になってしまった。
この時点でのソースコードはここにある。
GitHub - nyatla/Mib
Forthに傾く
文字列から式の演算ができるようになり、組み込み関数を実装しようとしたところで、将来の作業が面倒になった。
組み込み関数はBasicでもかけそうだが、関数コールの実装は煩雑で沼であることは間違いないだろう。
組み込み関数自身もスクリプトで記述できた方が良い。
Forthは自己拡張性があると言われている。Forthを調査してみよう。
Forth思考 ―問題解決のための言語と哲学― — Thinking Forth 0 ドキュメント
Forth
the Forth Net
Forth2020 - Books on Forth
実装にチャレンジしている人々
Forthを作ってみる - moiの頭の中
プログラミング言語Forthに魅せられて。 - Qiita
www.paraches.com
仕様を読む。規格化されているようではあるが割と好き勝手にいじっても良いようだ。
Forthの部品
Forthに必要な機能を検討した。
- 辞書テーブル
- VM
- スタック型メモリ
Forthは基本的にスタックマシンだが、スタックメモリのレイアウトを操作する命令を持つ。
メモリを操作するVMとスタックメモリは分離したほうが良いと考えた。
辞書テーブルはVMが解釈する命令語を格納する。Forthの仕様によると、値とはphsh命令と等価であるため、値も格納できる。
実装の方針
ForthのCore命令を実装する。スタック型メモリについては、GapVectorの特性に合わせて操作命令を拡張する。