ASC2.0(Action Script Compiler)是Flash builder 4.7 beta中內置的新版編譯器,相對於老版本的編譯器優化了不少內容,固然也增長了一些新的特性,好比inline選項就比較實用.html
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的值在編譯時不可得
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裏優化
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優化的內容請看這裏.