0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

スクリプト言語の作り方

Last updated at Posted at 2025-03-26

スクリプト言語の作り方

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やレジスタ、アセンブラの話になり長くなってしまい説明しきる自信も無いので以上とします。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?