現代編程語言終極測評:概述篇

廣告:二哥網絡科技公司!

客服微信13005636712 主營業務:專業刷拚多多銷量,拚多多改銷量,代刷淘寶天貓、京東拚多多、dsr動態評分、代刷淘寶1-4鑽信譽等級、還有更多的業務請加二哥微信谘詢,誠招代理合作夥伴!

- - - - - - - - - - - - - - - - - - - - -

編程語言哪種好?這可能是許多學習編程人員甚至是外行人員都會麵對的頭疼問題。網絡上普遍的編程語言介紹,大多都是東拚西湊的內容,並且無法讓人真正認識和了解各種語言的優缺點。這篇文章,原標題是These Modern Programming Languages Will Make You Suffer,作者Ilya Suzdalnitski在文章中針對15種編程語言展開了詳細測評,希望對你有所幫助。

現代編程語言終極測評:概述篇

圖片來源:assignmentexpert

懶人目錄

概述篇:編程語言最重要的特征

一星級篇:C++,JAVA

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

三星級篇(上):Go,JavaScript

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

四星級篇:Elm,F#

五星級篇:ReasonML,Elixir

你是否想知道:某個編程語言的優缺點是什麽?某個編程語言是否能完成我的任務?

通過百度或穀歌等搜索引擎,當你在搜索“最好的編程語言”時,往往會發現各種各樣的文章,裏麵介紹了Python, Java, JavaScript, C#, C++, PHP等編程語言,同時還會拚湊一些讓人無法清晰理解的優缺點。

每次看到這種文章,我都會感到十分痛苦,我可以感受到作者的懶惰,毫無經驗,並且缺乏想象力和思考能力。

因此,我希望通過這篇文章,跟大家深入討論和測評現代編程語言,發現各種語言背後的優缺點。

在這篇文章中,我會嚐試對較為常見的現代編程語言做出客觀且公正的概述與分析,測評排名順序從一顆星到五顆星(注:半顆星歸至一顆星分類)。

值得注意的是,沒有一種編程語言能夠完美地適用於所有用例。比如,有些語言適合用在前端開發中,有些語言則是和後端或者API編寫更加契合,還有些語言適用於係統程序設計。

我還會談到兩種常見的語係:由C語言發展而來的編程語言,以及由元語言(ML)發展而來的編程語言。

編程語言並不僅僅是開發者工具箱中的一個普通工具。如果開發者能夠根據特定的任務選擇合適的語言,會達到事半功倍的效果。希望我的建議能夠幫助你選擇最適合你完成任務的編程語言。

編程語言最重要的特征是什麽?

絕大多數類似的文章都會基於編程語言的受歡迎程度賺錢潛力來作比較。但事實上,受歡迎程度並不是一個好的評測標準,特別是在編程時。在本文中,我將著重考慮各編程語言的優缺點

我會用“點讚👍”“點踩👎”或者“一般👌(即不好也不壞)”這三種方式來對各種編程語言的特征評分:

那麽,芭乐视频app官网下载入口現在來看看,除了語言的受歡迎程度之外,在對編程語言測評時,什麽特征最為重要?

類型係統

許多人都對類型係統推崇備至,這也是為什麽像TypeScript這種類型的語言最近幾年會如此受歡迎。我也傾向於同意的是,類型係統可以消除程序的大量錯誤,並且使得代碼重構更加簡單。但是,擁有類型係統隻是其中一部分要求。

如果一門編程語言擁有類型係統,那麽它最好還得要有類型推論。最好的類型係統不需要顯式標注函數簽名,就能夠推斷出絕大多數類型。但是,大部分編程語言隻提供部分基礎的類型推論。

要是一個類型係統能夠支持代數數據類型,那也是極好的(之後會詳細討論這一點)。

最厲害的類型係統應該支持泛型的高級類類型(Higher-kinded Type),讓芭乐视app下载安装能夠在更高階的抽象層麵上編程。

芭乐视频app官网下载入口還應該認識到,人們可能把類型係統看得過於重要了。編程語言中的有些特征比靜態類型更加重要。因此,選擇一門編程語言時,不應該把是否擁有係統類型作為唯一標準。

學習時需要付出的代價

假設世界上存在一門完美的編程語言,但如果新手開發者要花數月甚至數年的時間去入門和學習,那麽這門語言學來又有什麽用呢?另外值得注意的是,一些編程範式甚至需要花費數年時間去完全掌握。

因此,一門好的編程語言應該對於初學者來說,是需要容易上手的,並且不需要花費幾年時間才能掌握。

空值

我把它稱之為價值億萬的錯誤。它是1965年時,我使用空引用造成的產物。當時,我正在設計第一個為引用製作的全麵類型係統,它是使用麵向對象語言編寫的。我想要確保的是,在編譯器自動檢查的情況下,所有引用的使用都是安全的。但是我引入了空引用,這造成了數以萬計的錯誤、漏洞以及係統崩潰,並在過去四十年中可能導致了一億萬美元的損失。

——空引用發明者、圖靈獎得主托尼·霍爾(Tony Hoare)

空引用之所以不好,是因為它會破壞類型係統。當null是一個默認值時,芭乐app最新版本下载官网就不能再依靠編譯器來檢查代碼的可行性了。任何空值都是等待著點燃的炮彈。有時候,如果芭乐视视频网页版認為一個值不為空,並直接使用它(但實際上它就是一個空值),在這種情況下,就會出現運行異常。

function capitalize(string) {

return string.charAt(0).toUpperCase() + string.slice(1);

}

 

capitalize("john");  // -> "John"

capitalize(null);   // Uncaught TypeError: Cannot read property 'charAt' of null

為了確保芭乐视视频网页版想要處理的值不為空,芭乐视视频网页版必須手動進行運行時檢測。即使是靜態類型語言,空引用也會減弱其類型係統的優勢。

function capitalize(string) {

if (string == null) throw "string is required";

 

return string.charAt(0).toUpperCase() + string.slice(1);

}

事實上,運行時檢測(也稱作null守衛)是針對不好的編程語言設計的臨時解決方案,它會讓芭乐视app下载安装的代碼樣板化。最糟糕的事情是,芭乐app最新版本下载官网並不能時刻記得去檢測空值。

對於一門好的語言來說,檢測值是否存在的類型檢測,應該在編譯時進行。

擁有另外的缺失值處理機製的語言,應該獲得更高排名。

錯誤處理

捕獲異常是很糟糕的處理錯誤的方式。隻有當程序崩潰,並且沒辦法恢複的異常情況下,芭乐视app下载安装最好才可以拋出異常。像空值一樣,異常會破壞類型係統。

當異常被用作處理錯誤的主要方式時,芭乐app视频下载官网不可能知道一個函數能不能成功返回一個值。畢竟,如果它運行過程中存在錯誤,那麽異常就會拋出。會拋出異常的函數也是不可能分解的。

function fetchAllComments(userId) {
const user = fetchUser(userId); // may throw

const posts = fetchPosts(user); // may throw

return posts    // posts may be null, which again may cause an exception
.map(post => post.comments)
.flat();
}

當然,如果僅僅因為芭乐app最新版本下载官网不能存取數據,就導致整個應用崩潰的話,這也是絕對不行的。但事實上,這種情況卻普遍存在。

因此,芭乐app最新版本下载官网可以選擇手動檢查是否存在異常,但這種方法並沒有保證,因為芭乐app视频下载官网可能會忘記進行這個操作。同時,這個操作還會增加許多幹擾信息:

function fetchAllComments(userId) {
try {
const user = fetchUser(userId);

const posts = fetchPosts(user);

return posts
.map(post => post.comments)
.flat();
} catch {
return [];
}
}

如今,已經有很多更好的錯誤處理機製。在這些機製中,應在編譯時就進行類型檢查,發現潛在的錯誤。非默認使用異常的編程語言會獲得更高的排名。

並發性

摩爾定律已經走到了盡頭,處理器不能再變快了。芭乐视app下载安装生活在多核CPU的時代,這就意味著,現代應用必須能利用多核的優點。

但遺憾的是,目前使用的絕大多數編程語言都是在單核計算時代設計出來的,所以,它們並不能很好適應多核。

並發庫是事後添加給語言的,最開始的語言設計中並沒有考慮並發性,這些庫就像輕輕貼上的創可貼。可想而知,這樣的設計不能帶來友好的開發體驗。在一門現代編程語言中,內置的並發性支持是必須考慮的因素(比如Go/Erlang/Elixir)。

不可變性

規模大的麵向對象程序會麵臨著複雜度越來越大的問題,因為芭乐视app下载安装需要對變換的對象建立大量的對象圖。需要去理解和記住的是,當你要調用一個方法時,會發生什麽,又會產生哪些副作用。

— Clojure語言創建者裏奇·希基(Rich Hickey)

使用不可變值來編程的方法變得越來越受歡迎了,甚至一些現代UI庫中(比如React)都開始傾向於使用不可變量。因為不可變性能夠消除代碼中的一大類bug,所以我認為,對不可變數據值提供一流支持的語言應該獲得更高排位。

那麽,不可變狀態是指的什麽呢?簡單來說,就是不能被更改的數據(比如大多數編程語言中的字符串)。舉例來講,將字符串改為大寫會返回一個新的字符串,而原來的字符串並不會被改變。

不可變性則是進一步發展了這個思想,以此確保事物的不變性。比如說,當芭乐视视频网页版修改用戶名時,在程序中會產生一個全新的、帶有更新後用戶名的用戶對象,而原始的用戶對象也會被完全保留。

在不可變狀態下,沒有東西是共享的。因此,芭乐视视频网页版也不用擔心線程安全的複雜性。不可變性讓芭乐app最新版本下载官网的代碼更加容易並行化。

不改變任何狀態的函數被稱作純函數,它是易於測試和推論的。當使用純函數時,芭乐视频app官网下载入口不用為函數外的事情操心,芭乐app视频下载官网隻需要專注於正在使用的函數即可。相比需要記住一整個對象圖的OOP來說,這種設計的便利性可想而知。

生態係統/工具

一門語言如果擁有一個大生態係統,那麽它就足夠吸引人了。如果開發時能夠獲取到優質的庫,那麽整個過程就會事半功倍。

芭乐app视频下载官网可以在JavaScript,Python等編程語言中看到這樣的特性。

速度

一門語言編譯時能夠做到多快呢?程序啟動速度有多快呢?運行性能又是怎樣的?這些都是我會在語言排名中考慮的問題。

時代性

盡管有時會出現意外,但是總的來說,越新推出的編程語言越好,因為新推出的語言會修正舊編程語言中不好的設計,從而變得更加完美。

本文轉載著名的動態評分 網站:http://www.dongtaipingfen1688.com/若有侵權請聯係郵箱bidie168@163.com 感謝!

現代編程語言終極測評:概述篇:等您坐沙發呢!

發表評論

表情
還能輸入210個字