Clojure和Scala的用途一致嗎,他們有可比性嗎?如果可比,哪個更好呢?

它們倆的主要用途在哪方面呢?這裡的好主要指的是職業發展方向,例如需求數量、工資、未來語言發展前景。


反對以上所有對OOP的對比

Clojure不僅是用fp模擬OOP或支持OOP, 而是解決了java OOP 的很多問題,比如介面封閉,defprotocol提供的不僅是介面,而是胖介面,extend-type宏來擴展已有類型,僅用幾個組合子來表達更好的抽象,Clojure社區裡面有個說法,Clojure做Java比Java還好

Scala的OOP 也不是無腦的沿用java,Scala比java更OOP, trait, object, 伴生對象等都是在OOP上比java更遠的,問題是複雜性有些沒控制好,任你發揮,多繼承的同時可能還要考慮線性初始化,絕對讓人暈頭轉向,與Clojure不同的地方就是控制不好代碼的熵,而Clojure只用那幾個宏做有限的組合

Scala是對java OOP 的橫向擴展,加了更多東西,Clojure更像是對java的縱向擴展,增強了很多東西

要問哪個好,呵,真沒意義,反正你會繼續寫Java


語法

Clojure採用Lisp語法,語法更簡潔。

Scala更接近Java習慣。

(平手)

類型系統

Clojure是動態類型語言,類型系統弱。

Scala有強大的靜態類型系統,支持類型推斷、泛型、既存類型。

(Scala勝)

功能

Clojure的標準庫小巧,容器不算豐富,能調用Java庫,但Java調用clojure函數不方便。

Scala與Java的互交互性極好,標準庫中有完備的可變容器庫以及不可變容器庫。社區也有好幾種Spark、Play、Akka等殺手級框架。

(Scala勝)

性能

Clojure在動態類型語言中是頂尖的性能,

Scala和Java性能相當,比Clojure稍快(https://benchmarksgame.alioth.debian.org/u64/benchmark.php?test=alllang=clojurelang2=scaladata=u64)。

(Scala勝)

Clojure繼承了Lisp『代碼即數據』的思想,宏穩定易用。用Clojure進行元編程,定義DSL很方便。

Scala也有宏,但Scala的宏複雜bug又多,只能說聊勝於無。一部分原因是因為Scala語言本身較為複雜,另一部分原因是Scala宏的設計拙劣。

(Clojure 勝)

綜上所述:

如果你的項目大量使用元編程的編程範式,那麼用更簡潔的Clojure,多用宏,多定義自己的DSL,就不錯。

如果你使用主流的面向對象編程和函數式編程範式,那麼用Scala更加高效。

---

(根據『要想被贊,必先跑題』原則,以下開始跑題)

有趣的是,Clojure作為一門動態類型語言,能獲得只比Scala稍差性能的原因,歸根到底,跟Scala的作者還有點關係。

Scala的作者馬丁·奧德斯基也是Generic Java的作者,而Generic Java主要是給Java增加了泛型功能,後來整合到了SUN的Java 5中。

由於舊版Java虛擬機不支持泛型,為了保證向後兼容性,馬丁採用了『類型擦除』的方案。類型參數在運行時會被抹掉,Java虛擬機還是把泛型類型當成Object一樣處理。可想而知這麼做性能好不了。

於是Java虛擬機就拚命優化,什麼裝箱拆箱、虛函數調用、類型檢查,統統優化掉,還可以在運行時分析位元組碼,優化最常調用的分支的性能。這些優化,除了能增進泛型的性能以外,對動態類型語言也很有效。

結果就是,Clojure的CPU性能可以吊打JavaScript V8虛擬機,而V8又可以吊打世界上其他一切非Lisp的動態類型語言。(評測參見https://benchmarksgame.alioth.debian.org/u64/benchmark.php?test=alllang=clojurelang2=v8data=u64,V8和Clojure相比,唯一獲勝項目是正則表達式匹配,歸功於庫而不是虛擬機本身 )


用途差不多一致,都是JAVA虛擬機上的語言。JAVA能幹的他們都可以干,而且代碼量都比JAVA少很多。scala和clojure的可比性當然有,不說其不同的編程風格,scala看起來好像比較好用,至少沒有奇怪的S表達式,但是我個人更喜歡LISP風格的。scala是一門把函數式與面向對象式兩種編程風格結合起來的語言,表達力很強,但是學習成本也更高。

clojure不適合企業開發,和spring之類的框架不兼容,也玩不了什麼依賴翻轉,聲明式事務之類的魔術。

單從編程的角度來說,優雅簡潔的代碼,只有LISP才能寫出來。特別像數學公式,那種美很特別。很多人可能從來沒有感受到過,這一點可以理解。


Clojure 對 OO 的支持度是非常高的。

defprotocol , defrecord ,這兩個東西,編譯成子節碼對應的就是 java 的空介面,和 java 的類。他並不是模擬面向對象,是為了解決這一類的問題。

Clojure 也是可以完成依賴注入的。參照 component。

對於 Clojure 或者 lisp 來說,宏不是值得誇耀的東西, c 也有宏, 同像性才是。

lisp 常說的代碼即數據,說的是同像性,並不是宏。

對於宏的理解是,宏可以完成一些函數無法完成的部分,只有這部分才值得用宏,其他的部分是用函數。

pattern match 是在 core.match 里,只是不在core里而已。

Clojure 最優秀的部分是在設計的部分,Clojure 是一門設計的很好的語言。比如 nil 和 boolean 的關係,比如 var refer 分離變數的類型。每個地方都是充滿了設計感。

在我看來 Clojure最大的問題是啟動慢,原因大概是這樣的,一個 Clojure hello world 編譯出來 會編譯出來 4 個 class,載入到 jvm 之前會會把自定義的 classloader 和運行時庫,大概4000多個class 載入進來,啟動能不慢么..並且基本沒有什麼好辦法,jvm 熱完身之後還是比較快的

然並卵,軟體開發沒有銀彈。

------

優劣的話,只能說一句,cider 要比 idea 好用


看到樓上一直挺clojure,我說兩句,面向對象和函數式兩種範式都在嘗試從不同的角度去詮釋這個世界罷了,很多人有一個誤區,認為這個世界總存在一種一勞永逸的統一的詮釋方法,這是有問題的。人類認識世界的過程是有限的,科學可以接近真理,但永遠只是對真理的一種建模,不可能等同於真理本身。就像物理學有相對論和量子力學這種無法統一的理論,他們都是人們眼中對局部自然現象的建模,而非終極自然真理。人類對世界的認識在逐步擴大,但是只能永遠接近而無法達到終極自然真理,因為人類的經驗是有限的。

回過頭來說面向對象和函數式,任何企圖用單一範式來描述世界的語言,就好像希望用量子力學要統一相對論一樣可笑。從這點上來說,clojure完敗,而scala完勝。

大家寫多了oop的代碼,知道了它的問題,偶爾看這fp新奇,卻又沒接觸到fp自身的缺陷,所以才會對clojure這種純fp心存好感。然而clojure的設計視角從一開始就比兼容並包的scala低了很多,鑽牛角尖去了。

再說說純粹fp方面,我對 clojure也有一些疑問:

  • 為何語言層面不支持 match這種方便的東西呢?

  • 元組,list, vector(老的lisp是沒有vector的,這個算個進步吧)真的就能統治全宇宙?

  • 中文數字有時很方便,比如 「兩億」,阿拉伯數字要寫作 200000000,代數中全面用中文數字代替阿拉伯數字+字母也不是不可以,難說還會演化出很多技巧來,但是真的好玩么?

  • 前綴表達式到底是為了方便計算機閱讀還是方便人閱讀?

  • 宏這種東西有些優點,但真的該到處用么?

歸納下我的觀點,我的論點不是 clojure沒有優點,而是下面三點:

  1. 妄圖用唯一的範式描述世界是可笑的。

  2. 即便是fp,clojure也差 scala很遠。

  3. 如果你願意,scala也可以寫成前綴式,比如:ADD(z, MUL(x, y)), 但是scala不會強姦你。

所以結論很簡單,clojure對比 scala完敗,工程界的應用範圍也佐證了這一論點。

------

是的,clojure還有好多功能,也還可以模擬面向對象,這個觀點見我 「中文數字」 那一節。

------


scala是多範式語言,面向對象比java的複雜多了,函數式照搬了haskell風格的,也是較複雜的流派

clojure是lisp+函數式。為了實用,函數式的特性並不多。

我看到很多人感覺clojure比scala函數式,這個誤解很大啊。

scala對函數式的支持很多的,加上一些第三方庫,比如cats,完全可以把haskell風格的代碼寫出來。

比較哪個更函數式,請先移步去學一點haskell,估計就明白了。


先說一句實話:

目前,從就業和薪資角度考慮,我覺得用Scala是很不錯的。因為工作的機會多,需求量大,薪資也不低。

但是並不覺得Scala這門語言很好,寫Scala的過程中,一直都沒有什麼幸福感。感覺這語言是比較折騰人的,而我是懶得折騰的人。如果Scala不是現在這個樣子,而是傳承ML的優雅,那就太棒了。

再說Clojure, 之所以小眾是有原因的,諸多的缺點導致了人少,這些缺點,有一些在入門之後會消失,有些會變成優點,然而悲哀的是,它們畢竟把很多人擋在了門外。

從薪資和需求量角度來說,我沒法說Clojure的好。

括弧即是【正義】


都是 JVM 上的通用語言,只不過語法設計有些詫異,能有多少事情一個能做另一個不能做?

Scala 的 killer app 是 Akka 和 Play,但兩個也都開放了 Java API

Clojure 最知名的可能是 Storm,但也是有 Scala / Java 介面的。

功能上,因為主要的庫和框架幾乎都有 Java 介面,哪有一個能做另一個不能做的?


在TL上看到的這個問題,點進來一看,呃,至少我對第一個答案不大滿意.這兩種語言都是JVM上的函數式語言,Clojure偏Lisp風格,Scala偏Haskell/ML風格,都試圖在繼承Java龐大的嫌疑庫的基礎上,提供一門高效優雅強大的語言來代替Java.

目前看起來,Scala更熱鬧一些,因為有當紅炸子雞Spark的緣故,還有很多其它優秀的項目也是用Scala寫成,比如Kafka, Play.TypeSafe公司在推廣上比較老到,技術整合上也做得不錯,比如Akka的Actor做得比較好,就把Akka合併過來,原來的全部廢棄.但這也是Scala一個讓人詬病的地方,演進比較激進,時不時搞個向後不兼容.

Clojure我不大熟悉,但是大名鼎鼎的Storm是用它寫的,但是目前看起來Clojure的活躍程度似乎不如Scala高,而且除了Storm我也一下想不到有什麼其它著名的Clojure項目.

具體到樓主的問題,這兩門語言都是很優秀的語言,作為普通Java程序員,無論學習哪個,只要認真學習,理解它們的思想,都會受益匪淺.與其提問,不如兩個都看看,選一個自己更喜歡的.


都是JVM上的語言,都可以與Java交互,都是通用語言,一個語言能做的事另一個語言也能實現。

題主所說的哪個更好,是指哪方面好?當評判好壞優劣時,多少都會帶入個人喜好,上面的回答也可以看出來。即使是語言開發者在設計語言時也帶有個人喜好,Clojure作者明顯就是偏愛lisp,而Scala作者更偏愛OO。共性就是多範式語言是趨勢,只是哪個主導的問題。

個人比較偏向Clojure!先學的Scala,最後放棄了,太過複雜。使用Clojure需要多思考,否則寫出來的代碼可讀性比Java差很多,而優化後比Java好很多。

就目前市場來看,Scala明顯佔優勢,不過使用Clojure能從另一個角度看編程,驚喜度比Scala要高。

所以,如果是實用主義那Scala好,漲姿勢就Clojure好!


多年clojure中度用戶,寫過中型生產項目。clojure最大的特點在於純函數,適合習慣函數式思維的場景和開發,scala雖然也支持函數式,但是用它的java程序員很少用函數式的思想寫scala。純不純的特性造成了用scala的人也會輕易拋棄它,Kafka據說在LinkedIn內部已由java重寫,用clojure的人一旦用上手了就很難下賊船了,當然對於Java程序員較高的門檻也阻礙了對Java程序員的拉攏。

這倆語言都是要搶Java用戶的,不過貌似非java程序員出身的更容易持久使用下去,因為這些人就是想用JVM或者和Java社區更兼容,但是並瞧不上Java。

一說就說多了,各位見笑。


正如上面一個回答提到的一樣,這兩個語言一個很重要的區別是,Scala是強類型的靜態語言,Clojure是動態語言。所以Scala在開發複雜應用的時候應該更有優勢,畢竟很多錯誤在編譯階段就可以被發現。這兩種語言的強項應該都在大數據方面,Scala對應Spark,Clojure對應Storm。Spark定位是綜合的大數據平台,在Spark core的基礎上,支持非常豐富的應用,包括查詢,機器學習,流式處理,圖處理。而Storm主要是針對流處理。應該說Spark的應用面要廣的多。至於說這兩個語言在就業市場的表現,可以參考scala, clojure, groovy, erlang Job Trends


其實最後,你會發現還是寫Java好


stackoverflow上有關於Scala vs. Groovy vs. Clojure 三門語言的區別,這裡有對應的中譯版:Scala,Groovy,Clojure三門語言的區別。希望能有所幫助。


笑了,scala可以實現熱更新服務么?插件熱管理么?clojure語言風格也許有點怪異,但是熟悉了之後,你就覺得其他語言太繁瑣,而且前綴表達式個人覺得不只是為了機器閱讀在開發過程中也是有很多的方便的,中綴表達式中,有時不得不為了實現某個語義,加上很多括弧,前綴表達式中完全不存在這種問題。function language中面向數據的思想也是很好的,尤其是clojure對數據集合操作的支持,個人覺得很好用。


學習了clojure 後,感覺語法上讓你感覺很舒服,太簡潔了, 由於項目有時候必須用java 開發, 針對java 中的計算, 也就寫了一個類似與clojure (+ 1 2 3) 個工具類。。。


其實,我是不喜歡clojure繼承自lisp的語法...


一個是靜態語言

一個是動態語言


clojure 是 lisp 血統,學習之如飲醇酒,值得純 java 出身的人學習。

scala個人不喜歡,太雜,就那麼回事吧,難學,收益也不大,有興趣挑戰自我就去玩玩。

使用這倆語言寫的東西都不需要真去懂這門語言,人家提供了多重語言介面的,除非你想參與其開源項目或者自己要 hack。


推薦閱讀:

怎麼看高速鐵路和航空運輸未來的發展趨勢?
納什和庫里誰更強?
海賊王里為什麼薇薇能贏得這麼多人喜歡,而蕾貝卡討不到什麼好處?
為什麼《大秦帝國》遠不如《琅琊榜》火?
Ubuntu 和 Fedora 各自的優缺點是什麼?哪個更能代表 Linux 的發展趨勢?

TAG:編程語言 | Scala | A和B的比較 | Clojure | 聖戰 |