現代程式語言終極測評:五星篇

2021-01-13 新浪科技

來源:36氪

這篇文章,原標題是These Modern Programming Languages Will Make You Suffer,作者Ilya Suzdalnitski在文章中針對15種程式語言展開了詳細測評,希望對你有所幫助。

圖片來源:saashub

懶人目錄

概述篇:程式語言最重要的特徵

一星篇:C++,JAVA

二星篇:C#,Python,Rust,TypeScript

三星篇(上):Go,JavaScript

三星篇(下):Haskell,OCaml,Scala

四星篇:Elm,F#

五星篇:ReasonML,Elixir

 ReasonML

ReasonML是一門最終會被編譯成JS語言的函數式語言,它主要應用在web前端開發中。ReasonML不是一門新語言,它是OCaml(一種古老而久經考驗的程式語言)的新語法。ReasonML由Facebook提供支持。

通過利用JavaScript生態系統,ReasonML沒有OCaml同樣的缺點。

所屬的編程語系:ML

不是JS的超集

ReasonML的語法和JS類似,這使得使用過JS的人很容易上手ReasonML。但是,不像TypeScript,ReasonML並不是JS的超集,也沒有繼承JS數十年來積累的一些糟糕設計。

學習時需要付出的代價

因為ReasonML不準備成為JS的超集,所以這門語言比JS簡單很多。任何有過用JS進行函數式編程經驗的人,都可以在差不多一周之內上手ReasonML。

ReasonML真的是這裡提到的最簡單的程式語言之一了。

函數式,但非純函數

不像Elm,ReasonML甚至不準備成為一門純的函數式語言,也沒有「永不出錯」的目標,這意味著ReasonML非常實用,並且專注於開發者生產力,能很快地實現結果。

類型系統

ReasonML就是OCaml,這意味著它的類型系統幾乎和Haskell一樣好,ReasonML類型系統最大的缺點是,缺乏類型類,不過它支持函子(更高階的模型)。

ReasonML是靜態類型的,它的類型推論幾乎和Haskell一樣好。

生態系統

不像TypeScript,ReasonML已經獲取了整個JS生態系統。

 JS/TypeScript互操作

ReasonML編譯成純JS,因此可以在同一個項目中同時使用ReasonML和JS/TypeScript。

ReasonML與React——絕配

如果你正在進行web前端開發,那麼你就有機會使用React了。你是否了解,React最開始就是用OCaml寫的,然後才被移到JS上來幫助採用?

因為ReasonML是靜態類型的,所以無需擔心PropType。

還記得JS測評部分那個看上去無害但是卻導致了性能災難的例子嗎?

ReasonML對於不可變性數據結構有合適的支持,這樣的代碼不會造成性能問題:

id: 「0」,

firstName: 「John」,

}

friends=[samantha, liz, bobby]

onClick={id => Js.log(「clicked 」 ++ id)}

/>

與JavaScript不同的是,當使用ReasonML時,沒有任何東西會得到不必要的重新呈現,非常好的開箱即用的React性能。

 工具

ReasonML幾乎不像它的替代語言們那樣成熟(比如TypeScript),它在工具方面有一些問題。舉個例子,官方推薦的VSCode擴展推論語言伺服器目前已損壞,不過還有其他替代品。

ReasonML在底層使用了OCaml編譯器,而OCaml以非常糟糕的編譯器錯誤消息而「臭名昭著」。雖然這不是致命的缺陷,但還是有點令人沮喪,並可能影響開發人員的生產力。

我希望隨著這門語言變成熟,它的相關工具能夠有所改進。

 空值

ReasonML沒有空引用,它用Option模塊來表示可能不存在的值。

 不可變性

ReasonML為不可變性數據結構提供了一流支持。

模式匹配

ReasonML有很好的模式匹配支持。

結論

ReasonML可能就是TypeScript想要實現的結果,只不過TypeScript失敗了。ReasonML在JS的基礎上增加了靜態類型,同時刪除了所有糟糕的特徵(並增加了真正重要的現代特徵)。

 最佳前端語言獎

ReasonML獲得了「最佳前端語言獎」。毫無疑問,ReasonML是web前端開發最好的選擇。

 Elixir

Elixir可能是世界上最受歡迎的函數式程式語言了。和ReasonML一樣,Elixir並不是一門真正的新語言。Elixir是在Erlang三十多年的成功之上建立的。

Elixir是Go的函數式表親。和Go相似,Elixir最開始就專注並發性來設計,這是為了利用多核處理器的優點。

和一些其他函數式語言不同的是,Elixir非常實用。Elixir專注於結果,我們不會在Elixir社區看到很多學術討論,Elixir論壇上充滿了實際問題的解決方案,這個社區對新手特別友好。

所屬的編程語系:ML

 生態系統

Elixir的閃光點在於它的生態系統。在大多數其他程式語言中,語言和生態系統,是兩個獨立的東西。而在Elixir中,生態系統中的核心框架是由核心Elixir團隊開發的。

José Valim是Elixir語言的設計者,也是Phoenix和Ecot——Elixir生態系統中兩個超級酷的庫——的主要貢獻者。

在絕大多數其他語言中,有多個不同的庫專注同一個任務——許多不同的web伺服器,許多不同的ORM等等。在Elixir中,開發需要專注於一些核心的庫,因此庫的質量也非常高。

Elixir庫的文檔特別好,有許多例子。不像一些其他語言,Elixir的標準庫也有很多相關文檔。

 Phoenix框架

Phoenix框架的口號是「Phoenix感覺剛剛好」。與其他語言中的框架不同,Phoenix有很多內置功能。它開箱即用,支持WebSocket、路由、HTML模板語言、國際化、JSON編碼器/解碼器、無縫ORM集成(Ecto)、會話、SPA工具箱等等。

Phoenix框架因強大的性能而出名,它能夠在一臺機器上處理數百萬個同步連接。

 全棧Elixir

Phoenix框架最近引入了LiveView,它允許在Elixir中建立豐富的實時web接口(對比單頁應用程式)。不需要JS,也不需要React!

LiveView甚至可以負責同步客戶端和伺服器狀態,這意味著我們不必為REST/GraphQL API的開發和維護操心。

 數據處理

當處理很多和數據處理相關的任務時,Elixir是Python的可靠替代品。在用Python和Elixir構建了一個網頁數據抓取工具之後,對比發現,Elixir對於這個任務,是一門更好的語言和生態系統。

像Broadway這樣的工具允許在Elixir中構建數據攝入/數據處理管道。

 類型系統

在我看來,缺少恰當的靜態類型是Elixir最大的缺點。因為Elixir不是靜態類型,它的編譯器(以及dialyzer)會在編譯時報出很多錯誤。這和動態類型語言(比如JS, Python, 以及Clojure)有很大不同。

速度

Elixir編譯器是多線程的,提供了極快的編譯速度。與JVM不同,Erlang VM啟動速度很快。對於Elixir的用例來說,運行時性能非常好。

可靠性

Elixir是在Erlang之上創建的,Erlang花費了超過三十年的時間來創建世界上最可靠的軟體。一些在Erlang VM之上運行的程序能夠實現99.9999999%的可靠性。世界上沒有其他的平臺擁有同樣水平的可靠性。

並發性

大多數其他程式語言都不是為並發性而設計的。這意味著,編寫使用多線程/多處理器內核的代碼遠不是一件小事。

其他程式語言使用執行並行代碼的線程(以及線程讀/寫入的共享內存)。這種方法通常容易出錯,容易出現死鎖,並導致複雜性呈指數級增長。

Elixir構建在Erlang之上,Erlang以其出色的並發特性而聞名,它採用了一種完全不同的並發方法,稱為actor模型。

在這個模型中,進程(actor)之間沒有共享的內容。每個進程都保持各自的內部狀態,在不同進程之間通信的唯一方法是發送消息。

值得提及的是,正如它的創建者阿倫·凱(Alan Kay)最初所設想的那樣,actor模型實際上是OOP,它沒有任何東西是共享的,而對象只通過傳遞消息進行通信。

讓我們來快速對比Elixir和它命令式表親Go:

和Go不同,Elixir起初是為了容錯率而設計的。當一個goroutine崩潰時,整個Go程序都會崩潰。在Elixir中,當一個進程掛掉時,只有這一個進程會掛掉,而不會影響程序的其餘部分。

更好的是,失敗的進程會由主管自動進行重啟。這允許失敗的進程重試失敗的操作。

Elixir進程也非常輕量,一個人可以輕鬆地在一臺機器上執行成千上萬個進程。

 擴展

讓我們再和Go作一個比較。Go和Elixir中的並發性都利用了並發進程之間的消息傳遞。因為Go編譯為本機代碼,所以Go程序在第一臺機器上運行得更快。

但是,一旦你開始擴展到第一臺機器之外,Go程序就會開始輸掉比賽。為什麼?因為Elixir從一開始的設計就是可以在多臺機器上運行的。

Elixir運行的Erlang VM在分發和擴展方面非常出色。它可以無縫處理許多繁瑣的事情,如集群、RPC功能和網絡。

在某種意義上,在微型服務真正面世的數十年前,Erlang VM就已經實現了微型服務。每個進程都可以被理解為一個微型服務——和微型服務一樣,每一個進程都是獨立的。

在語言內置通信機制的情況下,進程在多個機器上運行是一件普遍的事情。

沒有Kubernetes複雜度的微型服務?仔細了解一下,你就會理解Elixir設計的真正目的。

 錯誤處理

Elixir用特殊的方法進行錯誤處理。純函數式語言(Haskell/Elm)被設計出來是讓錯誤的可能性最小化,而Elixir則假設錯誤一定會發生。

在Elixir中,允許拋出異常,但是捕獲異常一般是不被鼓勵的行為。進程主管會自動讓程序一直運行。

學習時需要付出的代價

Elixir是一門簡單的語言,新手可以花一到兩個月入門。使學習變得困難的是OTP。

OTP是Elixir的殺手級特性。OTP是一套來自Erlang的工具和庫,而Elixir是在Erlang基礎之上建立的。這是一種「秘方」,它大大簡化了並發和分布式程序的構建。

雖然Elixir本身很簡單,但使用OTP設計Elixir系統會花上一點時間,至少對我來說是如此。

 學習資源

作為最受歡迎的程式語言,Elixir有著豐富的學習資源。這些學習資源往往對新手也很友好。

模式匹配

Elixir有很好的模式匹配支持。

 數字處理

Elixir不能很好地處理計算密集型任務。編譯成本機語言的程式語言能夠更好地處理這些任務(比如Go/Rust)。

那Erlang怎麼樣?

對於企圖和目的,Elixir和Erlang的本質是相同的。Erlang是一種功能強大的語言,它的語法很奇怪。Elixir可以被認為是Erlang的一種更好、更現代的語法(還有非常好的生態系統和社區)。

結論

Elixir可能是所有函數式語言中最成熟的,它也可以在為函數式編程製作的虛擬機之上運行。Elixir最開始是針對並發性設計出來的,並且在多核處理器的現代社會中,它是最完美的搭配。

獎項

Elixir獲得了兩個獎項。

第一,它的彈性、函數優先的方法和驚人的生態系統使它成為「構建web API的最佳語言」。

第二,OTP和actor模型使得Elixir成為「構建並發和分布式程序的最佳語言」。和命令式表親Go不同的是,用Elixir編寫的軟體能夠橫向擴展到成千上萬個伺服器上,並且有開箱即用的容錯率。

寫在最後:在工作中使用正確的工具

圖片來源:Haupes Co。 / Unsplash

你會用螺絲刀錘釘子嗎?應該不會吧。那麼,我們也不應該試圖用一門程式語言完成所有任務,每一門語言都有它最合適的工作領域。

Go是最適合系統編程的語言。最適合前端開發的語言毫無疑問是ReasonML,它符合一門極好的程式語言的絕大部分要求。

Web API開發的冠軍絕對是Elixir,它唯一的缺點就是缺少靜態類型系統(這一缺點也因為其良好的生態系統、社區、可靠性,以及並發特徵而抵消了)。對於任何類型的並發軟體/分布式軟體,最好的選擇是Elixir。

如果你正在數據科學領域工作,那麼,非常遺憾的是,你只能選擇Python了。

文已至此,我衷心地希望,這篇文章能夠對你有所幫助。比較程式語言並不是一件容易的事,不過我已經盡力了。

相關焦點

  • 第一篇:C語言編程基礎語法
    本專欄系列分六篇,總結了C語言基礎知識的核心要點。教學視頻已上線,讀者可根據自身情況有選擇性地學習。01編程基礎C語言——貝爾實驗室、Dennis Ritchie屬於高級語言,更接近人類語言邏輯,需要編譯器編譯,執行依賴運行環境;但容易學習。其特點:模塊化編程程序設計,層次清晰;語句簡潔,提出程序庫概念;功能強大,系統、應用軟體均可開發;移植性好,適合不同的作業系統。除此之外,C語言還有豐富的運算符、數據結構等,程序設計自由度大,可以對硬體進行操作。
  • 10 種最具影響力的程式語言
    前幾天,我讀了這篇「 20 種有史以來最重要的程式語言」,這是一張「我剛剛編出來的荒謬的表格」。它之所以荒謬,是因為他列出的「最重要的」語言中包含了 Go,但沒有包含 ALGOL、Smalltalk 或 ML。他也沒有提到 Pascal,因為它「基本上已經消亡了」。荒謬!這完全違背了「有史以來最重要」的含義。
  • 計算機程式語言的發展簡史,人工智慧與雲計算程式語言!
    學習一兩門計算機程式語言也如當初學習英文一樣的火熱,隨著人工智慧AI和雲計算的不斷發展,Python語言和Scala語言已經成為這兩個領域裡面最為火熱的程式語言了,可以預知未來學習計算機程式語言的人也一樣會如同學習英文一樣的成為一種新常態,並且成為一種穩定的常態。以下筆者將以自己的學習認知,簡單的闡述一下計算機程式語言的發展。
  • 英文字母已成現代中文一部分,爭論漢字編程還是英文編程已無意義
    我前面寫了幾篇關於漢字的文章,總有人拿計算機編程說事,說漢字無法解決編程,如何能被稱作偉大?今天我就來說說這個問題。一、任何語言都能被用來編程計算機是二進位系統,只能識別0和1兩個符號,這是整個計算機世界的基礎。人類是可以用二進位編程的,但效率太低,所以人類發明了彙編語言,可以將人類語言轉化為二進位指令,從而達到簡化計算機編程的目的。
  • 世界程式語言排行榜
    導讀:TIOBE 程式語言社區排行榜是程式語言流行趨勢的一個指標,每月更新,這份排行榜排名基於網際網路上有經驗的程式設計師、 課程和第三方廠商的數量。排名使用著名的搜尋引擎(諸如 Google、MSN、Yahoo!、Wikipedia、YouTube 以及 Baidu 等)進行計算。
  • 十大流行程式語言和它們的創造者
    軟體開發領域裡有許許多多程式語言。在這裡,不斷有新的程式語言在誕生,如Scala、Go、Closure等,也不斷有老的程式語言慢慢消亡。它們中的許多都曾為軟體開發作出了巨大貢獻。作為軟體開發領域中最重要的事物,程式語言從一誕生起就會經歷人們的議論、批評與改進。
  • 電腦入門程式語言
    今天和大家介紹一下電腦入門編程學什麼語言更合適。首選python語言,python 是一門開源免費、通用型的腳本程式語言,現在社會上會python語言的人很吃香的。它上手簡單,功能強大,堅持「極簡主義」。
  • 編程新手快來看!關於程式語言和程序,這篇文章可以說講透了
    什麼是程式語言?我們要學習的程式語言是C++,因為自1998年起大學先修課程考試就基於C++語言了。之前的考試用的是Pascal語言。C++和Pascal都是高級語言,你或許也聽說過Java、C和FORTRAN等其他高級語言吧。從「高級語言」這個名字可以推斷,應該同樣存在低級語言,低級語言一般也稱為機器語言或彙編語言。不嚴格地講,計算機只能執行低級語言編寫的程序。正因如此,高級語言編寫的程序需要經過翻譯才能運行。翻譯也要消耗時間,這是高級語言的一個小缺點。
  • 開發者眼中的程式語言……
    本文為大家簡述下當前流行的八款入門神器,看看各位開發者眼中的程式語言是怎樣的。 Pascal 儘管頗有些廉頗老矣的味道,不過在C,Java,Python盛行的今天,Pascal仍不失為初學者最佳入門語言的選擇之一。作為良好編程實踐的典範語言,Pascal對於初學者來說是挺適合的。
  • 程式語言Python的重要性
    Python是近年來最流行的程式語言之一。其清晰的語法和可讀性使其成為初學者的完美編碼語言。考慮到它的廣泛用途,認為學習Python是必不可少的,這是可以學習的。這提出了一個問題:Python什麼時候不是正確的答案?什麼時候Python程式語言是學習和/或使用的錯誤語言?
  • 鐵修羅杜蘭朵劍終極版遊戲鍵盤宏編程功能完整剖析
    鐵修羅秉持著為了更豐富玩家於遊戲中的操作感受,精心設計了直覺操作的宏功能編程軟體,透過這宏功能編程軟體強大的功能,讓玩家自行編輯設計屬於自我個性的操控樂趣,在虛擬世界戰鬥中,運籌帷幄,悠遊無界。鐵修羅TESORO杜蘭朵劍終極版LED背光機械式鍵盤在軟體上下了苦工夫,最大的特點就是可以對任意按鍵進行編程,不過因為杜蘭朵劍鍵盤在快捷按鍵上預設了很多功能,在最新的軟體上也進行了更改
  • 戲說程式語言發展史
    (期待地搓手手……)隨著人工智慧時代的來臨,編程也成為了社會的學習大熱門。到底編程是什麼呢?從1951年2014年,人類一共發明了幾百種程式語言,每一種語言的出現都帶有某些新特徵。1801年,Jacquard織布機是第一臺可進行程序控制的織布機。
  • Python 程式語言的發展簡史
    我看到了Python中許多功能的來源和Python的設計理念,看到了一門程式語言的演化歷史,看到了Python與開源運動的奇妙聯繫。從Python的歷史中,我們可以一窺開源開發的理念和成就。這也可以作為我寫的Python快速教程的序篇。起源Python的作者,Guido von Rossum,確實是荷蘭人。
  • 程式語言這麼多,為什麼就只有C 語言能一直得到 SQLite 的青睞?
    C 語言是最好的 SQLite 在 2000 年 5 月 29 日發布,並一直使用 C 語言實現。C 語言一直是實現 SQLite 這類軟體庫的最佳語言,目前還沒有計劃使用其他程式語言重新開發 SQLite。
  • ICRT國際測評結果公布,7款國產手機獲評五星
    讀創/深圳商報記者 董思 日前,2020年ICRT智慧型手機比較試驗結果公布,華為、一加、歐珀等國產手機獲得五星評價。本次比較試驗由德國、英國、葡萄牙、義大利等消費者組織共同發起,共測試22個品牌超過150個型號的樣品。
  • 最適合兒童的程式語言 - Python
    Scratch圖形編程優點在於圖形化拖拽的方式簡化了編程的理解,而C,JAVA,JAVASCRIPT,PYTHON等程式語言相對枯燥複雜,涉及複雜編程語法,變量規則,函數,對象等等,因此直接教授這類程式語言對於小朋友難度過大。
  • Python程式語言:如何運用正則表達式
    這篇文章,小編要和大家分享的知識是Python語言的正則表達式,以及自己學到的使用方法!學會正則表達式可以幫助我們抓取網絡信息,正則表達式又叫Re庫!這裡我們要了解什麼是正則表達式,正則表達式是用來簡潔表達一組字符串的表達式!
  • 理想ONE在C-AHI測評中獲雙五星評價
    1月13日,理想汽車公布了2020款理想ONE(參數|詢價)六座版車型的中國汽車健康指數(C-AHI)測評結果,該車在車內揮發性有機物(VOC)&車內氣味強度(VOI)、車輛電磁輻射(EMR)兩項評級中均獲得五星評價。
  • 學生如何在大學學習程式語言
    如果您還想學習編程,這裡是在大學學習程式語言的指南。學習編程的簡便方法編程是當今越來越多的學生採用的最先進和最有價值的技能之一。它在未來有很多職業機會,可以使您的大腦伸展並提高技能,從而創造出很棒的東西。如果您想開始編碼和編程之旅,請查閱下文。
  • 假如女人是一種程式語言
    假如女人是一種程式語言,也許每個男人心中都有自己最喜歡的那一個吧?我認為女人可分兩類,「面向過程」和「面向對象」。「面向對象」的女人以尋找終身伴侶為目標,而「面向過程」的,則以經歷難以忘懷的愛情時光為己任。各位程序猿當然也要按需選擇最適合自己的「程式語言」,不要因為時髦而盲目追求「面向對象「,有時候過程可能比結果更重要。