Spark用スクリプトエンジン用仮想マシン命令一覧 各命令・値ごとに配列の要素1個分消費します。 各値の見方: v 変数値。何でもあり。 id 識別子。基本的に文字列。 % 値の代入先。入れたいインデックスの、"命令からの"オフセット。* :% ラベル。そのラベルが指すインデックスの、"命令からの"オフセット。* * 例えば、addの結果をtraceしたい場合、 add v1 v2 % trace v %はvを指さなければいけない。 この時vは、%の命令である"addから数えて"5つ目にあるため、 add v1(1つ目) v2(2つ目) %(3つ目) trace(4つ目) v(5つ目) %には5を代入しなければならない。 よって、 add v1 v2 5 trace v となる。 nop (no operation) 何もしない spd (suspend) 処理を中断する lit v % (literal) リテラルvを%に代入 call id n % (call function) 関数idをn個の引数で呼び出して結果を%に代入 calll id n % (call local function) 関数idをn個の引数で呼び出して結果を%に代入 callm o id n % (call member function) 関数v.idをn個の引数で呼び出して結果を%に代入 callf o n % (call functor) 関数オブジェクトoをn個の引数で呼び出して結果を%に代入 ret v (return function) 戻り値vで呼び出し元に戻る cret v (return coroutine) 戻り値vでコルーチンの呼び出し元に戻る func :% % (function declare) :%までを本体とする関数オブジェクトを生成して%に代入 cor :% % (coroutine declare) :%までを本体とするコルーチンを生成して%に代入 arg n id (get argument) n番目の引数を変数idに代入 jmp :% (jump) :%に飛ぶ if v :% (jump if) vが真で「なければ」:%に飛ぶ(真であれば次のコードが実行される) nif v :% (jump if not) vが偽で「なければ」:%に飛ぶ(偽であれば次のコードが実行される) add v1 v2 % (add) v1+v2を%に代入 sub v1 v2 % (subtract) v1-v2を%に代入 mul v1 v2 % (multiply) v1*v2を%に代入 div v1 v2 % (divide) v1/v2を%に代入 mod v1 v2 % (modulo) v1%v2を%に代入 and v1 v2 % (bitwise and) v1&v2を%に代入 or v1 v2 % (bitwise or) v1|v2を%に代入 xor v1 v2 % (bitwise xor) v1^v2を%に代入 not v % (bitwise not) ~vを%に代入 lnot v % (logical not) !vを%に代入 lsh v1 v2 % (left shift) v1<>v2を%に代入 ursh v1 v2 % (unsigned right shift) v1>>>v2を%に代入 inc v % (increment) vを加算して%に代入 dec v % (decrement) vを減算して%に代入 ceq v1 v2 % (compare equal) v1==v2の結果を%に代入 cseq v1 v2 % (compare strict equal) v1===v2の結果を%に代入 cne v1 v2 % (compare not equal) v1!=v2の結果を%に代入 csne v1 v2 % (compare not strict equal) v1!==v2の結果を%に代入 clt v1 v2 % (compare less than) v1v2の結果を%に代入 cle v1 v2 % (compare less than or equal) v1<=v2の結果を%に代入 cge v1 v2 % (compare greater than or equal) v1>=v2の結果を%に代入 dup v %1 %2 (duplicate) %1と%2にvを代入 this % (this) thisを%に代入 array n % (initialize array) n個の要素を持つ配列を生成して%に代入 obj n % (initialize object) n個のキーと値のペアを持つオブジェクトを生成して%に代入 setl id v % (set local variable) 現在の実行コンテキスト上の変数idにvを代入(変数idが存在しなければ生成; スコープチェーンは見ない) getl id % (get local variable) 現在の実行コンテキスト上の変数idを探して%に代入(スコープチェーンは見ない) set id v % (set variable) 現在の実行コンテキストを基点とするスコープチェーンから変数idを探してvを代入 get id % (get variable) 現在の実行コンテキストを基点とするスコープチェーンから変数idを探して%に代入 setm o id v % (set member) o.idにvを代入 getm o id % (get member) o.idを%に代入 new v n % (new instance) クラスvをn個の引数で生成して%に代入 del id % (delete) 変数idを削除し、その成否を%に代入 dell id % (delete local) 変数idを削除し、その成否を%に代入 delm o id % (delete member) o.idを削除し、その成否を%に代入 typeof v % (typeof) typeof vの結果を%に代入 insof v1 v2 % (instanceof) v1 instanceof v2の結果を%に代入 num v % (to number) Number(v)の結果を%に代入 str v % (to string) String(v)の結果を%に代入 with v (start with) スコープチェーンの先頭にvを追加 ewith (end with) スコープチェーンから先頭のオブジェクトを取り除く push v (push) vをスタックに積む pop % (pop) スタックから値を取り出し%に代入 trace v (trace) trace(v) 以下、実装予定 cast v1 v2 % (cast) v1をv2にキャストした結果を%に代入 stry :% (start try) tryに入る(例外が投げられると:%に飛ぶ) etry (end try) tryから抜ける throw v (throw) 例外vをスローする SETLOCAL 'a', false SETLOCAL 'b', true GET 'a', *a DUP (*a) *not *c NOT (*not) *if IF (*if) *end GET 'b' *c end: SETLOCAL 'c', (*c) A && Bの生成 式A $ DUP _ $$ $ NIF _ 式B $$ 代入先 _    ↑ここで両方の$$をpopしてしまう A || Bの生成 式A $ DUP _ $$ $ IF _ 式B $$ 代入先 _    ↑ここで両方の$$をpopしてしまう GET id $ ADD _ 2 $ SET id _ $ GET id $ GET id $ DUP _ $2 $4 DUP _ $1 $3 GETM _1 _2 $ ADD _ 2 $ SETM _3 _4 _ $