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