tonです Twitter: @ton1517
このスライドはActionScriptCompiler2.0 Preview3
時点の情報を元にしています
長いからASC2.0って言うね
Falconコンパイラは現在Apacheに寄贈されオープンソースとして公開されています
FlashBuilder4.7 Beta をダウンロードしましょう。Betaなので誰でも無料で使えます。
FB4.7にはASC2.0が同梱されておりデフォルトのコンパイラとなっている
コードの厳格化や最適化のために一部挙動が変更された
いくつかピックアップしてみていきましょう
public,protected,private,default,internal,goto
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";
関数の引数とローカル変数の重複を警告
function duplicate1 (foo:String):void {
var foo:String = "hugahuga";
trace(foo); //hugahuga
}
関数の引数とローカル定数の重複を禁止
function duplicate2 (foo:String):void {
const foo:String = "hugahuga";
trace(foo); //旧:hugahuga, 新:実行できない
}
forループ内での変数と定数の重複
for(var i:int = 0; i < 3; i++){
const i:int = 100;
trace(i); //旧:100, 新:実行できない
}
ASC2.0では
異なる名前空間で同名の名前をつけられるように
public function namespaceTest():void {
trace("public namespace");
}
private function namespaceTest():void {
trace("private namespace");
}
Vectorの型指定は1つのみ
複数指定した場合は
var vec:Vector.<int, String, ASC2Test>;
vec = new Vector.<int, String, ASC2Test>();
定数のインクリメントとデクリメントの禁止
const i:int = 1;
i++;
trace(i) //旧:2, 新:エラー
ローカル定数の初期化タイミングが変更
var hoge:int = foo;
const foo:int = 10;
hoge += foo;
trace(hoge); //旧:10, 新:20
多くの定数がコンパイル時に評価されるように
public static const NUM:int = 10 + 20;
//旧:実行時に10+20で初期化
//新:コンパイル時に30にする
static constの初期化順序が変更
複合代入演算子の左辺の評価は1度のみ
var obj:Object = new Object();
obj.a = 0;
function getObj():Object {
obj.a++;
return obj;
}
getObj().a += 10; //旧:12, 新:11
条件式での代入に対して警告
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; }
関数の中身がその場に展開される!
-inline という文字列をコンパイラ引数に追加してください
これがないと絶対にインライン展開してくれません
関数宣言の直前に [Inline] メタタグをつける
getter/setterは[Inline]タグがなくてもインライン展開可能
final public function get hoge():Number{
trace("この関数はインライン展開できます");
return _hoge;
}
final public function cannotInline():void{
trace("この関数はインライン展開されません");
}
[Inline]
final public function canInline():void{
trace("この関数はインライン展開できます");
}
インライン展開させたい関数/アクセサには必ずfinal修飾子かstatic修飾子をつける
public function get hoge():Number{
trace("この関数はインライン展開されません");
return _hoge;
}
[Inline]
public function cannotInline():void{
trace("この関数はインライン展開されません");
}
[Inline]
static public function canInline():void{
trace("この関数はインライン展開できます");
}
クラスがfinalになっている場合、メソッドやアクセサにfinal/static修飾子をつけなくても インライン展開される
ただしメソッドに[Inline]メタタグは必要
ということらしい
要するにネストされた関数はダメってこと(多分)
//インライン展開できません
[Inline]
final public function cannotInline():void{
var aa:Number = 10;
var f:Function = function():void{
trace(aa);
}
f();
}
//これもダメです
[Inline]
final public function cannotInline2():void{
function buta():void{
trace("インライン展開できないよ");
}
buta();
}
private function methodHoge():void{
trace("ただのメソッドです");
}
//他のメソッドを呼ぶだけならインライン展開可能
[Inline]
final public function canInline():void{
trace("インライン展開できます");
methodHoge();
}
関数の中にtry-catch文があるとインライン展開されません
[Inline]
final public function tryTest():void{
try{
throw new Error("インライン展開できません");
}catch(e:Error){
trace(e.getStackTrace());
}
}
with文を持つ関数はインライン展開できません
[Inline]
final public function tryWith():void{
with(graphics){
beginFill(0x0077ff);
drawCircle(10, 10, 50);
endFill();
}
}
コンパイルした際のActionScriptByteCode(ABC)の行数が50以上になると インライン展開されなくなります
[Inline]タグをつけた場合この制限は無視され、どんな大きい関数でもインライン展開される
サブクラスまたはインターフェース経由で呼び出した場合はインライン展開されません
//これはインライン展開されます
var test2:ExInline = new ExInline();
test2.hoge();
//これはインターフェース経由で呼び出しているのでインライン展開されません
var test:IInline = new ExInline();
test.hoge();
このくらい
デモ。時間あれば
Monocleまだー?
Use a spacebar or arrow keys to navigate