ASC 2.0編譯器

ASC2.0(Action Script Compiler)是Flash builder 4.7 beta中內置的新版編譯器,相對於老版本的編譯器優化了不少內容,固然也增長了一些新的特性,好比inline選項就比較實用.html


ASC2.0優化

1.編譯時將嘗試直接計算結果
字符串拼接(+)
算數運行算( +, -, * , / )
邏輯運算( && , || , !)
位邏輯運算( & , | , ^ )
位移運算( << , >> , >>> )java

1 var s:int = "a" + "b";    // ==> var s:int = "ab";
2 var i1:int = 1 + 2;        // ==> var i1:int = 3;
3 var i2:Boolean = 1 > 2;    // ==> var i2:Boolean = false;
4 var i3:int = 10 & 1;    // ==> var i3:int = 1;
5 var i4:int = 10 << 1;    // ==> var i4:int = 20;

2.編譯時嘗試直接對函數計算結果dom

直接運算的函數包括: int() uint Number() Boolean() String()ide

1 var s:String = String(1);    // ==> var s:String = "1";

3.常量替換(當常量初始值在編譯時不可獲取值時除外)函數

const 常量 會被將值直接替換到使用的地方測試

1 const A:int = int("3") + 4; // 編譯時可直接計算結果爲7
2 const B:Number = Math.random(); // 編譯時不可計算B的值
3 var i1:int = A; // ==> var i:int = 7; 而不用找到A的值再賦給i
4 var i2:int = B; // 這裏不會在編譯時爲i2賦值B,由於B的值在編譯時不可得
4.常量定義提早,這是因爲常量替換的緣由
1 var t1:int = varA;    // 0
2 var t2:int = constA;// 5 因爲常量替換,這裏等同於 var t2:int = 5;
3 var varA:int = 5;
4 const constA:int = 5;
5 trace(t1, t2);
6 // ASC2.0 爲 0, 5
7 // 舊編譯器 爲 0, 0 這裏須要注意下

5.if (false) { } 的代碼會在編譯時直接忽略掉, 而不會編譯到swf裏優化

該特性也能夠當作一個條件編譯來看待,行爲相似於javaui

6.常量類有可能不用初始化
下面的類將不用在運行時被初始化,根據常量替換原則,全部使用到值的地方將會被常量值直接替換.spa

class Fruit
{
    public static const APPLE:int = 1;
    public static const PEAR:int = 2;
}
var fruit:int = Fruit.APPLE;

 


7.邏輯組合賦值運算將減小一次賦值操做
&&= ||=code

1 // 舊的編譯器
2 a &&= b; // ==> a =  a ? b : a;
3 a ||= b; // ==> a = !a ? b : a;
4 // ASC2.0將編譯爲
5 a &&= b; // ==> if(a){ a = b; }
6 a ||= b; // ==> if(!a){ a = b; }

8.組合賦值運算時將減小一次函數調用(該優化測試時未發現,仍未舊編譯器版本)

1 onlyOnce().a += 2; // onlyOnce() 僅調用一次,舊版編譯器會調用2次
2 // AS2.0編譯後的行爲將會相似於下面的C代碼的行爲
3 int &a = onlyOnce().a;
4 a += 2;
5 // 舊版本
6 var a = onlyOnce().a;
7 onlyOnce().a = a + 2;

ASC2.0優化的bug

1 function foo():void { }
2 var foo:int = 5;
3 foo();
4 // 舊版本中會在編譯時報錯直接報錯
5 // Error: Call to a possibly undefined method foo.
6 // ASC2.0會把該問題留給運行時報錯

更多的ASC2.0優化的內容請看這裏.

相關文章
相關標籤/搜索