2012-08-14 104 views
4

我总是设置我的变量和函数的类型,这是我从Java学习中学到的一种习惯,似乎是正确的。
但是我总是在其他人的代码中看到“弱类型”,但我不能不同意这一点,因为我不知道保持所有类型的真正优点是什么。指定变量类型和函数返回类型有没有优势?

我想我的问题是明确的,但我会举一些例子:

var id = "Z226"; 

function changeId(newId){ 
    id = newId; 
    return newId; 
} 

我的代码会是这样的:

var id:String = "Z226"; 

function changeId(newId:String):String{ 
    id = newId; 
    return newId; 
} 

回答

5

您从强类型获得性能优势。请参阅http://gskinner.com/talks/quick/#45

我还发现强类型的代码更具可读性,但我认为取决于他们可能不在乎的人。

+1

这是一个很不好的例子。它比较动态对象与封闭对象的初始化。性能差异与强/弱打字无关。 – cleong 2012-08-14 23:08:24

7

是,大advantanges是:

  1. 更快的代码执行,因为运行时知道类型,它不必评估调用
  2. 更好的工具支持:自动完成和代码提示将与类型参数工作,返回类型
  3. 更好的可读性
+0

好的答案,它也大大提高了编译时错误检查的实用性。 – BadFeelingAboutThis 2012-08-14 22:47:04

3

正如florian指出的那样,强类型的两个优点是开发工具可以使用信息来提供更好的代码提示和代码完成,并且该类型作为变量或方法意图被使用,可以使代码更容易理解。

表现的问题似乎有待辩论。但是,stackoverflow上的this answer表明,在某些基准测试中,类型化肯定比无类型化更快,但是,正如作者所述,并不是说在正常情况下您会注意到它。

但是,我会争辩说,强类型的最大优点是,如果您尝试分配或返回错误类型的值,则会出现编译器错误。这有助于防止那些只能通过实际运行程序才能追踪到的有害错误。

请考虑以下人为的示例,其中ActionScript在返回之前自动将结果转换为string。强烈输入方法的参数并返回将确保程序不会编译并发出警告。这可能会为您节省数小时的调试时间。

function increment(value) { 
    return value + 1; 
} 

trace(increment("1")); 
// 11 
1

虽然有关代码提示和错误检查其他答案点是准确的,我想,以解决有关性能的要求。事实并非如此。理论上,强类型允许编译器生成更接近本机的代码。尽管目前的VM,这种优化不会发生。在这里和那里,AS3编译器将采用整数指令而不是浮点指令。否则,类型指示器在运行时不会产生太大影响。

例如,请考虑下面的代码:

function hello():String { 
    return "Hello"; 
} 

var s:String = hello() + ' world'; 
trace(s); 

我这里还有的AVM2操作码从它产生的:

getlocal_0 
pushscope 
getlocal_0 
getlocal_0 
callproperty 4 0 ; call hello() 
pushstring 12 ; push ' world' onto stack 
add    ; concatenate the two 
initproperty 5 ; save it to var s 
findpropstrict 7 ; look up trace 
getlocal_0  ; push this onto stack 
getproperty 5 ; look up var s 
callpropvoid 7 1 ; call trace 
returnvoid 

现在,如果我去掉类型的指标,我得到以下:

getlocal_0 
pushscope 
getlocal_0 
getlocal_0 
callproperty 3 0 
pushstring 11 
add 
initproperty 4 
findpropstrict 6 
getlocal_0 
getproperty 4 
callpropvoid 6 1 
returnvoid 

完全一样,除了所有的名字索引都少一个'String'no更长的时间出现在常量表中。

我不想阻止人们使用强打字。一个人不应该期待性能方面的奇迹。

编辑:如果有人有兴趣,我已经把我的AS3字节码反汇编在线:

http://flaczki.net46.net/codedump/

,以便它现在取消引用操作数我已经改善它。

+0

但是,用矢量替换常规阵列可以显着提高性能。这就是强打字有所作为的地方。 – cleong 2012-08-15 00:08:20

+0

你是如何找到被调用的操作码的? – 2012-08-15 16:21:08

+0

它来自我写的PHP脚本。 – cleong 2012-08-15 17:07:19