Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome or Safari browser. Firefox 10 (to be released soon) will also handle it.

FxUG 第172回 勉強会@名古屋

ActionScriptCompiler2.0 について

@ton1517

こんにちは

tonです ton1517 icon Twitter: @ton1517

ActionScriptCompiler2.0挙動と新機能について話します

このスライドはActionScriptCompiler2.0 Preview3

時点の情報を元にしています

ActionScriptCompiler2.0って?

長いからASC2.0って言うね

ASC2.0とは

Falconコンパイラは現在Apacheに寄贈されオープンソースとして公開されています

-check-

GitHub Mirror of Apache Flex Falcon

今までのと何がちがうの?

-check-

Adobe ActionScript Compiler 2.0 Release Notes

ASC2.0を使うには?

FlashBuilder4.7 Beta をダウンロードしましょう。Betaなので誰でも無料で使えます。

FB4.7にはASC2.0が同梱されておりデフォルトのコンパイラとなっている

注意

ASC2.0でのAS3の挙動の変更点

コードの厳格化や最適化のために一部挙動が変更された

変更点

いくつかピックアップしてみていきましょう

-check-

ActionScript Compiler 2.0 Backward Compatibility

ActionScript の新しいコンパイラ ASC 2.0 の変更点一覧

新たなキーワード

public,protected,private,default,internal,goto

-example-

var mc:MovieClip = new MovieClip();
mc.public = "publicだよ";
mc.protected = "protectedだよ";
mc.private = "privateだよ";
mc.default = "defaultだよ";
var internal:String = "internal";
var goto:String = "goto";

変数の重複 1

関数の引数とローカル変数の重複を警告

-example-

function duplicate1 (foo:String):void {
    var foo:String = "hugahuga";
    trace(foo);  //hugahuga
}

変数の重複 2

関数の引数とローカル定数の重複を禁止

-example-

function duplicate2 (foo:String):void {
    const foo:String = "hugahuga";
    trace(foo); //旧:hugahuga, 新:実行できない
}

変数の重複 3

forループ内での変数と定数の重複

-example-

for(var i:int = 0; i < 3; i++){
    const i:int = 100;
    trace(i); //旧:100, 新:実行できない
}

変数の重複

ASC2.0では

名前空間

異なる名前空間で同名の名前をつけられるように

-example-

public function namespaceTest():void {
    trace("public namespace");
}
private function namespaceTest():void {
    trace("private namespace");
}

Vector

Vectorの型指定は1つのみ

複数指定した場合は

-example-

var vec:Vector.<int, String, ASC2Test>;
vec = new Vector.<int, String, ASC2Test>();

定数のインクリメント

定数のインクリメントとデクリメントの禁止

-example-

const i:int = 1;
i++;
trace(i) //旧:2, 新:エラー

ローカル定数の初期化

ローカル定数の初期化タイミングが変更

-example-

var hoge:int = foo;
const foo:int = 10;
hoge += foo;
trace(hoge); //旧:10, 新:20

定数の評価

多くの定数がコンパイル時に評価されるように

-example-

public static const NUM:int = 10 + 20;
//旧:実行時に10+20で初期化
//新:コンパイル時に30にする

static constの初期化

static constの初期化順序が変更

複合代入演算子

複合代入演算子の左辺の評価は1度のみ

-example-

var obj:Object = new Object();
obj.a = 0;
function getObj():Object {
    obj.a++;
    return obj;
}
getObj().a += 10; //旧:12, 新:11

条件式での代入

条件式での代入に対して警告

-example-

var x:int = 0;
if(x = 3){ //新:警告
    trace(x);
}

このくらいでいいよね・・・

次は、インライン展開

インライン展開って?

インライン展開とは

関数の中身をそこに直接書いちゃえっていう機能

こんな関数があるとき

function hoge():void{ this.a = 10; }

普通に呼び出すと

function test():void{ hoge(); }

インライン展開すると...

function test():void{ this.a = 10; }

関数の中身がその場に展開される!

インライン展開される条件

インライン展開させるにはいろいろな条件を満たさなければいけません

-check-

Introducing ASC 2.0

ASC2.0 のインライン化機能

1. -inline コンパイラ引数

-inline という文字列をコンパイラ引数に追加してください

これがないと絶対にインライン展開してくれません

2. [Inline] メタタグ

関数宣言の直前に [Inline] メタタグをつける

getter/setterは[Inline]タグがなくてもインライン展開可能

 

-example-

final public function get hoge():Number{
    trace("この関数はインライン展開できます");
    return _hoge;
}
final public function cannotInline():void{
    trace("この関数はインライン展開されません");
}
[Inline]
final public function canInline():void{
    trace("この関数はインライン展開できます");
}

3. final/static修飾子

インライン展開させたい関数/アクセサには必ずfinal修飾子かstatic修飾子をつける

 

-example-

public function get hoge():Number{
    trace("この関数はインライン展開されません");
    return _hoge;
}
[Inline]
public function cannotInline():void{
    trace("この関数はインライン展開されません");
}
[Inline]
static public function canInline():void{
    trace("この関数はインライン展開できます");
}

ex. final class の場合

クラスがfinalになっている場合、メソッドやアクセサにfinal/static修飾子をつけなくても インライン展開される

ただしメソッドに[Inline]メタタグは必要

4. ネストされた関数を持ってはいけない

ということらしい

要するにネストされた関数はダメってこと(多分)

 

-example-

//インライン展開できません
[Inline]
final public function cannotInline():void{
    var aa:Number = 10;
    var f:Function = function():void{
        trace(aa);
    }
    f();
}

 

-example-

//これもダメです
[Inline]
final public function cannotInline2():void{
    function buta():void{
        trace("インライン展開できないよ");
    }

    buta();
}

 

-example-

private function methodHoge():void{
    trace("ただのメソッドです");
}

//他のメソッドを呼ぶだけならインライン展開可能
[Inline]
final public function canInline():void{
    trace("インライン展開できます");
    methodHoge();
}

5. try-catch文を含めない

関数の中にtry-catch文があるとインライン展開されません

-example-

[Inline]
final public function tryTest():void{
    try{
        throw new Error("インライン展開できません");
    }catch(e:Error){
        trace(e.getStackTrace());
    }
}

6. with文を含めない

with文を持つ関数はインライン展開できません

-example-

[Inline]
final public function tryWith():void{
    with(graphics){
        beginFill(0x0077ff);
        drawCircle(10, 10, 50);
        endFill();
    }
}

7. 関数の中身のABCの行数が50以下であること

コンパイルした際のActionScriptByteCode(ABC)の行数が50以上になると インライン展開されなくなります


ASC2.0 Preview 3 から

[Inline]タグをつけた場合この制限は無視され、どんな大きい関数でもインライン展開される

8. サブクラスまたはインターフェース経由で呼び出さない

サブクラスまたはインターフェース経由で呼び出した場合はインライン展開されません

-example-

//これはインライン展開されます
var test2:ExInline = new ExInline();
test2.hoge();

//これはインターフェース経由で呼び出しているのでインライン展開されません
var test:IInline = new ExInline();
test.hoge();

とりあえず気をつけとくこと

このくらい

ちなみに

ちゃんとインライン展開できてるか確認するには

SWF Investigator

使ってABCを確認すればよい

速度比較

デモ。時間あれば

ASC2.0楽しいよ!

Monocleまだー?

おわり。

GitHub

このスライドはGitHubで公開しています。

https://github.com/ton1517/FxUGNagoya172-slide

http://ton1517.github.com/FxUGNagoya172-slide/

Use a spacebar or arrow keys to navigate