minosys script を作ろう (10)
アーカイブの構成
ここで言うアーカイブとは、複数のファイルを1つのファイルにまとめて
管理することを指します。
UNIX 標準の tar や Windows の zip などがありますが、minosys script
では独自のアーカイブファイル構造が定義されています。
オフセット | 長さ(バイト) | 意味 |
---|---|---|
+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; };
次回は、実行エンジンにおける関数呼び出しについて見ていきます。