ASC2.0(Action Script Compiler)是Flash builder 4.7 beta中内置的新版编译器,相对于老版本的编译器优化了很多内容,当然也增加了一些新的特性,比如 inline 选项就比较实用.
1.编译时将尝试直接计算结果
字符串拼接(+) 算数运行算( +, -, * , / ) 逻辑运算( && , || , !) 位逻辑运算( & , | , ^ ) 位移运算( << , >> , >>> )
var s:int = "a" + "b"; // ==> var s:int = "ab";
var i1:int = 1 + 2; // ==> var i1:int = 3;
var i2:Boolean = 1 > 2; // ==> var i2:Boolean = false;
var i3:int = 10 & 1; // ==> var i3:int = 1;
var i4:int = 10 << 1; // ==> var i4:int = 20;
2.编译时尝试直接对函数计算结果
直接运算的函数包括: int() uint Number() Boolean() String()
var s:String = String(1); // ==> var s:String = "1";
3.常量替换(当常量初始值在编译时不可获取值时除外)
const 常量 会被将值直接替换到使用的地方
const A:int = int("3") + 4; // 编译时可直接计算结果为7
const B:Number = Math.random(); // 编译时不可计算B的值
var i1:int = A; // ==> var i:int = 7; 而不用找到A的值再赋给i
var i2:int = B; // 这里不会在编译时为i2赋值B,因为B的值在编译时不可得
4.常量定义提前,这是由于常量替换的原因
var t1:int = varA; // 0
var t2:int = constA;// 5 由于常量替换,这里等同于 var t2:int = 5;
var varA:int = 5;
const constA:int = 5;
trace(t1, t2);
// ASC2.0 为 0, 5
// 旧编译器 为 0, 0 这里需要注意下
5.if (false) { } 的代码会在编译时直接忽略掉, 而不会编译到swf里
该特性也可以当做一个 条件编译 来看待,行为类似于 java条件编译
6.常量类有可能不用初始化
下面的类将不用在运行时被初始化,根据常量替换原则,所有使用到值的地方将会被常量值直接替换.
class Fruit
{
public static const APPLE:int = 1;
public static const PEAR:int = 2;
}
var fruit:int = Fruit.APPLE;
7.逻辑组合赋值运算将减少一次赋值操作
&&= ||=
// 旧的编译器
a &&= b; // ==> a = a ? b : a;
a ||= b; // ==> a = !a ? b : a;
// ASC2.0将编译为
a &&= b; // ==> if(a){ a = b; }
a ||= b; // ==> if(!a){ a = b; }
8.组合赋值运算时将减少一次函数调用(该优化测试时未发现,仍未旧编译器版本)
onlyOnce().a += 2; // onlyOnce() 仅调用一次,旧版编译器会调用2次
// AS2.0编译后的行为将会类似于下面的C代码的行为
int &a = onlyOnce().a;
a += 2;
// 旧版本
var a = onlyOnce().a;
onlyOnce().a = a + 2;
ASC2.0优化的bug
function foo():void { }
var foo:int = 5;
foo();
// 旧版本中会在编译时报错直接报错
// Error: Call to a possibly undefined method foo.
// ASC2.0会把该问题留给运行时报错
更多的ASC2.0优化的内容请看 ActionScript Compiler 2.0 Backward Compatibility
» 转载请注明来源:www.litefeel.com » 《ASC2.0优化》
» 本文链接地址:https://www.litefeel.com/asc2-optimization/
» 订阅本站:www.litefeel.com/feed/
» Host on Linode VPS
» 本文链接地址:https://www.litefeel.com/asc2-optimization/
» 订阅本站:www.litefeel.com/feed/
» Host on Linode VPS
This post was last modified on 2019 年 03 月 04 日 00:29
View Comments (4)
@Tony
哈哈,这个bug是蛋疼了.
@lite3
是的,但是我遇到一个比较好笑的问题:有几个函数名叫gotoXXX(),结果报错了,哈哈 :-D
@Tony
是的,goto关键字其实不建议使用的,因为容易造成流程混乱. 特别是在复杂的代码流程里的时候.
常量折叠支持得更好了。 另外还加了个新的关键字 goto ;-)