機能の動的ロードに関して。その2
あれから、考え直して、別の方法を採用することにしました。
ヘッダファイルのないライブラリのロードに関しては、昨日の方式を使うことにして、ヘッダファイルを用意した場合には、以下のように名前解決を終えた状態にしておくことにしました。
以前、Flashのために書いた関数などをそのまま呼べると良いと思うのですが、葵仮想マシン上で利用する場合、Flash側の関数内では、葵側のスタックの状態とか変数にアクセスする必要があるので、結局、既存の関数を使いまわすことはできず、葵の仮想マシン用にラップ関数を書かないといけないのは仕方がない部分です。(変数の型やオブジェクトも違うので。)
しかし、プラグインを書く側にしてみれば、できるだけ手軽に書いて利用したいものです。そうなると、昨日のような「(Flash SWFファイル名)の(関数名)をライブラリ実行」という方法で実行してもらうのが楽です。
そして、ライブラリ利用者のことを考えて、システム関数と同じように使ってもらいたい場合は、葵関数名とライブラリ関数名の対応定義を必ず作ってもらい、以下のようなヘッダファイルを用意することで、組み込みの関数と同じように動かすことができるようにします。
### ライブラリ・ヘッダファイル(案1) ### ●日本語関数名(引数定義)="Flashファイル名"@"関数名" ●切り取る(SのBまで)="stringlib"@"str_token" ●区切る(SRCをSPLITTERで)="stringlib"@"str_split" ●累乗(Nの,Eを)="mathlib"@"power"
ただ、この形式だと中間コード内に、ロードするFlashファイル名に加えて、全ての関数名を埋め込まなくてはなりません。WindowsのEXEファイルもバイナリファイルでみると、名前を解決するために関数名が羅列されている領域があります。
葵は将来的に携帯電話でも動かすことを念頭に置いてますので、できるだけ小さいデータにしたいと思います。そこで、ライブラリ名はファイルをロードしないといけないので最低限必要としても、関数を番号で呼ぶ形式にしたいと思います。
### ライブラリ・ヘッダファイル(案2) ### ●日本語関数名(引数定義)="Flashファイル名"@番号 ●切り取る(SのBまで)="stringlib"@3 ●区切る(SRCをSPLITTERで)="stringlib"@5 ●累乗(Nの,Eを)="mathlib"@2
ライブラリを書く場合には、番号で関数を呼ぶような関数を必ず作るようにしておけば、名前解決の時間も節約できます。
// ライブラリ作成例 class stringlib { function aoilib_call(func_no, arg) { switch (func_no) { case 3: str_token(arg); case 5: str_split(arg); } } function str_token(arg) { .. } function str_split(arg) { .. } function aoilib_init() {} function aoilib_fin() {} }
今、システム関数も配列番号で管理しているだけなので、これでユーザーの作ったライブラリでもこれまでと同様の形式で関数が呼べることになります。
以下のような、単純な形式で間に合います。
CALL_SYS(システム関数番号) CALL_LIB((ライブラリ番号<<8)+関数番号)
ライブラリが1番で関数番号2番の関数を呼ぶ場合には、CALL_LIB(0x102)と書けば良いことになります。
1つのライブラリ内の関数が、8bit(256個)を超えることもありそうですが、当面は大丈夫だと思います。