或曰

月曜日, 6月 04, 2007

スクリプト D&I (14) システム関数登録処理

r443

スレッド関連のシステム関数設計と、対応する仮想機械の実装を進める。技術的には自由度高めることは簡単だけど、典型的な場合にバグが出にくくかつメンテナンスしやすいとなると、どう制約付けるかが難しい。
  • スレッドには親子関係がある
  • スレッド新規生成時に、現スレッドの子とするか、ルートスレッドの子スレッドにするかを指定可能。
  • 親スレッドが終了すると、それに紐付く子スレッドも全て終了する。
このぐらいが落としどころかなぁ。kernelスレッドではなくuserスレッドとして実装してるので排他制御は不要。同期制御どうするかは検討中だけど、そこまで必要になったらスクリプトで書かない方が良いような気がする。

とりあえず最低限必要な同期制御(スレッド終了待ち)だけ入れておいて、後はサンプルスクリプトとして簡単なエフェクトでも作ってみて必要に応じて追加するか。

仮想機械の内部状態にアクセスする必要があるシステム関数(スクリプトではなく C++ 側で実装して、スクリプトに機能を提供する関数) の実装方法を見直し。仮想機械側でスタックに積んだ引数情報の取出しや (UNIX kernel だと fubyte() family 相当の処理)、システム関数番号とメンバ関数の対応を手作業で管理するのが嫌になったので、それ専用にパーサ書いて C++ コード自動生成する方向で実装中。ソースコードは sysdecl* あたり。

しかし言語処理系はまともに書こうとすると、どんどん自動生成されるコードの量と段数が増えてくる。
  1. 言語を解析するためのパーサを作成するツール (yacc, lex など) を用意
  2. その入力ファイルも手書きだと重複が多くなってくるため、入力ファイルを自動生成するツール (CScriptだと GNU m4) を用意
  3. 仮想マシンの実装に際しては、スクリプト側のコードと C++ 側のコードのグルーとなるコードを自動生成するためのツール (今回作った sysdecl) を用意
比較的シンプルな手続き型言語でこの有様だから、ruby みたいな OOPL になると大変そうだ。どうやてるのかソース読んでみるかな。

CScript に関しても放置しておくと後ワケが分からなくなりそうなので、処理の流れと関連クラスを文書化しておこう。とりあえず覚書。

cscrypt/cscript.sch, cscript/system.sch
↓ cpp + sysdecl
debug.out/vm_sys_ctx.h (ICtxSyscall), debug.out/vm_sys_d.cc (VMSyscallDispatcher::Impl)

VirtualMachine::Impl
  • implements ICtxSyscall
  • delegates to VMSyscallDispatcher
    • 仮想機械のスタック関連操作
    • システム関数番号から仮想関数へのマッピング

ラベル:

0 件のコメント:

コメントを投稿



この投稿へのリンク:

リンクを作成

<< ホーム