2011年4月28日 星期四

4. Scala 的企圖心,也是它的特性 --動態型態還是強制型態

設計一個語言,尤其標榜快速開發的語言,常常遇到一個問題,到底是靜態型態還是動態型態?

所謂靜態型態(有時會稱強型態,strongly typed),表示變數需要預先宣告型態,當指定某個值給該變數時,compiler 需要檢查型態是否正確,正確才會放行。

這好像太囉唆了,沒錯,囉唆就是它弱點,但這可以預防你出錯,所以安全是他的優點。
當你程式寫錯了,compiler可是會預先幫你抓出問題,至少,不會讓迷迷糊糊的我們將變數名稱打錯了還不知道,所以標榜企業端開發的程式語言大多支持靜態型態。C、C++、Java 系列的語言都是強型態的語言。

至於動態型態(或稱弱型態)表示變數的型態可以變換,現在是字串,下一個命令可能變成整數,甚至連變數都可以不預先宣告就可以使用。
好處就是開發自由度很高,壞處呢,就是亂,品質需靠嚴謹的測試,compiler 或 interpreter 連點小忙都無法可幫。
標榜快速開發的語言通常支援動態型態,鼎鼎有名的 web browser 的主導語言 JavaScript 就是動態型態。

動態型態有開發的方便性,靜態型態有 compiler 代為檢查的安全性,何者為好,也是多年的爭議了。
你若是一個語言的設計者,該如何選擇呢?看看 scala 的選擇方式,Scala 要動態語言的方便性,也要靜態語言的安全性。

「是真的嗎?不會是吹牛吧?」

是真的,Scala 知道要有快速開發的好處,所以深入研究過動態型態的使用方式,動態型態的優點可以歸納為
1.型態自動設定:型態不需宣告
2.型態自動轉換:不同的型態指定時可以自動轉換
3.變數不用宣告就可使用

除了變數不用宣告的怪動作外(這個好處其實隱含重大的缺點,就是你不可以打錯變數名稱,否則,除了 trace 程式,你無法知道你打錯了),前兩項 Scala 用了更加優秀的方法來取代。

Scala 的解決方式是維持靜態型態,並透過型態推論 (type inference) 的機制,讓你宣告變數時不用一定要宣告型態。Compiler 會由指定給該變數的值來推論出該變數應該具有的型態。

至於型態自動轉換,Scala 可以透過隱含式轉換 (implicit conversion) 讓變數自動轉換為另一種型態,因此可以維持動態型態編寫的簡易與自由度。

「什麼是型態推論 (type inference),什麼是隱含式轉換 (implicit conversion)?看不懂啦!」

沒關係,這裡當然看不懂,有興趣,請自行參考「釋迦樂、思家了」系列文章(http://sayscala.spotblog.com/)。

這裡只是要告訴你,Scala 的企圖心確實是大的,而且已經做到了。
它可以維持靜態型態的優點,並且納入動態型態的好處,所以如果你是動態型態的愛用者,不用擔心來到 Scala 的國度就變得礙手礙腳,Scala可以讓你維持之前的寫程式自由度,並且增加靜態型態的安全性。

 Scala 解決兩大爭端,命令式 v.s. 函數式、動態型態 v.s. 靜態型態,這兩種爭論都是延續一、二十年的爭論。

它讓各種優點都容納到它的語言裡面,你是否對它感到好奇,是否對它有了興趣?

沒有留言:

張貼留言