このページはドラフトです。

スクリプト

テキストで記述されたスクリプトは、実行時にバイトコードに変換され、仮想スタックマシン上で動作します。
このスタックマシンは、現在、次の概念をサポートしています。

・スレッド
・プロセス
・イベント
・例外処理


スレッド

スレッドはアクションのリストを持っています。プロシージャもまた、ひとつのアクションとして扱われます。このリストはスタックのように扱われます。ティックは最上位のアクションだけに呼び出され、レンダーは最下位から順にすべてのアクションに対して呼び出されます。

スレッドにはプライマリと非プライマリの2種類があります。プロセスを開始すると、一個のスレッドが作成されます。これがプライマリとなります。プライマリスレッドの終了と同時に、すべての非プライマリスレッドも終了します。プライマリスレッドは Main という名前のプロシージャから開始しなければなりませんが、非プライマリスレッドは任意の名前のプロシージャで開始できます。


プロセス

スクリプトエンジンを開始すると、一個のプロセスが作成されます。そしてプライマリスレッドが作成されて、Main プロシージャの実行が始まります。スクリプトエンジンは、複数のプロセスを持つ事ができます。プロセスにはプライマリという概念がありません。したがって、あるプロセスの終了によって他のプロセスが終了する事はありません。


イベント

イベントは「遅延呼び出しプロシージャ」のようなものです。あるイベントがライズされると、同一スクリプトエンジンの全プロセスの全スレッドに対して、それに関連付けられたプロシージャ(ハンドラ)の実行が要求されます。この時、そのスレッドが他のイベントを処理していたり、アイドル時プロシージャを実行していたりすると、ハンドラの実行は遅延されます。

イベントはプロセスをまたいで発生するので、一種のリモートプロシージャコールとして使う事もできます。


例外処理

あるスレッドで例外が発生すると、そのスレッドは強制終了されます。そのスレッドがプライマリであれば、非プライマリスレッドも終了し、結果としてプロセス全体が終了します。例外ハンドラが登録されている場合、プライマリスレッドのアクションスタックがすべて巻き戻されてから、例外ハンドラが実行されます。例外ハンドラが終了すると、プライマリスレッドは終了し、プロセスも終了します。

このように、例外処理は構造化されていません。その理由のひとつは、このスクリプトがゲームの処理を目的として設計されたものであり、例外をキャッチして実行を続ける事はないと判断したためです。ただし開発段階で、ログに例外の内容を出力できなければ不便なので、例外ハンドラという仕様にしました。