大神說Scala是個有趣的語言 你值得擁有

vaikan發表於2014-11-21

  經常讀我的部落格的人應該知道,我最喜歡的程式語言是Haskell。我喜歡函數語言程式設計,Haskell是一個能把函數語言程式設計推向極致的語言。雖然如此,我仍然時刻關注著其它新興的和即將產生的程式語言,特別是函式式的程式語言,所以,當Scala誕生之初我就知道了這種語言。當時,我粗略的對它瞭解了一下,並不是很喜歡;我感覺它的那些語法對於我的口味來說過於甜膩,而且這種語言看起來異常的複雜。然而,一些我很尊敬的人都喜歡這種語言,所以我就再次的看了看。我的評論並不是基於對這種語言的一個全面的瞭解之上,只是我通過幾周的閱讀和實驗得到的收穫。不管怎樣,我已經有足夠的認識來宣告,Scala是個有趣的語言,值得去研究,特別是當你有Haskell程式設計背景的情況下。我使用的是一本“階梯教程”(Programming In Scala by Odersky et al),這本書寫的非常好,我全力的推薦大家讀一下。

  我想學一種新的程式語言主要有兩個原因。一個是我想找一種跟目前我使用的語言不同的語言,我想尋找一種另外的程式設計體驗。另一個是我想找一種具有很多我從沒見過的有趣的新特徵的語言。Scala的出現完全滿足了我的苛求。.

  本質上來講,Scala是一種執行在JVM之上的語言,它很快,使用它我可以做圖形介面程式設計,web程式設計(用它的Lift框架),和移動裝置程式設計(使用Android,我也知道讓Scala程式在Android上執行並不是一個很容易的事)。Scala在這些領域出現的時間比Haskell早的多。我期望Haskell能最終趕上,但是我現在就已經喜歡上了寫這些型別的程式了。

  從理論的角度來看,Scala的訴求是靜態型別背景下的函數語言程式設計和麵向物件程式設計的組合。這可不容易做到。在動態語言裡倒是容易些(例如Lisp使用CLOS),而靜態型別會使事情變得非常的複雜,尤其是子型別化和繼承方面。Haskell可部分的支援物件導向程式設計(特別是使用型別類和現有型別),但我在Haskell裡沒有發現物件導向風格的繼承模型,儘管這是十分有用的。Scala有一個非常複雜的物件導向系統,還包括一些諸如顯式sub-和supertype標記,協方差(covariance)和反變(contravariance)標記,等等。這些都超越了我所見過的其它的物件導向的程式語言。實際上,Scala實現了把所有的函式性特徵都作為物件,所以把它稱作一種物件-函式式語言並不準確,不如稱作為超級面嚮物件語言更合適。

  我認為Scala的物件導向不是Haskell能比的;它是對於它的這種正規化上的一個最佳案例。(我這裡忽略掉了那些型別依賴的函式式語言,諸如Agda/Coq/Epigram,我知道它們,但基本上它們已經不再被當成一種用來做普通程式設計的語言了。)對於在靜態型別的環境中,是否物件已經超過函式變成一種更基礎的結構,我並不清楚。在動態型別語言中,你可以由函式得到物件(可以假設函式就是閉包),或者你可以由物件得到函式,所以兩種觀念是可以相互轉換的。不論這是不是一種使用靜態型別的案例,我想,用兩種語言從不同的方向來考慮這個問題是件很有趣的事情。另一方面,我曾學習過Smalltalk的物件導向特徵,我不得不說,我從沒見過第二個靜態型別的語言具有Smalltalk這樣優雅的簡單訊息傳輸模型。再一方面,我更希望用Scala而不是Smalltalk來寫一個大型程式。(並且,如果你真的想直接進行訊息傳輸時,Scala也有Actors類庫來支援你。)

  另一個Scala裡我喜歡的東西,也是Haskell共有的東西,就是他們都有學院理論根源。當你在設計一種具有深奧的型別系統的語言時,瞭解一些型別理論會非常的有幫助。Scala和Haskell的設計者都清楚這一點,這也就是在這些語言裡有很多高質量的特性的原因。我希望有一天那些把希曼式實用主義當作理論基礎的人會閉嘴,因為事實證明通過學院派設計出來的語言才是解決現實問題的上上之選。

  我會一直關注著Scala,我希望能對它瞭解的更多。但我仍然喜歡Haskell,我從來不會打算放棄它。

  英文原文:mvanier.livejournal.com

相關文章