asc_authoring.jar で遊んでみた

ActionScript の勉強会で話してキタ! - IT戦記 のプレゼンで、asc_authoring.jar を使った開発が紹介されていたので早速ためしてみました。

asc_authoring.jar の入手

プレゼンにもあるように、まずは Flash 9 Alpha をインストールして asc_authoring.jar を入手します。

バイトコードを作ってみる

プレゼンをたよりに実験します。

// Test.as
package {
  public class Test {
    public function Test() {
      trace("Test");
    }
  }
}

という Test.as があったとして

java -jar asc_authoring.jar \
  -import global.abc \
  -import playerglobal.abc \
  Test.as

とすれば、コンパイルは完了。バイトコードに相当する Test.abc ができます。abc という拡張子は ActionScript ByteCode の略なんだろうな。

SWF を作ってみる

SWF を作るには、Sprite クラスを継承したクラスを用意する必要があります。

// MySprite.as
package {
  import flash.display.*;
  import flash.text.*;
  public class MySprite extends Sprite {
    public function MySprite() {
      var test:Test = new Test();
      var text = new TextField();
      text.width = 400;
      text.text = 'MySprite';
      addChild(text);
    }
  }
}

手始めに mxmlc でコンパイルする場合を紹介します。

mxmlc -default-size 400 300 MySprite.as 

これだけで MySprite.swf が出力できます。

MySprite.as で Test.as を参照しているのですが、そのへんも自動的に判別してリンクしてくれています。


では、次に本題の asc_authoring.jar でのコンパイルをしてみましょう。SWF を作るには -swf でルートになる Sprite クラスを指定します。

# !!実行時エラー!!
java -jar asc_authoring.jar \
 -import global.abc \
 -import playerglobal.abc \
 -swf MySprite,400,300 \
 MySprite.as

これで MySprite.as はできるのですが、Test クラスが SWF に含まれていないため、実行時に参照エラーになります。

実行時エラーがいやん、という人は -strict をつければコンパイル時にエラーになります。

# !!コンパイル時エラー!!
java -jar asc_authoring.jar \
 -strict \
 -import global.abc \
 -import playerglobal.abc \
 -swf MySprite,400,300 \
 MySprite.as

[Compiler] Error #1180: Call to a possibly undefined method Test.
   MyScript.as, Ln 7, Col 27:
         var test:Test = new Test();
   ..........................^

1 error found

さてさて、参照エラーを解決するには -in パラメータを使って、必要なクラスを列挙してやる必要があります。ここでは、Test.as があればいいので、-in Test.as ですね。

java -jar asc_authoring.jar \
 -import global.abc \
 -import playerglobal.abc \
 -in Test.as \
 -swf MySprite,400,300 \
 MySprite.as

これで成功。


ソースコードからではなく ByteCode をリンクしてみたい気もします。直感的には -import Test.abc を使って次のようにできそうなんですが....

# !!実行時エラー!!
java -jar asc_authoring.jar \
 -import global.abc \
 -import playerglobal.abc \
 -import Test.abc \
 -swf MySprite,400,300 \
 MySprite.as

コンパイルもできるんだけど、実行時に参照エラーになっちゃう。

MySprite.swf をバイナリエディタで覗いてみると、確かにこの場合だと Test.abc の中身が MySprite.swf には含まれていないご様子。

ByteCode のリンクはできないんだろうか・・・。

strict について補足

strict の話がでたのでついでに補足。mxmlc はデフォルトで strict オン、asc_authoring.jar はオフになってます。切り替えるにはこうします。

ONOFF
asc_authoring.jar-strict(デフォルト)
mxmlc(デフォルト)-strict=false

まとめ

mxmlc と asc_authoring の違いを感覚的にまとめてみるとこんな感じ。

  • mxmlc
    • 依存関係を自動的に探して、まとめてコンパイル・リンクしてくれる賢い人
    • 吐けるのは .swf のみ
    • Sprite クラスを継承した ActionScript や MXML 以外はコンパイルできない
  • asc_authoring.jar
    • コンパイルやリンクはできるけど、手取り足取り依存関係を教えてあげなきゃいけない面倒な人
    • .swf だけでなく、.abc も吐ける
    • どんなクラスでもコンパイルできる

asc_authoring.jar は手間はかかるけど、ネイティブに近い分だけかわいい。Tamarin の avmplus.exe から直接 .abc を扱えるから余計にかわいく見えるのかな。