[1665] ライザ言語の件(お久しぶりです)
投稿者:山
2011/01/04 21:21:06
一年以上のお久しぶりです。8ヶ月ほど別のソフトを作っていたので、その間
何もしていませんでした。が、まだまだ作っています。
グラフィック部分をメインに作成しているので、なかなか見れる物ができません。
現在約4万5千行ほどのプログラムになっています。
また、日記みたいに書いてしまうかもしれません、問題がありましたら注意
してください。でも、ここで書く事も1つのモチベーションになるので、ご迷惑
でなければよろしくお願いいたします。
言語のインプリメントですが色々変えすぎて、何を変えたか分からなくなるほ
どです。
まずはバイトコードが変わりました。
C++のwstringはやはり重たく、zwstringをオリジナルに作りました。
もちろんガーベージコレクションを必要としない可変長文字列変数です。
↓がオペコードリストです。
{L"dummy", L"", 0},
{L"push_int_1byte", L"b",8},
{L"push_int_2byte", L"s",8},
{L"push_int_4byte", L"i",8}, // 実際の値を持つ
{L"push_double_0", L"", 12},
{L"push_double_1", L"", 12},
{L"push_double_8byte", L"d",12}, // 実際の値を持つ
{L"push_string_const", L"s",12}, // 文字列の位置NOを持つ0~
{L"push_null", L"", 8},
/**********/
{L"push_stack_int", L"s", 8}, // intローカル変数をスタックに
{L"push_stack_double", L"s", 8}, //
{L"push_stack_string", L"s", 12}, //
{L"pop_stack_int", L"s", -8}, // スタックのintをローカル変数に
{L"pop_stack_double", L"s", -8}, //
{L"pop_stack_string", L"s", -12}, //
/**********/
{L"push_static_int", L"s", 8}, // int静的変数をスタックに 予約
{L"push_static_double", L"s", 12}, //
{L"push_static_string", L"s", 12}, //
{L"pop_static_int", L"s", -8}, // スタックのintを静的変数に 予約
{L"pop_static_double", L"s", -12}, //
{L"pop_static_string", L"s", -12}, //
/**********/
{L"push_sheet", L"s", 8}, // sheet番号をスタックに
{L"push_sheet_int ", L"s", 8}, // sheet変数をスタックに
{L"push_sheet_double", L"s", 12}, //
{L"push_sheet_str ", L"s", 12}, //
{L"pop_sheet_int ", L"s", -24}, // スタックからsheet変数に
{L"pop_sheet_double", L"s", -28}, //
{L"pop_sheet_str ", L"s", -28}, //
/**********/
{L"push_array_ref ", L"s", 8}, // 配列参照
{L"push_array_int ", L"s", -1}, // int配列処理
{L"push_array_double", L"s", -1}, //
{L"push_array_string", L"s", -1}, //
{L"pop_array_int ", L"s", -1}, // スタックからint配列に
{L"pop_array_double", L"s", -1}, //
{L"pop_array_string", L"s", -1}, //
/**********/
{L"and_int", L"", -8}, // 以下は総て算術演算子
{L"or_int", L"", -8},
{L"xor_int", L"", -8},
{L"add_int", L"", -8},
{L"add_double", L"", -12},
{L"add_string", L"", -12},
{L"sub_int", L"", -8},
{L"sub_double", L"", -12},
{L"mul_int", L"", -8},
{L"mul_double", L"", -12},
{L"div_int", L"", -8},
{L"div_double", L"", -12},
{L"mod_int", L"", -8},
{L"mod_double", L"", -12},
{L"minus_int", L"", 0},
{L"minus_double", L"", 0},
{L"increment", L"", 0},
{L"decrement", L"", 0}, // ここまで算術演算子
/**********/
{L"cast_int_to_double", L"", 4}, // 以下はキャスト処理
{L"cast_double_to_int", L"", -4},
{L"cast_string_to_int", L"", -4},
{L"cast_string_to_double", L"", -0},
{L"cast_boolean_to_string", L"", 4},
{L"cast_int_to_string", L"", 4},
{L"cast_double_to_string", L"", 0}, // ここまでキャスト処理
/**********/
{L"eq_int", L"", -8}, // 以下は総て論理演算子
{L"eq_double", L"", -16},
{L"eq_string", L"", -16},
{L"gt_int", L"", -8},
{L"gt_double", L"", -16},
{L"gt_string", L"", -16},
{L"ge_int", L"", -8},
{L"ge_double", L"", -16},
{L"ge_string", L"", -16},
{L"lt_int", L"", -8},
{L"lt_double", L"", -16},
{L"lt_string", L"", -16},
{L"le_int", L"", -8},
{L"le_double", L"", -16},
{L"le_string", L"", -16},
{L"ne_int", L"", -8},
{L"ne_double", L"", -16},
{L"ne_string", L"", -16}, // ここまで論理演算子
{L"logical_and",L"", -8}, //
{L"logical_or", L"", -8}, //
{L"logical_not",L"", 0}, //
/**********/
{L"pop", L"", -8}, // スタックを1つ減らす
{L"duplicate", L"", 16}, // スタック内容をコピーしてスタックに
{L"jump", L"s", 0}, // 指定ポインターにjump
{L"jump_if_true", L"s", -8}, // スタックがtrueならjump
{L"jump_if_false", L"s", -8}, // スタックがfalseならjump
{L"nop------------",L"", 0}, // nop
/**********/
{L"push_function", L"", 0}, // 関数情報をスタック、未使用
{L"call_function", L"ssss", 0}, // 関数コール
{L"return", L"", -1}, // 関数戻り
/**********/
{L"set_array_literal_int", L"ss", 0}, // int定数配列を変数にコピー
{L"set_array_literal_double",L"ss", 0}, // double定数配列を変数にコピー
{L"set_array_literal_string",L"ss", 0}, // string定数配列を変数にコピー
また、メイン関数も1つのスレッドになり、待機リターンをしてVMを保持しないようにしました。
↓例
//=====================================================================
// 最初に実行されるmein関数
//=====================================================================
int main(int qid,int p1)
{
if(qid == スレッド開始) {
main_init();
return スレッド待機;
} elsif(qid == 終了指示) {
return スレッド終了;
}
return スレッドエラー終了;
}
また、配列操作のバイトコードもよりシンプルになり 2/3以下のバイトコードになりました。
シートの宣言も関数外で↓のようにラベル宣言するようにしました。
sheet s_system[10][20]; // システム設定のシート定義(変更不可)
sheet s_key_input[2][256]; // キー入力定義(変更不可)
sheet s_mouse_input[2][11]; // マウス入力定義(変更不可)
sheet s_pad_input[8][20]; // パッド入力定義(変更不可)
初期バージョン完成にはまだまだかかりそうです。