2012-08-14 106 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