という選択肢ももはや夢では無いですよね。Tamarinのおかげで、高速、マルチプラットフォーム、オープンソースでガベコレ付きなAS実行環境が誰にでも手に入るようになった訳です。
IT戦記さんの、1月30日のエントリの資料では、ASのコンパイルとTamarinでの実行を実際にやってみた記録が書かれてます。これを見ると、何となく新しい可能性を感じませんか?
そういえばFlex Builder 2.0.1から、やっと独自のメタデータの保持が出来るようになりました。
コンパイラオプションに、
-keep-as3-metadeta Hoge Fuga
と「keep-as3-metadata」オプションに続けて保持させたいメタデータ名を列挙するか、
<?xml version="1.0"?>
<flex-config xmlns="http://www.adobe.com/2006/flex-config">
<compiler>
<keep-as3-metadata>
<name>Hoge</name>
<name>Fuga</name>
</keep-as3-metadata>
</compiler>
</flex-config>
という設定ファイルを「metadeta-config.xml」等の名前で作って、コンパイラオプションで
-load-config+=metadeta-config.xml
とかすれば、
[Hoge(foo = "aaa")]
public class Sample
{
[Fuga(bar = "bbb", baz="ccc")]
public var val:String;
}
てな感じでメタデータを書いたときに、それがそのままバイトコードに埋め込まれます。flash.utils.describeTypeを使うと、実行時に取得できます。
「それActionScriptでやる必要あるの?」的なものをあえて実装したい身としては、やっぱりActionScript3でもスクリプトエンジン作りたいよね。で、やるからにはAS3だからこそ出来るモノを作りたい。
そうなると、実はもうやるべきことはほとんど決まってくる。それは、「言語仕様はECMAScript4で、ActionScriptByteCode(ABC)にコンパイルして、ネイティブ実行」。
ECMAScript4は、ご存知ActionScript3.0のベースとなってる言語仕様。
ActionScriptByteCode(ABC)ってのは、その名の通り、ActionScriptで使われてるバイトコード。AS3から採用。FlashやFlexでActionScriptをコンパイルすると、全てこのABCってヤツに変換されるわけです。フォーマットについては、Tamarin参照。つまり、ABCコンパイラを作っておけば、ASとの高い互換性を確保できると。
で、このABCをネイティブ実行。ASでそんなこと出来るの?って思うかもしれないけど、理論的には可能なはず。ABCをSWFで包んで、Loaderに読み込ませて、ApplicationDomainからClassをgetDefinitionすれば、めでたく本物のクラスが取り出せる(はず)。これを利用して、ABCを本物のAVM上で実行する。ただ、念のために自前のAVMも作っておいた方がいいかなぁ。
これが実現できると、まさに「ActionScript3.0上でActionScript3.0が動く」環境が整う。動的コンパイルとか、アスペクトなんかに応用できるんじゃないかなー。
と、妄想を垂れ流しつつ、いつやるかは分からないで終了。やるならSparkのプロジェクトとしてやります。
