サイトトップ

Director Flash 書籍 業務内容 プロフィール

Optimizing Performance of ActionScript 3.0

Chapter 01 文法の基本から

□01-01 変数と関数にはデータ型を指定する

ActionScript 3.0の解説書は、変数や関数にはデータ型を指定しましょうと説きます。もっとも、型指定しなくても、文法上は問題なく動きます。そうであれば、なぜわざわざしなくてもいい手間をかけるのでしょうか。それは、データ型が定められていると、スクリプトの誤りを減らすことができ、その質も高められるからです。利点は大きく3つ挙げられます。

    【型指定の利点】
  1. 処理が最適化される
  2. 型チェックによるエラーが返される
  3. コードヒントが表示される

01-01-01 変数と関数への型指定の仕方
利点の理由を説明する前に、変数や関数に対する正しい型指定の仕方を、簡単に確かめておきましょう。まず、変数はvar宣言するとき、変数の後のコロン(:)に続けてデータ型を添えます。

var 変数:データ型;
変数 = 値;

変数の宣言と初期値の代入は、1行のステートメントで済ませることもできます。

var 変数:データ型 = 値;
スクリプト01-01-001【○】変数にデータ型を正しく指定
  1. var i:int;   // 初期値は代入しなくてもよい(int型のデフォルト値は0)
  2. var my_str:String = "text";

スクリプト01-01-002【×】変数にデータ型の指定がないと最適化されない
  1. var i;
  2. var my_str = "text";

つぎに関数の引数は、変数と同じく、後のコロン(:)に続けてデータ型を指定します。また、関数呼出しの括弧()の後にコロン(:)をつけると、戻り値の型指定ができます。戻り値がないときは、voidをデータ型とします。

function 関数(引数:データ型):戻り値のデータ型 {
  // 処理内容
  return 戻り値;
}
スクリプト01-01-003【○】関数の引数と戻り値に正しくデータ型を指定
  1. function add(i0:int, i1:int):int {
  2.   return i0 + i1;
  3. }

スクリプト01-01-004【×】関数の引数と戻り値にデータ型の指定がないので最適化されない
  1. function add(i0, i1) {
  2.   return i0 + i1;
  3. }

Basics 01-01-001■変数の使い方と関数の定義
変数の使い方についてはgihyo.jp連載「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第3回「変数を使う」<http://gihyo.jp/dev/serial/01/as3/0003>、関数の定義と実行などの基本は同第4回「関数を使ってパーツ化する」<http://gihyo.jp/dev/serial/01/as3/0004>をお読みください。

実践の例としては、後述03-01-01のようにforループなどの「繰返し処理のカウンタ変数は整数型で指定する」ことが挙げられます(後述03-01-02「Array.lengthプロパティの値は予め変数にとる」も、併せてご参照ください)。カウンタ変数をはっきりと整数(intまたはuint型)で指定することにより、繰返し処理は速めることができます。

スクリプト01-01-005【○】カウンタ変数を整数型で指定してプロパティ値も変数にとる
  1. var nLength:uint = my_array.length;
  2. for (var i:uint = 0; i < nLength; i++) {
  3.   var element:Object = my_array[i];
  4.   trace(element);
  5. }

スクリプト01-01-006【×】カウンタ変数に型指定がなくプロパティ値を繰返し参照
  1. for (var i = 0; i < my_array.length; i++) {
  2.   var element:Object = my_array[i];
  3.   trace(element);
  4. }

Basics 01-01-002■forステートメントを使ったループ処理
forステートメントを使ったループ処理の基本については、gihyo.jp連載「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第23回「クラスのデザインとループ処理」<http://gihyo.jp/dev/serial/01/as3/0023>の「ループ処理で複数のインスタンスを生成する」(4ページ)をお読みください。


Tips 01-01-001■データ型とデフォルト値
データ型を指定した変数に初期値を与えないと、デフォルト値として扱われます。ActionScript 3.0で使われるデータ型と、そのデータ型を指定した場合のデフォルト値および取りうる値は、次表01-01-001のとおりです([ヘルプ]の[ActionScript 3.0の学習]<http://help.adobe.com/ja_JP/as3/learn/>/[ActionScript言語とシンタックス]/[データ型]/[データ型の記述]参照)。

表01-01-001■データ型とデフォルト値
データ型 デフォルト値
*(なし) undefined 任意の値
Boolean false trueまたはfalse
int 0 32ビット符号付き整数
Null 型指定に用いることはできない null
Number NaN 64ビット浮動小数点数
String null 16ビット文字列
uint 0 32ビット符号なし整数
void undefined undefined
クラス(リファレンス型データ) null クラスのインスタンス

String型データのデフォルト値がnullであることには、注意しなければなりません。nullに対しては、Stringクラスのプロパティやメソッドへのアクセスが許されません(図01-01-001上図)。また、String型のプロパティに代入しようとしても、[コンパイルエラー]になることがあります(図01-01-001下図)。詳しくは、F-site「変数には初期値を与える」<http://f-site.org/articles/2010/07/31041620.html>をご参照ください。

図01-01-001■nullはプロパティ・メソッドにアクセスできずString型プロパティに代入もできない


nullを参照してクラスのプロパティやメソッドにはアクセスできず、String型のプロパティにも代入できない。


01-01-02 型指定はバイトコードを最適化する
FlashのActionScriptは、記述したままで直ちには実行できません。スクリプトは一旦SWFに書出す(コンパイルする)必要があります。このとき、ActionScriptは記述したコード(ソースコード)のまま書出されるのでなく、「バイトコード」と呼ばれるFlash Player向けの命令に変換されます。その命令は、MacintoshやWindowsといったプラットフォームを問わず共通のSWFファイル形式で、Flash Playerのいわば通訳を必要とします。バイトコードは、ソースコードとコンピュータが実行する機械(マシン)語(ネイティブコード)の中間言語にあたります。

Word 01-01-001■バイトコード
バイトコード」とは、特定のオペレーティングシステム(OS)やハードウェアに依存しない命令で記述されたプログラムです。ソースコードとネイティブコードの中間の形式に当たります。命令をすべて1バイトで表現し、プログラムのサイズを小さく抑えていることから、バイトコードと呼ばれるようになりました。

バイトコード形式のプログラムを動作させるには、バイトコードを解釈してその環境のネイティブコードに変換する「仮想マシン」と呼ばれるソフトウェアが必要です。Flash Playerは、この仮想マシンの役割を果たします。アプリケーションをバイトコードで配布すれば、仮想マシンが実装されているOS上なら、環境を問わずにそのアプリケーションを実行できることが利点です。

バイトコード形式をサポートしているプログラミング言語の代表はJavaです。そのため、Javaのバイトコード(Javaバイトコード)のことを単に「バイトコード」と呼ぶこともあります。

ActionScript 3.0は、Flash Playerの最適化されたAVM2(ActionScript Virtual Machine 2)で動作します(図01-01-002)。そして、SWFファイルに書出されたActionScript 3.0のバイトコードを、Flash PlayerのAVM2が解釈・実行します。データ型を指定すると、AMV2が型の情報にもとづいてデータを扱うようバイトコードは最適化されるのです。そのため、パフォーマンスが高まり、使うメモリも少なくできます。

図01-01-002■ActionScript 3.0はAVM2上で動作する

Flash Player 9以降に備わったAVM2が、ActionScript 3.0を解釈・実行する。


Links 01-01-001■AVM2とデータ型の指定による処理の最適化
AVM2(ActionScript Virtual Machine 2)について詳しくは、gihyo.jp連載「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第1回「Flash Player 9とActionScript 3.0」<http://gihyo.jp/dev/serial/01/as3/0001>の「Flash Player 9とは」をお読みください。

データ型の指定による処理の最適化については、Adobeデベロッパーセンター「ActionScript 3.0の概要」<http://www.adobe.com/jp/devnet/actionscript/articles/actionscript3_overview.html>の「言語の機能」およびマイコミジャーナル「ActionScript、Flex、そしてApollo - Flexエバンジェリストに訊くAdobe開発ツールの現在」<http://journal.mycom.co.jp/articles/2006/10/31/adobeflex/001.html>の「型指定はパフォーマンスを最適化する」をご参照ください。


01-01-03 型のチェックとコードヒント
型指定による恩恵は、処理の最適化だけではありません。指定されたデータ型にもとづき、コンパイル(SWF書出し)時とランタイム(Flash Player上での動作時)に型のチェックが行われます。そして問題があると、エラーとしてその情報が示されます。それを手がかりにすれば、早期に問題が解決できます。

また、データ型を指定するとデフォルトでは、使えるプロパティやメソッドが「コードヒント」として自動的に表示されます(図01-01-003)。これにより、スクリプティングが楽になるだけでなく、間違いを防げます。

図01-01-003■データ型を指定すると「コードヒント」が表示される

指定したデータ型に応じて、使えるプロパティやメソッドがリストされている。また、Flash Professional CS5からはimport宣言が自動的に加えられる。


Tips 01-01-002■Flash Professional CS5のコードヒントとimport宣言
Flash Professional CS5からは、型指定をするとimport宣言が自動的に加えられるようになりました(前掲図01-01-003参照)。また、new演算子の後のコンストラクタメソッドも、コードヒントから選べます(F-site「コードヒントとimport宣言」<http://f-site.org/articles/2010/05/22011806.html>参照)。なお、カスタムクラスについても、型指定をすればコードヒントが表示されます。


01-01-04 Objectよりもカスタムクラスを定義する
Objectインスタンスには、複数のプロパティを自由につくって値が入れられるので便利です。けれども逆に、設定できるプロパティを予め決めたり、データ型の指定ができません。つまり、最適化を考えたときに不満が生じます。たとえば、ID番号の整数と名前の文字列を納めたオブジェクトがほしいとします。Objectインスタンスでは、ID番号と名前を入違っても、プロパティにデータ型が指定できないので何もエラーは起こりません(図01-01-003)。

スクリプト01-01-007【△】Objectインスタンスは便利なもののプロパティに型指定できない
  1. var myData:Object = {};
  2. myData.id = 1;
  3. myData.firstName = "fumio";

図01-01-003■Objectインスタンスのプロパティにはデータ型が指定できない

ID番号のプロパティに文字列、名前のプロパティに数値を入れても、データ型が指定できないのでエラーは起こらない。

クラスの定義をすでに学習された方は、このような場合データを納めるためのクラスをつくればよいでしょう(スクリプト01-01-008)。クラスのプロパティにはデータ型が指定できます(第6〜7行目)。ドットアクセスすれば強い参照になるので、処理が最適化されます。もちろん、型のチェックも行われます(図01-01-004)。

スクリプト01-01-008【○】カスタムクラスを定義すればプロパティが型指定できる
  1. var myData:PersonalData = new PersonalData();
  2. myData.id = 1;
  3. myData.firstName = "fumio";

クラス定義
  1. package {
  2.   public class PersonalData {
  3.     public var id:uint;
  4.     public var firstName:String;
  5.     public function PersonalData() {}
  6.   }
  7. }

図01-01-004■クラスのプロパティはデータ型が指定できる

型指定したプロパティにはチェックが働くので、データ型が違えば[コンパイルエラー]になる。


Basics 01-01-003■カスタムクラスを定義する
クラスの定義の仕方については、gihyo.jp連載「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第18回「カスタムクラスを定義する」<http://gihyo.jp/dev/serial/01/as3/0018>をお読みください。


[*筆者用参考]

Assigning values to several types of variables - wonderfl build flash online


作成者: 野中文雄
更新日: 2011年2月14日 表01-01-001に、データ型として*(なし)を加えた。
更新日: 2011年1月23日 スクリプトに連番と行番号を追加。基礎知識としてのgihyo.jpのリンクをBasicsとした。
更新日: 2011年1月20日 Linksを追加。
更新日: 2011年1月15日 例のタイトルを具体化。
作成日: 2010年10月19日


Copyright © 2001-2011 Fumio Nonaka.  All rights reserved.