仮想マシン Edit

実装のためのメモやら設計方針やらを書いておくページ。

構成 Edit

  • 1つのScriptVM
  • 1つ以上のScriptContext

ScriptVM Edit

  • 仮想マシン。
  • コンパイル済みの命令コード,ユーザー定義型の初期化データ(.init)を持つ。
  • staticなデータはこいつが持ち,複数のContextで共有することになる。

ScriptContext Edit

  • コンテキスト。スレッド。
  • スタック,レジスタは各ScriptContextがそれぞれ持つ。

ScriptVM Edit

手順 Edit

  • セットアップ前準備(ユーザーがやる)
    • コンパイル済みのスクリプトコードの追加。
    • 関数,クラス類,変数類のC++とのバインド。
  • セットアップ
    • 1) リンク&未解決シンボルのチェック。
    • 2) staticデータに.initデータをコピー。
    • 3) 各クラスのstaticコンストラクタ&statinc invariant()を実行。
  • ファイナライズ
    • 1) 全ScriptContextが終了していることを確認。
    • 2) ガベージコレクトを実行。
    • 3) 各クラスのstatic invariant()&staticデストラクタを実行。
    • 4) ガベージコレクトを実行。
    • 5) ゴミが残っていないかチェック。

ScriptContext Edit

実行開始手順 Edit

  • (ユーザーがやる)
  • エントリーポイントとなる関数とその引数を設定。

インスタンスの生成手順 Edit

  • メモリ領域は確保済みとする。
  • 1) .initデータを領域にコピー。
  • 2) コンストラクタがあれば実行。
  • 3) invariantがあれば実行。
  • 4) scopeなclassもしくはstructなオブジェクトならデストラクタスタックに自身を追加

関数に入るときの手順 Edit

  • 1) 関数スタックにプッシュ

関数から抜けるときの手順 Edit

  • 1) 関数スタックの情報を元に,デストラクタスタックに積まれているオブジェクトを必要なだけポップ&実行
  • 2) 関数スタックからポップ

メンバ関数に入るときの手順 Edit

  • 1) publicなメンバ関数の呼び出しならinvariantがあれば実行。
  • 2) 『関数に入るときの手順』を実行

メンバ関数から抜けるときの手順 Edit

  • 1) 『関数から抜けるときの手順』を実行
  • 2) publicな関数の呼び出しならinvariantがあれば実行。

コンストラクタの手順 Edit

  • 1) 『関数に入るときの手順』を実行
  • 2) structメンバ変数をデストラクタスタックにプッシュ
  • 3) 関数本体を実行
  • 4) invariantがあれば実行
  • 5) コンストラクトが正常に終了したと判断したので,デストラクタスタックに追加済みのstructメンバ変数をポップ。
  • 6) 『関数から抜けるときの手順』を実行

デストラクタの手順 Edit

  • 1) 『関数に入るときの手順』を実行
  • 2) invariantがあれば実行
  • 3) 関数本体を実行
  • 4) 『関数から抜けるときの手順』を実行

    ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS