[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];	// パッド入力定義(変更不可)
初期バージョン完成にはまだまだかかりそうです。