自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Scala取代Java?可能嗎?熱議仍持續(xù)不斷

譯文
開發(fā) 后端
前日,Groovy創(chuàng)始人撰博文稱Scala將取代Java。他說,如果他在2003年看過《Programming Scala》的話,那可能就不會有Groovy了。這篇文章引發(fā)的討論十分精彩,從中可以了解到很多方面的不同觀點(diǎn)。

【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ù)的程序。

  1. even(int max) {  
  2. for(int i = 0; i < max; i++) {  
  3. if (i % 2 == 0) System.out.print(i + " ");  
  4. }  
  5. }   

這是用Scala寫的: 

  1. def even(to: Int): List[Int] =  
  2. for (i <- List.range(0, to) if i % 2 == 0) yield i  
  3. Console.println(even(020))   

這樣的寫法對我來講是件痛苦的事情。另外,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下面這樣的寫法都是合法的:

  1. 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)閱讀】

  1. Groovy創(chuàng)始人:Java面臨終結(jié) Scala將取而代之
  2. Scala如何改變了我的編程風(fēng)格:從命令式到函數(shù)式
  3. Scala的類型系統(tǒng) 比Java更靈活
  4. Java程序員,你為什么要關(guān)注Scala
  5. Scala編程語言
責(zé)任編輯:yangsai 來源: 51CTO.com
相關(guān)推薦

2012-02-07 10:31:09

2015-08-19 10:12:16

CIO時(shí)代網(wǎng)

2013-01-18 14:00:59

VMware

2022-04-26 10:04:56

VMware

2011-03-11 15:16:43

國產(chǎn)數(shù)據(jù)庫

2015-08-26 09:54:50

大數(shù)據(jù)創(chuàng)業(yè)

2013-03-25 14:10:02

Windows Blu

2009-06-10 09:29:40

Scala類型通配符

2010-03-12 09:52:51

Python語言

2019-10-21 13:58:22

爬蟲互聯(lián)網(wǎng)程序員

2009-11-30 15:05:54

2023-05-29 15:46:59

2010-01-07 10:30:26

80后

2012-02-02 16:37:44

海底撈華為智真視頻聚餐系統(tǒng)

2014-11-11 14:31:07

應(yīng)用交付/地鋪科技

2020-07-13 14:59:59

程序員技能開發(fā)者

2022-05-27 10:19:03

Lombok?JavaJDK14

2013-03-06 11:05:48

Hyper-V負(fù)載虛擬化

2013-02-22 15:06:46

WPS陳歐體金山軟件

2019-10-09 10:22:13

數(shù)據(jù)庫云計(jì)算技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號