首頁 >後端開發 >Golang >我嘗試了所有熱門程式語言

我嘗試了所有熱門程式語言

DDD
DDD原創
2024-12-16 10:14:11553瀏覽

在這篇文章中,我將嘗試比較 GoLang、Zig 和 Rust。以及為什麼 Rust 贏得了這次比較(對我來說)。

故事時間!

我用 GoLang、Zig 和 Rust 寫了 3 個項目。這些項目足夠大,可以很好地了解語言基礎、缺點以及語言、框架或生態系統是否有問題。

提示:請隨意跳到 TLDR 部分以獲得該死的答案。

Go語言

幾個月前我開始建立開發者工具,最初使用 GoLang。

第一個是基本的資料庫管理和遷移實用程式 (dbdaddy),我真的很喜歡使用 GoLang。

儘管這是我第一次嘗試用GoLang 構建比Advent Of Code 和10 億行挑戰問題更嚴重的東西,我很驚訝我花了不到一周的時間就精通了它 .

之字形

一直以來,我都在和 Zig 一起玩(沒什麼太嚴重的)。我聽說 Redis 將其許可證更改為“技術上非開源”許可證。

我心想:在 zig 中建立一個新的開源 Redis 有多難?

I Tried Every Hot Programming Language

快轉 2 個月後:該死。

「GbCache」背後的基本思想是基於 LRU 的記憶體緩存,但實際的事實來源是保存在磁碟上,以及諸如引起的特定鍵/值更改的通知以及分配給鍵的 TTL 之類的功能。

Zig 的明確性令人印象深刻,這使得它變得更加簡單且更容易使用。

我從「如果明天要使用 HyperScale™,它能處理負載嗎?」的角度啟動了 GbCache

這個觀點驅使我排除了 GoLang,因為如果我無法極其確定地推理記憶體分配,我將無法完全控制速度。

從這個角度做事是一次非常好的學習經歷,因為突然你開始看到程式中所有可能崩潰、耗盡記憶體或可能成為瓶頸的點-程式碼中的熱路徑.

由於 Zig 的明確,我確定了我在何時何地分配記憶體

但是... Zig 歸根結底並不是一種記憶安全的語言,而我是一個技能問題與珠穆朗瑪峰一樣大的人。

進入鐵鏽

在過去 2 年裡,我曾 3 次嘗試並憤怒地退出 Rust。來自 JavaScript 背景,我們的 macbook m69 maxes 中有大量 GB 內存,我從來沒有真正理解為什麼 Rust 有這些規則,並且從炒作的角度來看待它可能是一個糟糕的角度.

儘管我多次憤怒地退出,Rust 仍然在我的腦海中,它奇怪的語言、令人沮喪的內存規則和令人難以置信的生命週期。

但是在寫 Zig 時,有件事讓我受到了打擊...我已經在跟踪所有這些記憶規則和生命週期,但這是一種精神負擔

我開始注意到 Zig 程式碼中的模式和樣板,試圖做 Rust 已經做的事情。

在為 SFS(SFW 名稱 - “簡單檔案儲存”)建立 CLI 用戶端時,我決定再次嘗試 Rust。

這次,在翻閱這本生鏽的書時,我開始感受到這一切的「原因」。

我喜歡 Rust 的最基本的一點是基於所有權和借用的記憶的心智模型

儘管這種擁有和引用的記憶模型是虛構的,但它是一種方便推理的心智模型,並且在我的頭腦中產生的開銷更少

與 C 和 Zig 等語言在您頭腦中產生的經典心理記憶模型相反。 必須在腦海中追蹤各個記憶體分配及其生命週期嗎?不用了,謝謝!

總長DR

Go語言

  • (就像你的 5 個月活躍用戶會需要它一樣)
  • 可靠
  • 愚蠢的簡單,語言永遠不會成為你和你的目標之間的障礙
  • 偉大的軟體包生態系統

之字形

  • 速度極快
  • 愚蠢的簡單

  • 速度極快
  • 可靠
  • 偉大的軟體包生態系統

他們全部

  • 驚人的錯誤處理

如果你是日常普通的後端工程師,並且喜歡計算他們的衝刺性能,那麼你最好的選擇可能是GoLang

「但是我的公司不使用 GoLa—」
「離開公司,離開它,為工具使用正確的工作。離開公司。」

對我來說,GoLang 就像一場包辦婚姻,你內心永遠不會感到那種匆忙,但它永遠不會讓你失望,它是你的生死攸關的伴侶,你可以把你的一生都押在它上面它。

但是我的朋友,如果您正在尋找那種高峰,請繼續閱讀!

魯斯特普蘭

但是我想要那種衝動…我想要看到他們的眼睛語法時我的心就會爆炸…當我和他們在一起時,我想要感覺自己在天堂見鬼,當我不.. .

I Tried Every Hot Programming Language

讓我們快速看一下 Rust 中多執行緒安全的範例。

我們有一個堆分配的值,並且有 10 個執行緒嘗試獨立修改它。

此程式碼不安全地存取計數器變量,因為所有執行緒都會嘗試同時修改計數器。

在其他語言中,類似的程式碼會愉快地編譯和運行。

如果您以前在多執行緒環境中工作過,您的第一個想法可能是使用「互斥體」來防止更新計數器變數時的競爭條件。

但是由於人為錯誤,在大型程式碼庫中很容易錯過這樣的小事。

Rust 甚至不允許這個程式編譯。

由於所有權和借用規則,編譯器將檢測到您在for 循環的第一次迭代中的第一個線程中可變地借用計數器...到目前為止還好. ..第二次迭代還想可變地並行借櫃檯? 不安全!引發編譯時錯誤! !

出於變異/修改的目的而從其所有者處引用或「借用」值稱為「可變借用」

在這種情況下,其他語言根本不會給你任何錯誤。檢查正確性是你的責任,Rust 會阻止這種情況發生。

像這樣在語言中傳播的結構可以幫助你避免搬起石頭砸自己的腳(經常)。

結論

這要看情況!

真的希望有一種語言能夠答案,即使 GoLang 非常接近這個目標,它實際上取決於您的用例,最重要的是您的團隊。

對我來說,與 Rust 合作很愉快(現在,誰知道呢......呵呵)

TigerBeetle 的人們在 Zig 上嘗試了一次機會,他們對此很滿意。

Primeagen 對 Zig 更滿意。

對 Jarred Sumner 來說,Zig 很好,他用 Zig 寫了 Bun。

Mitchell Hashimoto(HashiCorp 背後的人)正在 Zig 中書寫幽靈,這是一個速度極快的術語 —

.
.
.

等等...

以上是我嘗試了所有熱門程式語言的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn