スクリプト言語の作り方
JavaScript でスクリプト言語を作りました。
https://ikuo0.github.io/script_prototype/#main
このサイトで実行できる言語は IF、LOOP、ユーザー定義関数 といったプログラムに必要な機能を一通り実装したものです。
フィボナッチ数を求めるコードが動くので多分「プログラミング言語」と言って良いでしょう。
作りたい自作言語があるのですが、その前段階として JavaScript でスクリプト言語を作って動かしました。
スクリプトで試作品を作成し、設計や実装のポイントが分かったら C/C++ に移植といった作り方をしようと思っています。
本記事は試作品の公開と作り方を雑に説明した物になります。
スクリプト言語の作り方
以下のように「ソースコード」を「コマンド配列」に変換する解析器や実行機構を作成するのが「スクリプトを作る」ということだと思います。
ソースコード
MAIN
DATA a 1; 変数 a に 1 を代入する
IF a; 変数 a がTRUE(非0)であるかを判定し、TRUE(非0)であれば IF ~ END_IF の間のコードを実行する
PRINT "a is not 0"
END_IF
END_MAIN
前述のソースコードをコマンド配列に変換する
0, DATA, @a, 1 ; 変数 a に 1 を代入
1, LOADLHS, @a ; LHSレジスタ に a の内容をコピー
2, LOADRHS, 1 ; RHSレジスタ に 1 を設定
3, EQ ; LHSレジスタ と RHSレジスタを比較し、その結果を LHSレジスタに格納
4, JZ, end_if_or_else_0 ; LHSレジスタが 0 だったら ラベル end_if_or_else_0 にジャンプする
5, PRINT, *a is not 0 ; "a is not 0" と出力する
6, EXIT ; プログラムの終了
; ジャンプテーブル、JZ等のジャンプ系命令で使用される
{
"main": 0,
"end_if_or_else_0": 6
}
「レジスタ」と書いてはありますが、擬似的な概念で本当にCPUのレジスタに保存してはいません。
もっと詳しく書こうと思うとCPUやレジスタ、アセンブラの話になり長くなってしまい説明しきる自信も無いので以上とします。