スクリプトの実行処理
OsoScriptでは、下記の変数で変数のスタックと実行箇所のスタックを行っています。
//変数の初期化 Henpos = 0; LocalHenStacPtr = 0; ScriptStacPtr = 0; TokenPos = 0;
Henpos :次に格納すべき変数の配列番号
Henposは、変数名や変数の値を保存する配列のカウンタとなっています。現在、変数は同時に100個までしか使えない仕様となっているので、Henposが100を超えるとエラーとします。
LocalHenStacPtr :ローカル変数の開始位置(Henpos)を格納する配列番号
Henataiを変数の値が入った配列、LocalHenStacをローカル変数開始位置を格納する配列とします。
グローバル変数が3つあるとすると、
Henatai[0]・・・グローバル変数確保
Henatai[1]・・・グローバル変数確保
Henatai[2]・・・グローバル変数確保
の3つにグローバル変数が格納されます。そして、Henpos = 3となっています。この値がLocalHenStac[0]に格納されます。そして、LocalHenStacPtr = 1となります。よって、下記のループで変数名を検索すれば、グローバル変数が見つかります。
for(i=0;i<LocalHenStac[LocalHenStacPtr-1];i++){ }
次に、関数が呼ばれ、呼ばれた関数に引数が2つ、呼ばれた先でローカル変数が3つあるとすると、下記の6つがローカル変数として格納されます。
Henatai[3]・・・関数名を変数名とした変数確保
Henatai[4]・・・第一引数の変数確保
Henatai[5]・・・第二引数の変数確保
Henatai[6]・・・ローカル変数確保
Henatai[7]・・・ローカル変数確保
Henatai[8]・・・ローカル変数確保
ここで、Henpos = 9となっています。この値が、LocalHenStac[1]に格納されます。そして、LocalHenStacPtr = 2となります。よって、下記のループで変数名を検索すれば、ローカル変数が見つかります。
for(i=LocalHenStac[LocalHenStacPtr-1]+1;i<Henpos;i++){ }
そして、関数を抜けるときに、
//関数を抜けてきたら、ローカル変数をデクリメント(戻す)
LocalHenStacPtr--;
Henpos = LocalHenStac[LocalHenStacPtr];
とすれば、関数が呼ばれる1つ前の変数範囲にスタックが戻ります。
TokenPos :スクリプトファイルの読み出し位置
TokenPosはスクリプトファイルの読み出し位置を格納している変数です。OsoScriptはTokenPosをインクリメントしながらファイルを読み進み、スクリプトを解釈していきます。
ScriptStacPtr :今、実行しているスクリプトの位置を格納する配列の配列番号
OsoScriptは関数が呼ばれると、呼ばれたときにいる場所をスタックします。ScriptReadPosStac[]配列にTokenPosが格納されるとすると、下記のように今いる位置をスタックします。
//今読んでいる実行スクリプトの現在位置をスタック
ScriptReadPosStac[ScriptStacPtr] = TokenPos;
ScriptStacPtr++;
現在、関数が呼ばれる深さは50段までです。そして、スタックした後、TokenPosに飛び先の関数が書いているファイル内の位置を代入します。例えば、関数の場所(飛び先)が0xf00だったとすると、
TokenPos = 0xf00;
こんな感じになります。そして、関数を抜けるときに、元の場所に戻るため、下記のようにスタック戻します。
//実行位置のスタックをデクリメント(戻す)
ScriptStacPtr--;
TokenPos = ScriptReadPosStac[ScriptStacPtr];
以上が、OsoScriptの実行処理の仕組みです。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム