[1372] Re:関数の再起について
投稿者:山
2009/06/22 19:06:01
>すみません、いまいちよくわからないです。関数呼び出しのたびにVM起動して
>いるわけではないですよね?
そうだった、VMが違うものでした。簡単にVMの構造を説明します。
↓AP管理からVMとして起動される
--------------------------------------
| VM管理システム |
--------------------------------------
↓ ・・・ ↓
------ ------
| | | |
| V | | V |
| M | ・・・ | M |
| 実 | | 実 |
| 行 | | 行 |
| 部 | | 部 |
| | | |
------ ------
VMは上記のような構造をしています。VM管理システムは1つのスレッドで、VM実行
部のスレッド実行管理と各種サービスを提供します。機能は、
・マルチスレッドでVM実行部の起動・停止・廃棄等の実行管理
・動的コンパイルの管理、関数の管理
・タイムスケジュールの管理(タイマーキューの生成と管理)
・スレッドの実行優先順位管理(キューに優先順位がありその管理)
・メッセージキューの管理(スレッドの実行はキューによって行われる)
・グローバル変数の管理
・その他各種IOや外部機能インターフェースの管理
・言語のデバック機能
・上記サービスをスレッドセーフで提供するための排他制御管理
等のいろいろな機能があり、それなりに大きなプログラムです。
それに対し、VM実行部は純粋にバイトコードを実行する以外何の機能も持っていま
せん。VM実行部は1つのクラスで、そのオブジェクト一つが1スレッドになり、マルチ
スレッドが実行可能であり、VM実行部が再起実行しても問題の無い仕様です。
そして、出来る限り単純で最小になるように作られています。
で^^;、最初に組込み関数部分を作りましたが、その時組込み関数から言語内の関数
を自由に起動したり廃棄したり、スレッド起動したり出来るように作ったので、それを
実行する一番いい方法はVM実行部の再起的実行でした。その後言語内の関数実行部を
作ったのですが。そのまま、再起で実行する部分を使って組み込んだために、関数実行
はVM実行部の再起になっています。今思えば別に再起しなくても良かったかな。^^;
今の実装の欠点は、VMのスタックを消費することと、ほんの少しのオーバーヘッド。
今の方法の利点は関数実行や管理が一元管理されて、プログラム的にすっきりしている。
かな、う~~んどうしようか、当面このままでいこうと思います。既に出来てしまっ
てるし。スタックを増やさない限り再起が450回しか出来ない欠点はあるけど。
>なお、現在はDiksamはシングルスレッドですが、スレッドを分けるなら、
>VMのスタックも分離する必要があると考えています。
こちらも、1スレッドおきにスタック領域が作られます。そのためスタック領域はあまり
大きくしたくなっかったので。
ちなみにVM実行部の起動は
S_Func_Val * CL_VMexe::execute(CL_Function *sfp,int stackp);
引数は関数情報と戻りスタックポインターです。ローカル変数をスタックに作成後すぐに
S_Func_Val * CL_VMexe::execute_code();
のコード実行部が呼ばれる単純な構造です。