ActionScript3 メモと感想

なんとか時間が出来たので、久しぶりにFlash関係について書いてみる。

ActionScript3.0は「硬い」

初めてActionScriptに触ったのは、AdobeのLiveMotion*1のものだったのだが、さくっと書いてさくっと試せる、まさにスクリプト、という感じのものだった。それがAS2になって段々とJavaっぽく(硬い言語っぽく)なり、そして今回のAS3だ。「実に硬い言語になったなぁ」、という感じである。

AS2までは、言語APIの拡張、という感じで後方互換を保ちながらも機能追加、という感じがするアップデートだったものが、新しい実行環境(AVM2)の搭載を期に一気に言語APIを整理したようだ。特に、描画APIとイベントAPI周りというFlashで最も重要な部分が大分違うので、別言語でFlash(swf)を作成しているかのような感じがする(文法はほとんど同じはずなのだが)。

一般的にスクリプト言語は、結構あいまいな記述でもそのまま動いてしまったりするので「やわらかい」感じがする。対して、CやJavaはちょっとした事ですぐに"怒られる"ので、まるで厳しい教師が付きっ切りで見ているかのような、「硬い」感じがする。じゃあ、AS3はどちらかというと、後者のような感じがする。

例えば、

var t:Number = getTimer();
doSomething();			//とても重い処理
tf.text = getTimer() - t;	//かかった時間を表示

みたいなコードはAS2まではOKだったのが、AS3では型変換がされていないと怒られる*2

var t:Number = getTimer();
doSomething();			//とても重い処理
var t2:Number = getTimer() - t;	//かかった時間を求める
ft.text = t2.toString();	//型変換して表示

このように書く必要がある。これくらいはコンパイラ、あるいは実行エンジンが動的に判断してよろしくやってくれないかなー、と思うのだが、AS3は厳格らしい。このあたり、人間が色々考えなくともコンピュータがよろしくやってくれる、スクリプト言語のメリットが薄れた感じがする。もちろん、最適化とか考えれば型の概念は必要になるのだけれども。基本は型の概念なし、指定すると最適化される、とかいう仕様だったら…、とも思うが、さすがにそれは無理か。

ともかく、AS1/2やJavaScriptやP言語のような、よい意味での柔軟さがAS3では若干スポイルされるのは間違いない。その代わり、実行速度や細かいエラーなどカッチリとコードを書ける利点が増えた。これまではおかしなコードを書いていても、コンパイルさえ通れば何にも教えてくれなかったので、後になっておかしな挙動を見つけて、一体なんでだろうと何時間も悩んだ挙句に見つけたのがケアレスミス、などということもよくあった。ある程度以上のFlashアプリケーションを開発するなら良い改良点だと思う。特にゲーム開発という意味では、アセンブリでごりごりと最適化!というような流れのあるゲームプログラミングのノウハウが今まで以上に使えるようになるだろう。Flash Playerというブラックボックスに阻まれて今まで手を出せなかった部分に、手を突っ込むにはAS3ぐらい「硬く」ないといけないのかもしれない。

もっとも「硬い」と言ってもJavaよりは柔軟性がある感じがする。おそらく最大のライバルになるであろう、Java Appletのように、いちいちオフスクリーンを用意して…といった目的への距離の遠さは感じない。Proce55ingはちょっと齧っただけだが、いい勝負のような気がする。まあ、しかし、普及率とユーザー層の多さを考えると、Flash Player 9とAS3が、辛うじて残っていたJava Appletの領域を侵食して駆逐しそうだ。それから先、クライアントサイドの領域がFlash一辺倒になるかどうかは、AdobeMicrosoftのケンカの結果によるだろうけど。

-profileオプションが気になる

Flash9はまだでていないし、お金もないのでFlex2SDKでAS3をいじっている。コンパイラmxmlcというものでmxmlというxmlかasファイルをコンパイルしてswfを作成する。コンパイラオプションが相当数あるのでいろいろいじっていたら、ドキュメントに載っていない、-compiler.profile/-profileオプションというものを発見。

コンパイルオプションの説明は

generate a movie that is suitable for performance profiling

とだけで、とりあえずtrueにしてみたものの何が変わったのか分からない。検索してもどこにも情報がないので一旦あきらめたものの、非常に気になるオプションだ。

なぜ気になるか、と言えばFlex1/1.5の時には旧Macromedia純正のActionScript Profilerというプロファイラ*3があり、非常に便利そうだったからだ。Flashの場合最適化が必要になるケースが多く、プロファイラがあれば非常に有用なことが予想されたのだが、Flex1/1.5は個人で手の出せる代物ではないので泣く泣くあきらめていた*4Flex2はFlex1/1.5とは若干方向性が異なるものの、おそらくプロファイラはあるだろう、と予想しているのでまさにこれなのではないかと思うのだが…。実は有償版にしかプロファイラは付属しないのだろうか。

fdbを使いこなせたら良さそう

fdbはFlex2SDKにmxmlcなどと一緒に付属するデバッガだ。使い方を調べている途中なのでなんとも言えないが、使いこなせれば便利そうだ(もしかすると、これがプロファイラとして機能するのかもしれない)。

つかうにはちょっとコツがいる。

  • まず、fdbをコマンドラインから立ち上げる
  • コンソールに(fdb)と表示されるのでrunと入力してデバッガを開始する
  • コンパイルオプションで-debug=trueとしたSWFを実行する(※このとき、再生が停止するので注意。SAFlashPlayerなどの場合、ウィンドウが開かないので実行されていないのかと勘違いして何度も実行させようとすると大変なことに。)
  • コンソールでブレイクポイントなどを指定した後、continueと入力
  • SWFが実行再開する

ブレイクポイントなどを指定せず、すぐにcontinueとするだけでもtrace文を拾ってくれたりするのでテキストファイルをいちいち確認する必要がないので便利。基本的にはFlash IDE付属のGUIデバッガと同じように使えるようだ。

*1:Macromedia Flash対抗ソフト。本家よりも使い易い面もあって(とくにタイムライン周りやビヘイビア)気に入っていたのだが、すぐに開発中止になった。

*2:少なくともFlex2SDKのmxmlcでは。

*3:Flash IDEについている、DL速度をエミュレートする"プロファイラ"ではなくて、一般的な開発環境で言うところの、実行時のプロファイラ

*4:AsProfやFlasPなどのフリーのものもあったが、AsProfはAS1専用、FlasPはリンク切れ、と帯に短し襷に長し…