[1735] Re:もう忘れられている気が・・・
投稿者:山
2011/08/14 16:28:20
返事ありがとうございます。
>これって問題になるほど遅いですかね?
関数パラメータのコピーや、ローカル変数の設定命や、
その初期値の設定等がバイトコードではなく、C++の1関数でまとめて
領域を作成して、定数コピーと参照アドレスの一括変換をする予定なので。
ローカル変数の設定処理に一切のバイトコードが無くなるんです。
その結果、トータルとして関数コールがとても高速になると思いますよ。
>6.5万行というと、言語処理系としては相当なサイズだと思うのですが…
いえ、ほとんどは、私が作っている言語以外のシステムのコードです。
言語部分はそれほど多くはないです。
たぶん、前回の出した行数より少し増えただけだと思います。
いまは、画面表示は総てDirectXで表示して、3Dキャラが動き回ってます。
もちろん、コンソール的な機能も持っていて、print関数もDirectX上でコンソール
をエミュレートして表示しています。getchar()やgets()関数もある。
これをしたからといってシステムが入力待ちで止まったりはしません。
言語上の1スレッドが入力待ちでシステムにもどる(タスクスイッチのOSに処理が
戻るようなもの)だけです。
いまは、システム全体をセーブして、ロードするとそこから再開できる機能を
作っています。ちょっと苦労してる。
PCで言うところにリジュームみたいな機能です。
今のバイトコードです。
関数コールとリターンを分割したので、void関数コールは速いです
組み込み関数と言語上の関数も分割。
一般的な言語ではなく、組込言語なので、エラー処理のほとんどは
システムが受け持って処理するので、ほとんどの関数はエラーリターン
がありません。そのため、90%以上の関数はvoid型になり高速処理されます。
そうそう、総ての型にキャスト命令を作っていますが、明示的な型変換の方が
いいのか多少悩み中。将来この自動キャストは止めるかもしれません。
↓
{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_sheet_ref", L"s", 8}, // 参照したsheet番号をスタックに
{L"push_sheet_ref_int ", L"s", 8}, // 参照sheet変数をスタックに
{L"push_sheet_ref_double", L"s", 12}, //
{L"push_sheet_ref_str ", L"s", 12}, //
{L"pop_sheet_ref_int ", L"s", -24}, // スタックから参照sheet変数に
{L"pop_sheet_ref_double", L"s", -28}, //
{L"pop_sheet_ref_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_n_function_v", L"s", 0}, // void 組込み関数コール
{L"call_n_function", L"s", 0}, // 組込み関数コール
{L"call_function_v", L"ssss", 0}, // void 関数コール
{L"call_function", L"ssss", 0}, // 関数コール
{L"return_v", L"", -1}, // void 関数戻り
{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定数配列を変数にコピー