アクセシビリティ

Adobe MAX 2006 フラッシュレポート


Moving from ActionScript 2.0 to ActionScript 3.0
Leo Schuman, ACMI
Customer Training Specialist, Adobe Systems

Leo Schumanは、ColdFusion、Flash、Flex等製品のコースウェアを作成しています。

このセッションでは、ActionScriptの役割、なぜActionScript 3.0(以下AS3)が必要なのか、Flash Player 9では何が新しくなったのか、AS3では何が新しいのか、について包括的な説明を行いました。

ActionScriptは、バージョン3.0への進化することで、よりJavaに近い、完全なオブジェクト指向のスクリプト言語となりましたが、一方で厳密な型指定をしなくてもコンパイルする、柔軟でライトウェイトなスクリプト言語の長所も残しています。とはいえ、従来バラバラであったイベント処理方法を統合したり、APIを整理するなど、全体的な方向としては、より成熟した使いやすい言語へと進化しています。

ActionScript自体は、Flex Data Services、Flex 2、Flash 8、Flash Media Server、Flash Lite 1.1、Flash Lite 2.0といったさまざまな製品群によって構成されるFlash Platform全体を統合する役目を持ったスクリプト言語ということができます。現在のところは、実際に各製品で使われているActionScriptのバージョンにはバラツキがありますが、今後はすべてがひとつの言語によってコントロールされるようになります。

また、ActionScriptは世界標準のECMAScriptに準拠しているのも特徴で、特にAdobe Systemsは次世代のJavaScript、ECMAScript Edition 4 Proposalの策定に深く関わっており、AS3もじつはECMAScript 4をベースに実装されています。つまり、AS3は将来のWeb標準を先取りした言語ということができます。

なぜAS3が必要なのか?それは、Flash Playerが9に進化する際に、まったく新しいVM(仮想マシン)と、そのために専用に設計された言語を必要としたからです。新しいVMとAS3の組み合わせにより、アプリケーションになにか問題が起きたとき、Flash Playerが何もメッセージを発しないまま止まってしまう代わりにプログラマはエラーからのリカバリー方法を実装することができるようになりました。また、変数やオブジェクトの型を厳密に指定することにより、より高速に実行でき、エラーの発生しにくいプログラムを記述することが可能になりました(厳密な型指定をしないことも可能)。またVMを1から設計しなおし、APIを整理し、厳密な型指定を行い、中間コードをあらかじめコンパイルすることにより大幅なパフォーマンスの向上(x10)を見ることができるようになりました。また、イベント処理の流れも整理され、統一されたイベント処理方法が提供されています。

同時に従来からあるVM「VM1」も、この新しいVM「VM2」とともにFlash Player 9には実装されているため、Flash 8以前のバージョンのSWF形式ファイルすべてが問題なく実行されるのです。

その他、AS3で新しくなったこと。具体的には、そのほかにこのような改善がなされています:

  1. データ型が多くなった:AS2のString、Number、Booleanにint(整数)、uint(符号なし整数)、*(明示的に型を指定しないことを示す)。宣言時に値が割り当てられなかった場合は、型によってデフォルトの値が与えられる
  2. 「as」演算子による型変換。「is」演算子による型チェック(AS2のときの「instanceof」演算子に似ているが、振舞いが違う)。
  3. internal、private、protected、public等の関数のタイプ。publicは、AS2のときと違い、他言語と同様にサブクラスからの参照はできない。
  4. パッケージングの宣言のしかたの違い。クラスファイルのトップレベルブロックに記述。
  5. 静的(sealed) vs. 動的(dynamic)クラス。AS2のときは、クラスはすべて動的なクラスであったため、実行時に任意のプロパティ(関数含む)を追加できた。AS3はデフォルトで静的クラス。ただし、クラスをdynamicとマークすれば動的なクラスとして扱われる。
  6. Importについて。AS3クラスの場合は、まずパッケージをインポートして、それからインスタンス化する。
  7. メソッドオーバーライド(overrideとsuper)。AS3のとき、サブクラスが同じメソッドを使う場合は明示的にoverrideしなければならない。
  8. 省略可能パラメータの処理。AS2のときは、引数を2つ受ける関数に3つ引数を渡すと、引数1はそのまま、引数2には渡された引数2と入りきらない引数3が配列として渡される。AS3の場合は、引数の最後に「…rest」としてrest配列を定義すると、そこにすべての余った引数が入る。常にフ定数の引数をとりたければ(…rest)でかまわない。
  9. ディスプレイリストAPI。ステージ上で見えるものはすべてそこから階層構造として展開するDisplayObjectまたはDisplayObjectContainerクラスのツリーである。DisplayObjectにはタイムラインを持たないオブジェクトを指定でき、たいていの場合それ自身にタイムラインを内蔵するMovieClipオブジェクトよりも軽いデータになる。また、ディスプレイリスト構造をとることにより深度の管理がしやすく、任意のタイミングで任意のオブジェクトを階層ツリーから外したり追加することで、オブジェクト階層ごと自由に表示・非表示することができる。
  10. DisplayObject API。いくつかMovieClipのときと変わっている。アルファは%指定ではなく0.0-1.0で指定するなど。MovieClipはInteractiveObjectのサブクラス。ShapeをActionScriptからコントロールすることが可能になった。
  11. イベントハンドリング。AS2のときは、いくつものイベント処理モデルがあった。また、thisを記述する場所によってその指し示すものが変動し、プログラムの可読性が悪かった。AS3は、DOM Level 3に準拠したイベント処理を行う。イベントはディスプレイリストの順番に従って継承されていく。例:Stage⇒DisplayObjectContainer⇒DisplayObjectContainer⇒DisplayObject。Eventオブジェクトにはtargetプロパティがあり、AS2のときのようにDelegateクラスをインポートしなくても、thisの意味が一定するようになった。
  12. E4X。これもECMA標準で、Adobeが深く関わっている。「trace(xmlProd.item[0].desc);」「trace(xmlProd.item(@prodName=='pad').price);」のように、XMLノードを直感的に参照して値を取り出したり割り当てることができる。
  13. 新しいループ構文「for each」。例:「for each(var node:XML in xmlProd.item)」
  14. エラー処理。try、catch、finally、throw。
  15. Socket、XMLSocketクラス。永続的な接続を保持して通信を行う。
  16. RegExpクラス。正規表現。
  17. ファイル操作。FileReferenceクラス。
  18. URLLoaderとURLVariable。LoadVarsクラスの進化版。
  19. point、rectangle、matrixクラス。
  20. AS2のfscommand()はExternalInterfaceクラスで置き換え。

最後に、ActionScript 3についてより深く理解するには、まずマニュアルを読むこと、そして他にもWeb上に有用なリソースがあることを指摘し、盛りだくさんのセッションは終了となりました。

「Flex 2 LiveDocs」
http://livedocs.macromedia.com/flex/2_jp/

「ActionScript 2.0の移行」
http://livedocs.macromedia.com/flex/2_jp/langref/migration.html