徒然なる日々を送るソフトウェアデベロッパーの記録(2)

技術上思ったことや感じたことを気ままに記録していくブログです。さくらから移設しました。

minosys script を作ろう (10)

アーカイブの構成

ここで言うアーカイブとは、複数のファイルを1つのファイルにまとめて
管理することを指します。
UNIX 標準の tar や Windows の zip などがありますが、minosys script
では独自のアーカイブファイル構造が定義されています。

f:id:minosys:20170531064232p:plain

オフセット 長さ(バイト) 意味
+0 4 文字列 'm', 's', 'c', '2'
+4 4 テーブルに定義されている項目数
+8 4 ファイル名へのオフセット
+12 4 ファイル名長
+16 4 ファイル本体へのオフセット
+20 4 ファイル本体の長さ
+n 可変長 文字列またはバイナリ列

数値は全てリトルエンディアンで表現されます。
長さが4バイトしかないため、全体のファイル長は 4Gbytes に制限されます。
動画など長尺のファイルには向きません。

現時点ではアーカイブを作成するツールがありませんが、エンジン本体の
実装を終了次第、実装したいと思っています。
(実行エンジンの実装ではアーカイブは考慮されています。)

インスタンスの表現

minsoys script でのクラスは単純なものです。

  • 全ての変数、メンバー関数は public です。
  • クラスは1つだけ継承できます。
  • メンバー変数名が親クラスと同一である場合、子クラスが優先されます。
  • メンバー関数は常に override されます。
  • super が使えるのはメンバー関数だけです。

minosys script でのクラス定義は例えば、以下のように記述します。

class B : Rect {
  $name;
  B($n0, $x0, $y0, $w0, $h0) {
    $name = $n0;
    super($x0, $y0, $w0, $h0);
  }
}
class A {
  $x; $y; $w; $h;
  A($x0, $y0, $w0, $h0) {
    $x = $x0;
    $y = $y0;
    $w = $w0;
    $h = $h0;
  }
}

メンバー変数名に関する規則から、インスタンス内のメンバー変数は
一意の名前を持ちます。従って、unordered_map< string, Ptr < Var > > に
定義しておくことができます。
メンバー関数は基底クラスまで探索する必要が出てきますが、
クラス定義を記述したインスタンス def を用意しておき、
Instance::def -> { members, parentClass }
とたどることによってこの探索を行うことができます。

このことを踏まえて、minosys script におけるインスタンス変数は
以下のようにクラス定義されています。

class Instance {
 public:
  MinosysClassDef *def;
  unordered_map<string, Ptr<Var> > vars;
};

次回は、実行エンジンにおける関数呼び出しについて見ていきます。