Scala取代Java?可能嗎?熱議仍持續不斷
譯文【51CTO精選譯文】前日,Groovy創始人James Strachan在博客上撰文稱Scala將成為Java的替代者。當時51CTO的譯者對全文做出了翻譯,并節選出其中一些精彩的回復放入了文中。事實上,幾乎所有的評論都十分精彩,以至于我們決定對這些回復進行更加緊密的跟蹤。
51CTO編輯推薦:Scala編程語言專題
原文入口:Groovy創始人:Java面臨終結 Scala將取而代之(BlogSpot上的原文地址在此)。下面的評論中,我們對博主James的回復做了藍色標注。
◆Alan said...
在用Scala開發程序的過程,最吸引我的一點就是簡單的構建過程。它能非常智能地幫我解決Scala項目的依賴關系處理,編譯,以及常見的Ant/Maven任務,而且不需要編寫XML文件。
◆Justin Lee said...
我很想知道你對fandev.org上的東西是怎樣的看法。它似乎提供了很多你期望在Scala里出現的功能(我不太懂Scala,所以我也沒法準確地進行對比)。我用Java開發已經有很長的時間了,一直希望能找到其它更好用的語言,現在我覺得fan這種語言就是我要找的。不過從你對Scala的評價來看,顯然Scala也可能是。所以,我想知道你是否了解過Fan。我并有沒有要為Fan打廣告或者說要說服你改變看法的意思。毫不隱瞞地說,我只是看看你的想法,因為你是一個語言天才,而我遠遠不是。
◆James Strachan said...
我也認為Fan是一門很棒的語言,盡管我有點擔心它會變得既不像.Net又不像Java。它的靜態和動態類型實現方式和Groovy里幾乎一模一樣。我本人還是更偏好靜態類型實現一點,而且Scala里的泛型/運算符的重載都非常好用。
最后,相比于fan/groovy里生硬地加入對閉包的支持,Scala提供的對函數式編程和不變狀態(immutable state)的支持看起來更適用一點。
◆Jeff Foster said...
我個人覺得根本就沒有必要發明一種語言來取代JVM里的Java。像現在這樣在一個虛擬機之上運行多種語言我覺得非常好(51CTO編者注:事實上,在哪種語言將統治多核時代 再看函數式語言特性一文中也有這樣的看法,那就是多種語言并存的前景),不同的人各取所需。
您是否嘗試過Clojure?它就需要大量的擊鍵輸入(因為它是動態類型的),但是宏和并行能力(因為它支持軟件事務性內存(STM)的提供使得這門語言也非常吸引人。
◆R. Mark Volkmann said...
我看到作者作了不少這樣的辯解:
“Scala給人的最初印象可能是符號用得太多了點,但是你并不需要使用所有的符號”。
我對這類說法非常不滿,因為雖然你可能用不到所有的符號,但是你得閱讀并理解別人的代碼,那個人說不定就用到所有的符號了。
◆The Kaos Jester said...
我想以幾個問題回應你:
0 )既然我們會一直停留在Java 6,為什么我們還要這么急切地想掙脫Java呢?你先是嫌Java的語法標準太厚了,但接著又怪它沒有什么新功能。為什么我們放棄Java?(51CTO編者注:Java EE 6的草案早在2007年初便已經提交,但是JavaOne 09都已經結束了,還是千呼萬喚出不來。詳情可參考51CTO之前的譯文Java EE 6遙遙無期 預覽版兩極分化)
1 )你怎么看待數組?我知道鏈表用起來是“很好”,但是數組這一數據結構并不僅僅是描述了數據的存儲,它還提供了一個可在O(1)時間復雜度內訪問的內存分布。如果采用鏈表,就根本沒法保證這樣的高效。這買賣劃算嗎?
2 )Java里的泛型和C++里的模板差不多就是一個東西,只不過泛型在編譯時沒有類型推斷。Scala也差不多,只不過有類型推斷,但是程序員現在還根本沒有辦法控制它。比如,每次我要實現一個KD樹時,我就通過擴展TreePoint來在變量T上實現泛型。其中TreePoint是一個提供了getVal(int axis)函數的接口。這樣就讓我得以構建一個泛型的空間樹,而且它肯定能在任何實現了TreePoint的類下工作。如果我想用Scala構建這樣的數據結構的話怎樣才能辦得到呢?是不是我得TreePoint變成一個對象,并通過其它對象來擴展它?Scala甚至連繼承都不支持吧?還有接口呢?(有關Scala泛型的優勢,51CTO曾致信Scala創始人Martin Odersky,他曾比較詳細的解釋過。詳情可點擊這里)
3 )您稱贊Scala說它更優雅。我覺得有必要展示一下。
這是用Java編寫的打印偶數的程序。
- even(int max) {
- for(int i = 0; i < max; i++) {
- if (i % 2 == 0) System.out.print(i + " ");
- }
- }
這是用Scala寫的:
- def even(to: Int): List[Int] =
- for (i <- List.range(0, to) if i % 2 == 0) yield i
- Console.println(even(0, 20))
這樣的寫法對我來講是件痛苦的事情。另外,Scala寫的示例程序讓人覺得代碼結構不太清晰。這樣非標準的for循環如何能有助于代碼的復雜性和簡潔性?它對編寫代碼有什么好處?
4 )由于它是一個腳本語言,行尾不使用' ; ' ,而是使用' \n'作為結束符,這再一次給我們帶來麻煩。我也知道Ruby,Python這些語言都很酷,因為它們都不需要你寫行結束符,但是難道你不覺得這樣很容易讓人迷惑嗎?事實上,我認為這會讓Scala程序員非常苦惱,因為連下面這樣的寫法都是合法的:
- val t = a(i); a(i) = a(j); a(j) = t
5 )你首先就拿Java語法手冊有600多頁說事,后面又說Scala有多少擴展庫可以實現類似功能。但是,Java語法手冊這么長的原因本來就是因為官方為保證各個Java版本的一致性而集成了大量庫。試問Scala又是如何保證這些后來加進來的庫的一致性呢?
6 )你說Java的基本類型很是讓人不爽。我不知道你為什么會有這種感覺,Scala又采取了什么措施來解決這一問題呢?
7 )我想你肯定知道JavaScript不能用來開發桌面應用程序,對不對?同樣的道理,也不會有哪種語言可以替代Java,Python,Ruby等。
8 )Java里有一點和字符串相關的多態性值得一提:Java里的所有對象都提供了一個toString方法,并且所有你自己編寫的對象都可以自定義toString方法(只要在類里面定義這個方法并在方法前加上"@Override")。所以,你可以讓Java完全按照你的所想去打印任何對象。試問在Scala里怎樣才能實現這一功能呢?
以上只是我個人的一些愚見。Scala看起來還是挺強大的(不過我仍然會首選Java和Scheme),但是似乎你所抱怨的Java中的這些問題也同樣存在于Scala中,并沒有得到什么改善。我們仍然在使用虛擬機,它帶有虛擬機內存,字節碼在運行時才編譯,它還帶有可變類型。這篇文章并不是要招來口水戰,但是我讀了你的這篇文章之后確實產生了一系列的疑問。
◆James Strachan said...
0 )javac的過期時間已經步步逼近。難道我們不該投奔另一種更好的語言嗎?你可以選擇繼續死守。這一點都不奇怪,直到現在還有人在用COBOL呢。
1 )數組不是Collection,它們沒有實現 Iterbale < T>。(Scala里的FWIW鏈表和數組支持迭代和自然數索引操作,例如myArray(5) )
2 )我不確定我可以100%做到這點,但是我想可能值得去讀讀Scala里如何支持這種抽象類型。
3 )我不太認同你所說的。這一段Scala代碼定義了一段隨時都可以方便地結束的代碼,而在Java里必須得進行迭代。你不光是拿蘋果和桔子在進行比較。你還把Scala 的for語句的好多強大功能給忽視掉了。
http://www.scala-lang.org/node/111
這可避免大量丑陋的嵌套循環。
4 )Scala和Javac一樣嚴格,當然,我也一樣喜歡像JavaScript、Ruby、Groovy那樣的寬松語法。
5 )Scala是一門簡單卻又非常強大的語言。優雅設計的訣竅就是如何盡可能地進行化簡卻依然保持原有的功能。
6 )比如說,在Java中有那么多的與基本類型、自動封裝以及數組相關的麻煩。
7 )JavaScript和Java/Ruby之間根本就沒有什么可比性。你還可以用Rhino在JVM里完成大部分任務呢。
8 )Scala里,一切都是對象。
總之,我非常喜歡JVM以及它的平臺和無數擴展庫。我只是在為javac作長遠打算,而且我覺得Scala是一個巨大的進步。
◆James Strachan said...
@The Kaos Jester
我想順便再強調下希望你能看看我在文章里提到的兩本Scala編程書。不要心懷芥蒂。
Scala很好地解決了Java里的大部分問題(我看了這些Scala編程書之后才想起來Java有這么多不盡如人意的地方),而且它能讓我們大開眼界,看到如何漂亮地把面向對象編程和函數式編程統一起來。
因此,Scala不僅僅是比Java更好,它完全就是面向對象語言和函數式語言的結合體,而且還有比Java更簡潔優雅的語法,它所編譯成的字節碼運行效率也和Java不相上下(有時候要相對快一點,有時候要慢一點)。
◆Cedric said...
對不起James,但我真的不認為Java社區已經對Scala 這樣復雜的東西做好了準備。因為它確實是復雜的,不管你是不是這樣認為。此外,我認為像你自己這樣的語法設計者有時候太淵博了,所作的判斷也和我們普通人不太一樣(你不是把“單體”(monad)單獨列出來嗎?想想這個問題吧。)
很多時候,我都覺得Scala之于Java就像C++之于C。有著豐富的功能,并且也辯稱“你不必掌握所有這些功能”,但到了實際開發中,往往加大了工程的復雜程度。你可以去看看我在Scala每日郵件列表里發的代碼片段,我想說的是:它比Java的泛型復雜10倍。
和你一樣,我也經常對Java的哆嗦感到惱火,不過如果我想在Java里達到類型推斷和靜態類型的話,我就可以折中地寫成"List< String> l = Lists.newArrayList()",這樣就能基本上實現類型推斷。
我敢打賭,在五年內,Java將依然是最主要的JVM語言,但還是會有一幫人在提倡Scala是一個更好的替代。
純粹從設計角度看,Fan更容易吸引Java社區的開發人員加入,因為它不像Scala那樣需要跨過那么復雜的門檻。但是 1).NET兼容性問題讓我擔心這語言會不會被削弱。 2)我懷疑Andy和Frank沒有在他們的IDE上做足夠的努力。
◆Tom Flaherty said...
難得的好文章!在我最近所作的演示中我就暗示過一個類似的觀點,就是說Scala未來可能會取代Java。我的主要依據是強類型是實現一個穩定基礎系統的關鍵,而其它弱類型動態語言也只有在這個穩定的基礎系統上才能實現。而根據目前所知,Scala簡直無所不能。我真得感謝你的深入分析和你推薦的資料。
【相關閱讀】