最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

“竟想替代 C 語(yǔ)言?編程語(yǔ)言Go、Rust、C++ 和 Zig 生產(chǎn)力對(duì)比!

2021-04-02 18:40 作者:C語(yǔ)言編程__Plus  | 我要投稿

C 已經(jīng)快 50 歲了。對(duì)于一瓶葡萄酒來(lái)說(shuō),這個(gè)年齡很棒,但對(duì)于快速發(fā)展的行業(yè)中的編程語(yǔ)言而言,它就不同了。在過(guò)去的十年中,出現(xiàn)了許多具有不同風(fēng)格的新語(yǔ)言,所有這些語(yǔ)言都試圖在某種程度上成為 C 語(yǔ)言的替代者。


當(dāng)一種新語(yǔ)言或多或少變得流行時(shí) —— 開(kāi)發(fā)人員開(kāi)始編寫(xiě)基準(zhǔn)測(cè)試,以展示該語(yǔ)言編寫(xiě)的軟件性能,CPU 利用率和內(nèi)存使用量以及二進(jìn)制文件的大小等等。

在這里,我想在不同的層面上進(jìn)行一些實(shí)驗(yàn) —— 編程語(yǔ)言的 UX(用戶(hù)體驗(yàn)),使用這種語(yǔ)言時(shí)開(kāi)發(fā)人員的效率,使用它們的容易程度,常見(jiàn)的挫敗感,閱讀代碼的感受。我相信編程語(yǔ)言的 UX 與它們的技術(shù)特征一樣重要,并且對(duì)語(yǔ)言的成功做出了很大的貢獻(xiàn)。

注意:該文章的其余部分帶有很多主觀(guān)色彩。

實(shí)驗(yàn)

讓我們編寫(xiě)一個(gè)應(yīng)用程序,該程序以遞歸方式掃描當(dāng)前目錄中的所有文件,并在與給定通配符匹配的文件中打印這些行。類(lèi)似于ag?或grep?,但使用通配符而不是正則表達(dá)式。二進(jìn)制文件應(yīng)被忽略。

我發(fā)現(xiàn)這個(gè)問(wèn)題是一個(gè)很好的練習(xí),因?yàn)樗故玖巳绾螌?shí)現(xiàn)非常簡(jiǎn)單的通配符匹配算法(該算法可用于字符串和數(shù)字之類(lèi)的純數(shù)據(jù),無(wú)需學(xué)習(xí)任何庫(kù)或 API)。該算法應(yīng)通過(guò)一些非常簡(jiǎn)單的測(cè)試。然后,它需要一些非常通用的底層 API,例如遞歸掃描目錄或逐行讀取文件。問(wèn)題的所有部分都非常簡(jiǎn)單,小巧且范圍廣泛。這個(gè)小程序當(dāng)然也可以用其他任何語(yǔ)言實(shí)現(xiàn)。

我想測(cè)試該語(yǔ)言與常規(guī)的 “write-compile-run-debug” 循環(huán)的“友好”程度,為匹配算法編寫(xiě)測(cè)試的復(fù)雜度,找到與文件一起使用所需的 API、系統(tǒng)和基本 I/O 的難易度,指出錯(cuò)誤時(shí)編譯器的友好程度,語(yǔ)言的“直觀(guān)性”等等。

我的樣本量相當(dāng)謙遜 —— 僅我本人。但是為了避免偏見(jiàn),建議你自己做(不要花太長(zhǎng)時(shí)間)并比較結(jié)果。用不同的語(yǔ)言編寫(xiě)小程序后,我讓同行的開(kāi)發(fā)人員(約 20 人)閱讀并給我反饋,哪些界限不清楚,哪些閱讀和理解起來(lái)“更容易”。這些開(kāi)發(fā)人員沒(méi)有使用這種語(yǔ)言的經(jīng)驗(yàn),但是能熟練使用其他語(yǔ)言,例如 Java,C#,JavaScript,Kotlin 和 Swift 等。

我在這里測(cè)試的語(yǔ)言是 C++,Go,Rust 和 Zig。我得到的結(jié)果程序可以在 GitHub 找到:https://github.com/zserge/glob-grep?,請(qǐng)隨時(shí)批評(píng)。


Zig

從 Zig 開(kāi)始,因?yàn)槲蚁肟纯?Zig 是什么類(lèi)型的語(yǔ)言。之前聽(tīng)到過(guò)這個(gè)語(yǔ)言有不錯(cuò)的反饋,但是一直沒(méi)用過(guò)。沒(méi)有經(jīng)驗(yàn)可談,我打開(kāi)了 Vim 并開(kāi)始編寫(xiě)代碼。

我花了大約 1 個(gè)小時(shí)來(lái)完成程序。通配符匹配算法(我以前知道,只需要在 Zig 中實(shí)現(xiàn))花了我大約 20 分鐘的時(shí)間。其余主要在尋找 API 來(lái)進(jìn)行目錄掃描和文件讀取。

TLDR:出色,直觀(guān)的小語(yǔ)言,較差的是 stdlib 和 docs。

我喜歡的是:對(duì)于 C 程序員,該語(yǔ)言出奇的直觀(guān)。感覺(jué)很簡(jiǎn)單,關(guān)于語(yǔ)言的文檔(而不是 stdlib)非常清晰和友好。

對(duì)于年輕的語(yǔ)言而言,Vim 集成也相當(dāng)不錯(cuò)(在啟用 Vim 插件之前 —— 格式化錯(cuò)誤(編譯器錯(cuò)誤)使我很郁悶)。

我喜歡錯(cuò)誤處理方法。喜歡該語(yǔ)言附帶的測(cè)試工具。甚至喜歡字符串只是字節(jié)數(shù)組,就像在 C 中一樣。

我對(duì)附帶分配器的第一個(gè)反應(yīng)是震驚,但實(shí)際上它甚至沒(méi)有引起注意。它給人以極簡(jiǎn)主義的感受,即該語(yǔ)言的核心是如此簡(jiǎn)單,以至于它甚至不使用動(dòng)態(tài)內(nèi)存。同樣,非常接近 C。

在編寫(xiě)此代碼時(shí),我必須閱讀許多 Zig 編譯器和 stdlib 源代碼,并且代碼非常簡(jiǎn)潔明了。

我不喜歡的東西:stdlib 文檔太糟糕了。我從目錄掃描和文件 I/O 中學(xué)到的所有知識(shí)–我都是從 GitHub 搜索結(jié)果中獲得的,這也非常稀缺。

編譯器提示消息也不是很友好,但是對(duì)于熟悉 C 的人來(lái)說(shuō),這沒(méi)什么大不了的。

在 stdlib 中缺少字符串處理例程是出乎意料的,要連接字符串,必須手動(dòng)做所有事情 —— 分配緩沖區(qū),將字符串放在那里?;蛘呤褂酶袷交绦蚝头峙淦鱽?lái)同時(shí)打印兩個(gè)字符串,然后釋放緩沖區(qū)。但這仍然和s1+s2?有很大不同。

總的來(lái)說(shuō),核心語(yǔ)言很簡(jiǎn)單,我很喜歡它,但是 stdlib 比 libc 更受限制。我希望這只是該語(yǔ)言早期的標(biāo)志。

實(shí)際上,讀 Zig 代碼的人都提到了這點(diǎn)。它有點(diǎn)冗長(zhǎng),但明確,可預(yù)測(cè)且易于理解。毫不奇怪,因?yàn)樵撜Z(yǔ)言在設(shè)計(jì)時(shí)考慮了可讀性(沒(méi)有隱藏的控制流,沒(méi)有隱藏的分配,沒(méi)有宏,沒(méi)有運(yùn)算符重載,沒(méi)有元編程等)。


Rust

我嘗試學(xué)習(xí) Rust,但失敗了。我花了 2 個(gè)多小時(shí)才完成此程序,完成后我感到失望。

TLDR:復(fù)雜。

我喜歡的東西:編譯器提示消息友好。該語(yǔ)言的文檔也不錯(cuò)。但僅此而已,我這次并沒(méi)有了解生命周期、錯(cuò)誤處理等。圍繞該語(yǔ)言的工具既現(xiàn)代又不錯(cuò)。

我不喜歡的東西:編譯器消息太冗長(zhǎng),占據(jù)了整個(gè)屏幕。我可不想rustc --explain?為每個(gè)錯(cuò)誤而奔波。求求你,不要懲罰我。文檔有時(shí)也太冗長(zhǎng)。我的意思是,最好有更多的文檔而不是更少的文檔,但是先擁有 TLDR 版本會(huì)更好。對(duì)于 stdlib 來(lái)說(shuō),也是如此,一小段功能及其用一句話(huà)即可完成的工作將更容易閱讀。有&str?,Str?和[u8]?,讓新手感到驚訝。

總體而言,Rust 中的編碼對(duì)我來(lái)說(shuō)就像是解決難題。可能會(huì)很有趣和令人興奮的地方,尤其是在將 Rust 用作一種業(yè)余語(yǔ)言時(shí),但是對(duì)于大多數(shù)任務(wù),我寧愿使用一種“人機(jī)工程學(xué)”的語(yǔ)言,這種語(yǔ)言幾乎不會(huì)引起注意。

讀 Rust 代碼過(guò)程中,經(jīng)常會(huì)罵出至少兩個(gè) “wtf”。他們經(jīng)常抱怨語(yǔ)法不清楚,需要注意細(xì)節(jié)。而且,模式匹配對(duì)于“主流”開(kāi)發(fā)人員仍然是陌生的事情。


Go

這是作弊。我曾經(jīng)使用 Go,但是我還是想在這個(gè)實(shí)驗(yàn)中嘗試一下。正如我期望的那樣,我花了大約 15 分鐘就能使我的完整 “glob” 實(shí)用程序正常工作。

TLDR:富有成效,但固執(zhí)己見(jiàn)。

我喜歡的東西:感覺(jué)非常有用,文檔對(duì)我來(lái)說(shuō)很神奇 ——簡(jiǎn)短但有用,可以立即打開(kāi)相關(guān)的 stdlib 函數(shù)源碼并進(jìn)行進(jìn)一步研究。根據(jù)過(guò)去的經(jīng)驗(yàn),在編寫(xiě)應(yīng)用程序時(shí),我已經(jīng)設(shè)想了如何使其成為多線(xiàn)程并提高性能(簡(jiǎn)單的 fan-out)。

我不喜歡的東西:太多東西(緩沖 I/O,GC)存在。你不會(huì)覺(jué)得自己可以控制一切(就像在 Zig 中一樣)。太自以為是 —— 這是列表中唯一需要我創(chuàng)建 3 個(gè)單獨(dú)的文件才能使其起作用的語(yǔ)言。仍然會(huì)犯一些低級(jí)錯(cuò)誤,例如意外的變量 shadow 或在循環(huán)內(nèi)使用 defer。

讀 Go 代碼,會(huì)發(fā)現(xiàn)它很清楚,有些人對(duì)內(nèi)聯(lián) walker 函數(shù)感到好奇(它們不一定是內(nèi)聯(lián)的,他們是正確的)。一些人想知道多重分配,比如a, b = c, d?,這種寫(xiě)法感覺(jué)更混亂了。具有諷刺意味的是,如果我是 Go 語(yǔ)言的新手,我會(huì)寫(xiě)出更直接的 Go 代碼。


C++

盡管我有一定的 C 經(jīng)驗(yàn),但是與現(xiàn)代 C++ 卻相去甚遠(yuǎn),因此我決定嘗試一下。我花了大約 20 分鐘才能完成,這是出乎意料的。

TLDR:好老的“朋友”。

我喜歡的東西:感覺(jué)很熟悉,就像認(rèn)識(shí)一個(gè)過(guò)去的老朋友一樣。我喜歡這些文檔,并提供了許多示例和良好的可讀性。看到如今的 stdlib 這么強(qiáng)大,我感到很驚訝。文本編輯器和 IDE 中的支持也非??煽?。

我不喜歡的東西:不良的工具 —— 沒(méi)有構(gòu)建系統(tǒng),沒(méi)有測(cè)試工具,沒(méi)有 linter。我們過(guò)去習(xí)慣使用它,但這并不是現(xiàn)代開(kāi)發(fā)人員所期望的。太強(qiáng)大了 —— 對(duì)于這項(xiàng)任務(wù),C++ 感覺(jué)非常有生產(chǎn)力,但是我可以想象自己在某個(gè)時(shí)候處于決策癱瘓狀態(tài),這時(shí)有許多不同的方式來(lái)做某事,而所有事情都是一樣的(或不好的)。

讀 C++ 代碼的人實(shí)際上過(guò)去至少已經(jīng)讀過(guò) C 或 C++,這是他們大學(xué)課程的一部分。我猜很多人抱怨使用::?,所以我應(yīng)該正確使用名稱(chēng)空間。總的來(lái)說(shuō),由于我在 C++ 代碼中沒(méi)有“品味” —— 我敢肯定它可以寫(xiě)得更清楚,但是我也看到在沒(méi)有注意到的情況下它可能寫(xiě)得更糟。


其他基準(zhǔn)

所有語(yǔ)言均生成靜態(tài)可執(zhí)行文件,大小均相同(2 ~ 5MB)。最小的是 Zig,最大的是 Rust。掃描整個(gè)/usr/include?文件樹(shù)時(shí),它們的性能幾乎相同。這就是為什么我要強(qiáng)調(diào)技術(shù)特性(主要指性能)通常不如開(kāi)發(fā)人員體驗(yàn)?zāi)敲粗匾?/p>

我想另外提一下構(gòu)建時(shí)間。我運(yùn)行了整個(gè) build + test + clean 循環(huán)一百次。Go 最快(如預(yù)期的那樣),其他三個(gè)都是基于 LLVM 的,速度要慢 3 到 4 倍。

這意味著什么?這個(gè)結(jié)果并不令人驚訝,并且經(jīng)常有關(guān)于語(yǔ)言的陳詞濫調(diào):Go 易于閱讀,Rust 復(fù)雜,C++ 熟悉,Zig 看起來(lái)很有希望,但還太年輕而無(wú)法判斷。

如果我必須編寫(xiě)與 C 代碼沒(méi)有進(jìn)行大量交互的新服務(wù)/實(shí)用程序 —— 我肯定會(huì)選擇 Go。如果必須調(diào)用某些 C 或 C++ 庫(kù) —— 不幸的是,我會(huì)堅(jiān)持使用 C++。Rust 和 Zig 在現(xiàn)代編程世界中將占據(jù)什么位置 —— 只有時(shí)間會(huì)證明一切。我希望 Zig 有更好的文檔,這樣可能在它變得過(guò)于小眾和淹沒(méi)之前獲得流行。我一定會(huì)更加關(guān)注它,到目前為止,這是我遇到的第一個(gè)真正的 C 替代品,尤其是在涉及低級(jí)編碼時(shí)。

當(dāng)然,盡管年代久遠(yuǎn),C 仍然存在。在很多地方,C 是唯一的實(shí)際選擇。我很高興 C 還保持青春。

原文鏈接:https://zserge.com/posts/better-c-benchmark/,本文作者:zsergo

PS:另外對(duì)于學(xué)習(xí)編程或者正在工作的朋友,如果你想更好的提升你的編程能力乃至轉(zhuǎn)行,彎道超車(chē),快人一步!筆者這里或許可以幫到你~

微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地

分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!



“竟想替代 C 語(yǔ)言?編程語(yǔ)言Go、Rust、C++ 和 Zig 生產(chǎn)力對(duì)比!的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
孝义市| 靖边县| 民县| 林西县| 宾阳县| 洛扎县| 建水县| 陆川县| 田阳县| 芜湖市| 襄城县| 米泉市| 泽州县| 五指山市| 上饶市| 怀来县| 图们市| 宝清县| 西平县| 鸡西市| 公主岭市| 长兴县| 绥阳县| 黄骅市| 江华| 安乡县| 靖州| 靖宇县| 虹口区| 四会市| 同仁县| 临猗县| 盐津县| 海丰县| 登封市| 习水县| 新安县| 盐津县| 屏山县| 砚山县| 济南市|