C++、Haskell、Scala 和 Rust 究竟哪個最複雜?


Scala就是那個研究生髮paper用的語言吧?那我站它最複雜。

C++就是那個一大堆設計失誤歷史遺留的語言么?那我站它第二複雜。

Haskell就是那個純函數式的語言嗎?那我站它第三複雜。

Rust就是那個更新後就不兼容那個?那能複雜到哪去,複雜的全給剔除掉了。


個人覺得從使用角度來講rust應該稍簡單?

haskell和scala屬於簡單用用不難,深入起來比較複雜的那種。(各種ghc擴展,jvm那些事什麼的等等)。

Cpp的話...cmake我不會用怎麼辦啊QAQ


我覺得比較複雜度得從兩個角度來比,一個是『語法複雜度』,一個是『實現複雜度』,另外還要明確一點是『複雜』不等於『困難』,比如相對論學起來難但是理論很簡潔。

比較語法複雜度看語法的BNF就好了。ANTLR4提供的https://github.com/antlr/grammars-v4里有Scala和C++ 14的語法,去掉注釋、空行和token定義和BNF差不多,Scala有295行(官方的CFG有223行,差不多),C++ 14有681行。Haskell不開GHC的擴展,根據2010 report大概有168行,開了就不好說了,我估計能和C++有一拼……Rust的grammar specification一直沒找到,但我感覺應該是介於C++和Scala之間。

綜上,語法複雜度:C++14 ≈ 擴展全開Haskell &> Rust &> Scala &> 核心Haskell

至於實現的複雜度這個不好比……但我相信C++絕對是第一,特性實在是太多了。Haskell的ghc應該也能和C++一戰;Scala稍次,但是給JVM擦屁股應該也做了不少功夫;Rust應該最簡單吧,特性不多而且llvm分擔了很多優化。


謝邀,這幾門語言我花精力最多的就是Haskell了,C++次之,其他則有些了解,因此只能憑自己的感覺來判斷了。

從學習上來說Haskell是最複雜的了,從使用的細節上來說C++是最複雜的,Scala則是語法噪音最多的語言。

不過就個人來說,Haskell的複雜是其能很好的控制大型程序,在設計大型程序時,用Haskell語言能較容易的把握核心複雜度。Haskell的複雜實際上是大型程序本身的複雜度在程序語句上的直接體現。當用C和C++寫大型複雜程序時,程序本身的複雜度則體現在架構設計中。因而在寫較簡單的程序時,用Haskell的這種思維方式就顯得過於複雜了,有些得不償失。


誰編譯速度慢誰就更複雜,所以


題主可以試著找用語言A實現的複雜點的東西,然後試著用其他語言B,C,D實現以下。

看看會遇到哪些坑。

如果在A中簡潔自然的,在B,C,D中複雜或寫不出來或性能太低或不可擴展維護。則A中該特性是有用的。

反之,該特性是語法或語義的噪音。

我就是看了下Haskell實現FingerTree的論文,想用C++實現一下,結果費了半天勁寫不出來。只能說明我太菜了,思考方式擰不過來。直接套Haskell那種風格的代碼的話,模板C++根本不資瓷,估計只能先熟悉C++OOP那一套理論才有可能寫的出來。

但是這又引出了另一個問題。每種語言設計之初都有設想中的最佳實踐的,這種實踐方式是不是符合程序員自身的心智和項目需要,就是另一回事了。


就題主說的四門語言,說一下我的一偏之見,希望大家指正:

C++ 語言的複雜性主要在於範式多,風格差異大以及與生俱來的不安全性。但 C++ 的諸多範式除了兼容 C 的那部分都算不上個中典型,默認靜態綁定的 OO 就像是沒有辣椒的川菜,模版元編程和 C++ 固有的類型系統合作起來也像是強扭的瓜。而且 C++ 的不少思想及標準規則都是自成一套且規定死的的,所以 C++ 範式雖多但觸類旁通性其實很差。實用性上,C++ 雖然很不友好,但因為歷史的積累和老本,吊打另外三者簡直是綽綽有餘,而且短期內,其地位也很難被另外三者所動搖。

Haskell 語言的複雜性在於其範式太冷艷獨特,因為 Haskell 骨子裡有一種一切可以抽象處都抽象了、一切可以組合處皆用組合、一切可以用標點符號處絕不寫英文的數學家精神,加之其無副作用的純粹性,初學會非常之彆扭。但 Haskell 平地起高樓的、一切可推導而不是一切按規矩的極講道理的理性語言風格對學習者了解所有的編程語言設計乃至宏觀上的架構設計的本質和邏輯都是大有裨益的。

Scala 被稱為 JVM 上的 C++ 是不無道理的,它和 C++ 一樣地追求大雜燴,而且比 C++ 更甚,但和 C++ 不同,Scala 在各子範式語言設計上是有講究和品位的。目前,Scala 已經依靠 Spark、Kafka 等明星產品在 DT 領域有了絕對的一席之地,實用性考量上(找工作)也是有保障。但因為 Scala 語言本身缺乏思想主線,所以私認為 Scala 是一門可以學但絕對要謹慎深入的語言,否則迷失方向或走火入魔都是分分鐘之事。

Rust 其實和前三者比起來遠算不得複雜。Rust 有一點和 C++ 很像,兩者都是偏好規定而不是偏好推導的語言,即在很多問題上的態度都是:「在我的地盤你得聽我的規矩,但我的規矩為什麼這麼定我不必告訴你,反正你得按我來」。但 Rust 比 C++ 講道理的一點就是,你按照 Rust 的規矩來,你有安全保障,而你按照 C++ 的規矩來,還未必能有安全保障。拋開歷史理由,其實 Rust 是比 C++ 更適合實用的語言,但因為爹不夠硬,推廣度不夠,目前的使用面還是偏少。


個人觀點

Rust 是最簡單的。

理由是我不知道 Rust 有什麼確實很難搞的內容。

Haskell 要處理無副作用的數據結構,這個有時候簡單有時候就很困難了。

Scala 有那些傳統的大坑:異常、null。

C++ 不用說了,沒有指針生存期,你必須處理各種不安全的指針,至少 C++ 的文化要求你這樣,因為「C++很快」。

剩下就是 Haskell、Scala 和 C++ 哪個最複雜。

C++ 的學習曲線平緩,問題就是這個坡雖然緩但是太長了。

Haskell 的話只有一個編譯器,但是這個團隊對讓 Haskell 對開發者更友好這方面似乎沒有足夠的興趣,這就產生了一種被詛咒的感覺。

Scala 不說了,沒啥好感。

本來「哪個最複雜」這種曖昧的問題應該是沒有答案的,不過非要選一個我當然就選 Scala。不知道一個號稱以 PLT 專家支撐的社區是怎麼把事情搞糟的。

當然上面都是從用戶的角度說的。

從實現一套編譯器的角度來說,顯然 C++ 和 Scala 是複雜的那一類,相比較之下 Haskell 和 Rust 就成了較簡單的那一類。沒看過 GHC 代碼,估計整個 GHC 會比現在 rustc 複雜許多,畢竟它自帶各種語言擴展。C++ 和 Scala 哪個更難實現我個人不好估計,猜測 Scala 會比 C++ 複雜許多。


從智力上來講:Scala &> Haskell &> C++ &> Rust

從記憶力上來講:Scala &> C++ &> Rust &> Haskell

從Stackoverflow找答案的難度上來講:Scala &> Rust &> Haskell &> C++


歪個樓~~

和語言本身應該沒關係,關鍵是要看誰寫出來的~。


編程語言作為一種工具,是拿來處理問題的。因此只有針對某個具體的場景這個問題才有實際的意義。不提供場景的話,語言複雜度這種東西沒有一個公認的定義,憑感覺來誰也不服。

不過強行要找一個標準的話,我們可以用一個近似的可度量的指標——語言規範的大小。一圖勝千言:

所以,C++ &>&> Haskell &> Scala &> Rust。有人覺得字數更客觀:

n4296版 c++: 479,584字(word, 下同)

Haskell 2010: 96804

Scala: 59185

Rust:24349

與文件大小的展示一致。

Rust最簡單,大家的直覺是對的,畢竟複雜的都被不兼容掉了;中間的Haskell和Scala學院派出品,核心概念非常簡潔,不過Scala因為JVM的關係有一些妥協;C++ Language Specification 有1368頁,嗯,《C++十年——從入門到放棄》;那些覺得C++不複雜的,你們都是在用帶類的C么?


這個問題。

當然是D啊!

你看看你們C++的模版和有多難用,最後還不是硬生生的抄了一套constexpr和static if。

這樣下去,遲早變成D。

然後根據其他答案,最複雜的當然就是D啦。


這幾個語言都寫過一點 hello world,直觀感覺(難度):

Haskell &> C++ &> Scala &> Rust

C++ 一開始感覺簡單,不過我發現要達到精通遙遙無期。。。Haskell 沒學過範疇論根本沒法愉快的寫程序嘛。。。

其實主要是因為我這智商也是沒啥希望了。。。


這道題沒有簡單的答案。

Scala的作者馬丁奧德斯基說過:

「簡單還是複雜」的辯論本身就不簡單。複雜度是個多維的矢量。在一場討論中,水友們筆下的「複雜度」往往是指複雜度不同維度上的分量。

完整的文章:

中文版:簡單還是複雜?

英文版:Simple or Complicated ?

最近我們在激烈討論,有人說Scala對正常程序員來說很複雜,有人說Scala其實是一門編碼很簡單的語言。有兩個帖子在討論(http://michid.wordpress.com/、http://warpedjavaguy.wordpress.com/2010/08/02/the-scala-is-too-complex-conspiracy-1/)。後面的回帖也值得一看。

看了這些帖子和回帖後,我覺得很多人沒講到一塊,完全是雞同鴨講嘛。所以我想舉例說明這個問題不像表面上看的這麼簡單。

哪邊更簡單?

造哪個更簡單?顯然是前者。

用起來更簡單的呢?取決於……哼哼哼。如果你沒用過鍵盤,也沒用過電話,你可能覺得學莫爾斯電碼還容易點。但我們其他人肯定覺得智能手機更簡單啊。

和別的語言比,Scala更像智能手機而非莫爾斯電報機。Scala編譯器和核心標準庫本身是極其複雜的軟體,但用戶體驗卻自由又友好。我有證據證明Scala真心易用。瞧瞧基於Scala的Kojo(http://netbeans.dzone.com/learn-scala-with-kojo),是教小屁孩初學編程用的。再說印度有上百名高中女生從Scala開始學編程(http://www.himjyotischool.org/)。這就是證據啊,即使不是名校博士生或者超級牛人之類的普通人也能上手嘛。

你可以說這樣比不公平。智能手機和莫爾斯電報機都是硬梆梆的硬體,編程語言卻很開放,更像可以拼起來的玩具套裝而非消費品。

好,那我們就看看可以拼起來的玩具套裝。

哪邊更簡單?

左邊的摩比世界的形狀種類要比右邊的樂高多,所以你可能覺得樂高簡單些。

另一方面,對搭積木這件事來說,摩比世界提供的是固定的方案,而樂高則提供了近乎無限的選擇。某些人有選擇恐懼症(患病的不一定是他們本人,也可以是他們的同事)。對他們來說,摩比世界比樂高簡單。

Scala更像樂高而非摩比世界。從客觀指標看,Scala的概念並不多,還算簡單。比如咱們可以比比各種語言的關鍵字數量(http://carlosqt.blogspot.com/2010/07/how-many-keywords-do-you-type-in-your.html)。我自己從頭比了比上下文無關語法的數量,Scala相當緊湊,和Haskell或OCaml相當,比Java5稍少,比C#和C++少得多。

(Scala作為一種語言,的確比圖靈機或Lambda演算複雜,但後兩者就相當於程序語言中的莫爾斯電碼。Scala也比Python、Scheme或者Clojure複雜,但Scala有完備的靜態類型系統,不可避免的增大了語言的開銷)。

從另一角度看,因為Scala的許多概念都很通用很正交,所以能以各種方式組合起來。所以毫無疑問Scala為完成幾乎所有任務都提供了多種方式供選。這就要求通過實踐找出比其他方式更好的最佳方案。因而也要求你必須接受,有時達到好的設計會存在不止一條途徑。

你對這些比較可能仍然懷有不滿,因為不管怎麼說,幾乎所有的編程語言都圖靈完備,所以在這個層面上,每種語言都能實現其他所有語言的功能。而摩比世界可並不完備,至少摩比世界造不出壽司大餐。

那麼我們用樂高和樂高比,要得不?

哪邊更簡單?

左邊的樂高得寶系列顯然比右邊的樂高科技系列簡單,沒錯吧?

沒錯,但如果給你個任務讓你造一個比較特別的東西,你用哪個系列?可能用得寶系列你也能造出來,但一定比用科技系列彆扭。更有可能你需要用到的積木得寶系列中根本沒有(比如繩狀或膠狀積木)。

現在你該猜中了 :-) Scala更像科技系列而非得寶系列。相比別的語言,Scala能引導我們更簡潔的解決問題。Scala還可以進行依賴注入(http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di.html),而別的語言則需要引入外部配置文件才能做到。

顯然,這意味著Scala每行代碼乾的活更多,所以你會提出Scala比那些代碼冗長的語言更難理解。但有實驗證明(http://infoscience.epfl.ch/record/138586)事實並非如此,最終程序員會更適應緊湊的代碼而非冗長的代碼。

我希望我能讓你相信,「簡單還是複雜」的辯論本身就不簡單。複雜度是個多維的矢量。在一場討論中,水友們筆下的「複雜度」往往是指複雜度不同維度上的分量。


我主動避開的語言,說明都複雜...

C、scheme、Lua 和 Go 究竟哪個最簡單?


對比之下我不能回答哪一個是更簡單的,但是我心裡有自己的對於最簡單的衡量,用我自己的標準衡量,我認為最簡單的是彙編


rust 沒寫過。偶然機會有項目組裡的老外提到haskell,scala,看了相關文檔後,haskell的設計思想很特別,如果是學生的話,推薦學習下,當前scala應用還可以,所以自學了其官方文檔,你會發現scala集各家所長,語法糖不錯,然後你可以繼續走akka,spark平台路線,應用scala。

再回過頭來說C++,個人認為難度是最大的,毫無爭議,我的經驗是,看完書,感覺自己都懂了,但一碰後面的習題,又是懵逼(c++ primer,還沒實戰呢,還有比這更深奧的經典書一堆)。現在我做JAVA了,回首那幾年,我認為我做不了好的c++程序員。學了c++後,可能你會用c++的工作方式理解JAVA甚至js引擎,有些問題一看就再自然不過了,秒懂。

學習路線顯然c++在前。如果你已經工作了,算了,別學了,看到C++果斷跑,該幹啥幹啥,就像火影里碰到血輪一族一樣。


難道有指針的語言不應該比自帶gc的語言要複雜嘛。


scala學習過一段時間,語法太多,真的是燒腦,尤其是模式匹配。


肯定是C++最複雜啊。函數式語言和邏輯編程語言的core language一般都很簡潔。C++的core language就足夠複雜了吧。在加上C++各種變態的特性。。。


c++最難

Haskell沒有當第一的理由是它的純粹。

cpp是一橫跨彙編到面向對象函數式的語言。

當他把底層和高層揉在一塊的時候一個sizeof就問你懵不懵。

Scala 語法糖太多,但是你可以寫的不那麼nice。很大原因它的複雜來自jvm局限性。所以搞出了classtag 這樣的東西。所以第三


其他的我不確定,但是rust是最簡單的


Scala最複雜,

Scala學習難度 = Java +Scala

不會Java的Scala程序員和逗逼沒什麼區別

Scala類型複雜程度

伴生類,樣例類,普通類等等....

Scala函數式編程

各種蘭布達表達式,自己寫過過一星期自己絕對不認識

Scala應用範圍

無縫調用Java所有包,可以完美契合Java,也就是說Java能做到的他都可以做到

Scala編程

Scala的互聯網項目編程,可以說難度比其他語言高出幾個數量級,對於並發,Actor模型和Akka框架掌握是有必要的,整個並發編程難度就比其他語言高出很多

那些噁心人的高級特性,Scala泛型 、定界延續 、下劃線 、Scala反射就有兩種、 科里化 、動態類、 高級函數、 集合有那麼多種,變數聲明還要考慮是否是可變不可變......,總之,寫一行代碼,需要考慮的事非常多,十行Scala代碼可以完成其他語言50行做的事,一行代碼可以有十幾種寫法

我是Scala的死忠粉,用他做過大數據,做過互聯網項目,做過爬蟲,這個語言實在不適合團隊協作,你們隊伍里一個人離開,他的代碼可能其他人根本看不懂,這門語言非常神奇,有很大的潛力


推薦閱讀:

TAG:編程語言 | Scala | C | Haskell | Rust編程語言 |