Adobe架構師談Scala:功能強大但令人困惑
原創【51CTO精選譯文】本文是Adobe架構師Ricki在英文開發社區DZone上發布的一篇文章。Ricky專注SaaS,云計算以及使用Map/Reduce和Hadoop堆進行并行編程。最近Ricki參加了一次Scala線下課程,并對Scala語言留下了自己的一些印象。
51CTO編輯推薦:Scala編程語言
對Scala語言的第一印象
關于 Scala 這個編程語言,我聽到很多正面的評論。我個人過去更多使用 Java,在過去兩年,我已經轉用 Ruby(還會用一些 Erlang)。我聽到的那些 Scala 功能,對我很有吸引力,以下列出:
◆Scala 代碼可編譯為 Java 字節碼,直接在 JVM 上直接運行。使用Scala寫的代碼能夠直接享受 Java 虛擬機技術所具有的性能和健壯性(robustness)
◆可以很方便地與 Java 代碼和庫進行集成,能夠直接享受大量現有 Java 庫帶來的便利。
◆對于 Actor 模型,它提供了很好的支持,我認為這一點對于多核計算機架構是一種非常重要的編程范式。
深入了解,繼而困惑
所以我決定參加 Qcon 大會上 Dean Wampler 做的 Scala 課程。聽課之后,我對 Scala 的印象,總結如下:
首先,Scala 是一個強類型語言。不過,它具有類型推理機制,所以你不是非要進行類型聲明,它是可選的。
但在一些地方(如方法簽名),類型聲明是必須的。什么時候我必須聲明一個類型,對于我這點不是非常清楚。
具有變量中的“val”和“var”聲明是非常好的,因為它可以使得不變性(immutability)成為顯式的。在 Ruby 中,通過向對象發送 freeze() 方法,你可以使一個對象成為不變的(immutable),但Scala做得更為顯式。
不過,我發現使用兩種不同的方式定義一個方法這點令人困惑。
- class A() {
- def hello {
- ...
- }
- }
- class A() {
- def hello = {
- ...
- }
- }
這個 MyFunction[+A1, -A2] 對我來說真的不容易弄明白。我覺得無類型語言更為簡單。
另外,刪除開始和結束的括號也讓我很困惑。
- class Person(givenName: String) {
- var myName = givenName
- def name =(anotherName: String) = {
- myName = anotherName
- }
- }
- class Person(givenName: String) {
- var myName = givenName
- def name =(anotherName: String) = myName = anotherName
- }
這個特別的“隱式”轉化方法提供了一種機制,即使用 Scala 開發 DSL(領域專用語言:Domain Specific Language)。但對于我,它看起來很奇怪。從根本上說,你需要導入單個隱式轉化方法,后者需要處理所有可能的轉化。
#T#所有以“:”結尾的方法,調用順序都是顛倒的,這對我來說也是非常奇怪的東西。
Scala 中的 trait 為 Scala 提供了 mixin,但我覺得 Ruby 語言中的“模塊”機制做得更好。
Scala 具有“函數”的概念,并且能夠將“函數”作為參數傳遞。同樣,我覺得 Ruby 中的 block 做得更好。
也許由于 JVM 對于動態語言支持的局限性,Scala 在做元編程時并不是很強,Scala 不提供“開放類”屬性,通過它用戶可以在運行時修改現有的類(添加方法、更改方法實施,添加類等等。)
Scala 還模仿了一些 Erlang 語言的功能,但我不認為它這活做得干凈漂亮。比如,它使用 case 類和 unapply() 模仿 Erlang 編程的模式匹配風格,但對于我這有點奇怪。
Erlang 具有兩個很酷的功能,在 Scala 中我還沒有發現(也許是我期望太高了)。
◆能夠同時運行類的兩個版本
◆能夠創建并傳遞函數對象到遠程進程(有點類似遠程代碼加載)
總體印象
我不得不承認,我對 Scala 的印象并沒有參加那個課程之前那樣好。Scala 試圖在 JVM 中放入不同的非常有用的編程范式,但對于我,有種勉強的感覺。當然,與JVM的緊密關系仍是我們選擇Scala的一個原因。但從純正的編程角度,我更喜歡 Ruby 和 Erlang 的結合,而不是 Scala。
原文:Impression on Scala 作者:Ricky
編者后記:開發者對于語言的喜好在某種程度上和開發者的性格有很大關系,正如敏捷大師Dave Thomas所說的,就好像喜歡貓的往往不喜歡狗,喜歡狗的往往不喜歡貓一樣。而不知是否巧合,同樣是Ruby狂熱愛好者的Dave Thomas也曾在訪談中表示自己就是毫無理由的不喜歡Scala,對Scala的一些用法感到困惑。這樣看來就仿佛Ruby是只貓而Scala是只狗一樣。當然也有反例,比如這位從Ruby出家到Scala的程序員,以及曾經一直使用Ruby做后臺的Twitter后來投向了Scala,而其團隊并沒有像上面兩位那樣表示困惑。看來開發者對語言的喜好真是一個難以琢磨的話題呢。