自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Rust、Zig,能夠干翻Java、C?

原創(chuàng) 精選
開發(fā) 前端
日,一場匯聚了新興語言的主要開發(fā)者的會(huì)議P99 CONF ,為我們帶來了Rust與Zig如何相互借鑒,并讓與會(huì)者們參與了挑戰(zhàn)C++、Go甚至Java等主流語言的探討。且讓我們一探Rust與Zig的未來。

撰稿 | 云昭

出品 | 51CTO技術(shù)棧(微信號:blog51cto)

眾所周知,由于其根源于 Mozilla,Rust 在歷史上與系統(tǒng)編程聯(lián)系在一起,它對安全性、速度和并發(fā)性的承諾,使其在基礎(chǔ)設(shè)施層面得到了廣泛采用。這種地位的上升引發(fā)了一個(gè)有趣的問題:Rust 在傳統(tǒng)上由動(dòng)態(tài)語言主導(dǎo)的領(lǐng)域是否擁有更高的地位?

近日,一場匯聚了新興語言的主要開發(fā)者的會(huì)議P99 CONF ,為我們帶來了Rust與Zig如何相互借鑒,并讓與會(huì)者們參與了挑戰(zhàn)C++、Go甚至Java等主流語言的探討。且讓我們一探Rust與Zig的未來。

一、Zig可以借鑒Rust,反之亦然

世界上偉大的事物往往是完全開放,既可以和而不同,又可以相互借鑒。Zig與Rust之所以快速成為全球編程社區(qū)的“寵兒”,也是做到了開放與借鑒。 

1.Zig學(xué)習(xí)Rust哪些?

Bun的創(chuàng)建者Jarred認(rèn)為,Zig可以Rust那里引進(jìn)“有限的編譯時(shí)概念”,比如在各種類似作用域的情況下的一些借用檢查器。此外,Zig安全方面還比較欠缺,兩個(gè)明顯的例子就是,還可以返回指向堆棧內(nèi)存的指針,例如堆棧分配的緩存區(qū),這都是不應(yīng)該做的。

Zig語言還非常新,但誕生之初就懂得借鑒。比如向Go借鑒了延遲(defer),即延遲鍵盤和語言。與Go實(shí)現(xiàn)的區(qū)別在于,它是針對每個(gè)作用域的,而不是針對每個(gè)函數(shù)的。在 Go 中,defer 會(huì)將其附加到函數(shù)的末尾,而對于 Zig 來說,它位于作用域的末尾。這通常就是開發(fā)者進(jìn)行資源清理的方式。 

但Zig的延遲做的還不夠好, 至少有某種形式的析構(gòu)函數(shù),因?yàn)樗苋菀妆煌??!坝袝r(shí)我確實(shí)希望有構(gòu)造函數(shù)和析構(gòu)函數(shù)……但我的心情很復(fù)雜?!?/p>

2.Rust羨慕Zig什么? 

Rust主要開發(fā)者Carl,則表示了Rust對于Zig編譯速度的羨慕?!癦ig 的編譯速度肯定要快得多。Rust 肯定會(huì)從中受益?!?/p>

Rust目前的一個(gè)痛點(diǎn)就是:一旦你擺脫借用檢查器而使用 Rust 進(jìn)入不安全代碼,它就很不符合人體工程學(xué),而事實(shí)上,在編寫nice的不安全代碼方面,Rust其實(shí)有許多地方可以改進(jìn)。Carl表示:我們編寫的不安全代碼比典型的應(yīng)用程序開發(fā)人員多得多,因?yàn)槲覀冋跇?gòu)建這些類型的原語。Zig在這方面可以給Rust以靈感。

P99 CONF 的長期支持者Glauber,認(rèn)為 Zig 有兩件事可以讓 Rust 受益匪淺。第一個(gè)是comptime。comptime 是Zig一個(gè)非常好的特性,即在編譯期引入自身作為膠水語言來生成代碼的能力,甚至被Glauber稱為天才之舉,“我希望每種語言都有這樣的功能。

C++中的模板系統(tǒng)與 comptime 相比……根本不在同一個(gè)級別?!?/p>

可能很多人不太熟悉comptime, 簡單來說,它允許開發(fā)者在編譯時(shí)評估任意代碼。許多語言都有類似模板的語法,然后還有一些其他變體,一些其他方式來具有編譯時(shí)標(biāo)志、功能和參數(shù)。這也是類型系統(tǒng)的工作原理。例如,標(biāo)準(zhǔn)庫中的 ArrayList 類型接收 comptime 類型參數(shù),然后就有一個(gè)該類型的切片。這有點(diǎn)像編譯時(shí)的duck-typing類型。 

舉例來說,Zig用它來生成用于源映射解析的查找表。sourcemaps 使用這種編碼 VLQ?!叭绻覀兩纱瞬檎冶?,則源映射編碼速度將比以前快 18%。最初,我們是在運(yùn)行時(shí)執(zhí)行的。”Zig 使其變得非常簡單,因?yàn)橹恍鑲鬟f關(guān)鍵字即可。頂級作用域中的任何內(nèi)容都是 comptime,否則,就可以將其傳遞到作用域中的關(guān)鍵字 comptime 中。

第二個(gè),是 Rust交叉編譯到不同的平臺(tái),是一個(gè)非常痛苦的事情。這方面Go 做得非常好, Zig 也比 Rust 做得更好。

交叉編譯方面,Carl還透露了Zig的情況?!艾F(xiàn)在在 Bun CI 中,我們在 Linux 機(jī)器上為所有不同的平臺(tái)、每個(gè) Zig 部分構(gòu)建每個(gè)目標(biāo)文件。因?yàn)槊颗_(tái)機(jī)器都有大量內(nèi)存以使其編譯速度更快。因此,我們在 Linux 上構(gòu)建所有 Zig 代碼,即使它是針對 Mac OS 的。” 

二、用C的人為什么討厭Rust,喜歡Zig

Rust 一直是注重性能的 P99 CONF 社區(qū)的寵兒。即使我們以 C++、Go 甚至 Java 的令人印象深刻的性能成就案例研究為特色,討論也不可避免地轉(zhuǎn)向“但為什么不是 Rust?”

很多人習(xí)慣于C,將C用于高效工作,因?yàn)镃語言確實(shí)讓你的移動(dòng)速度快得令人難以置信(直到出現(xiàn)錯(cuò)誤)。他們選擇Rust,嘗試像C一樣編寫Rust,最終都會(huì)遇到Rc<RefCell<...>>,unsafe{...}等。

這種大量的錯(cuò)誤報(bào)告和“調(diào)試地獄”會(huì)帶來非常強(qiáng)烈的負(fù)面反應(yīng)。

但這并不意味著Rust太難了,其實(shí)有能力用C編寫生產(chǎn)軟件,就絕對有能力使用Rust。更多地在于,“當(dāng)C方式對我很有幫助時(shí),我不愿意學(xué)習(xí)Rust方式?!?/p>

這反而是Zig的利基市場。

如果您已經(jīng)了解 C,您可以在幾天內(nèi)學(xué)習(xí) Zig,并且比 C 更有效率。在我看來,這就是 Zig 的價(jià)值主張。它與 C 非常相似,您的大多數(shù)模式和根深蒂固的經(jīng)驗(yàn)都可以利用。你學(xué)習(xí)了 Zig 的 comptime,然后,你就掌握了帶泛型的 C 語言。您可以毫無障礙地依賴現(xiàn)有的 C 項(xiàng)目和庫。Zig 是“我在 C 語言中很有生產(chǎn)力,但想要更好的功能”語言。

三、Java開發(fā)者不妨考慮學(xué)Rust

“Rust并不是太困難。我是一個(gè)巨菜的菜鳥,連我都可以在大約一個(gè)月內(nèi)寫出一些不錯(cuò)的Rust。”

雖然舊版 Java 很簡單,但大部分時(shí)間都花在學(xué)習(xí)庫、構(gòu)建系統(tǒng)或非常復(fù)雜的應(yīng)用程序服務(wù)器上。這3個(gè)部分非常復(fù)雜。編寫 Spring MVC Web 應(yīng)用程序非常復(fù)雜。

“我們公司遷移到 Rust,花了大約 1 個(gè)月的時(shí)間才適應(yīng) Rust,無需處理 C 指針、內(nèi)存映射等低級內(nèi)容?!?/p>

部署 Rust Web 應(yīng)用程序比處理 Java 應(yīng)用程序服務(wù)器和 WAR 容易得多。為什么Java應(yīng)用服務(wù)器有這么多bug?

20 多年過去,它們?nèi)匀粺o法獲得諸如重新加載而不泄漏或數(shù)據(jù)庫連接池可靠而不掛起連接之類的東西。

“JDBC 的編寫方式使得池?zé)o法強(qiáng)制關(guān)閉卡住的連接;卡住的連接會(huì)隨著時(shí)間的推移而累積,直到服務(wù)器掛起?!?/p>

這表明Java J2EE應(yīng)用服務(wù)器的整個(gè)概念是錯(cuò)誤的。每個(gè)曾經(jīng)使用過websphere的人,web logic都會(huì)把他們折磨到“地獄”。即使是最小化的 Tomcat 也遠(yuǎn)未消除錯(cuò)誤。JVM 本身正在崩潰?!拔疫€沒有看到任何 Java 應(yīng)用程序后端或 GUI 不會(huì)因?yàn)閮?nèi)部 JVM 錯(cuò)誤而崩潰?!?/p>

Rust 需要的內(nèi)存比 Java 少 10 倍,速度比 Java 快 4 到 10 倍,編譯失敗很快就會(huì)得到修復(fù)。不需要應(yīng)用程序服務(wù)器和巴洛克式構(gòu)建工具(變形的工具)。Rust 就可以,無需開始用 Java 編寫新的應(yīng)用程序。

Rust 有相當(dāng)高級的庫,如 Rocket.rs (rust) 和微型 Web 框架,如 scalatra.org (scala),這兩種類型都非常容易上手。而且使用起來也要容易得多:所有內(nèi)容均已鍵入,并且類型信息也可用作文檔。

四、Rust在后端項(xiàng)目的軟肋

也有一種觀點(diǎn)認(rèn)為,Rust不適合大型項(xiàng)目。因?yàn)镽ust 項(xiàng)目是 AOT 編譯的二進(jìn)制文件,需要不斷維護(hù)才能使其不斷變化的包保持最新。此外,項(xiàng)目越大,linting 越慢,分析器越慢,構(gòu)建時(shí)間也越慢。

也就是說,Rust 的借用檢查器并不是大型項(xiàng)目中真正令人頭疼的問題。然而,你需要學(xué)習(xí)如何移動(dòng)、復(fù)制或借用內(nèi)存的各種方法以及不自然的生命周期語法需要很長時(shí)間才能深入理解這些背后的真相。

責(zé)任編輯:武曉燕 來源: 51CTO技術(shù)棧
相關(guān)推薦

2023-02-07 19:46:35

NIOCQ內(nèi)核

2023-08-29 18:49:41

2020-06-04 17:13:12

JavaScript語言Web

2021-10-09 20:13:03

ArrayListLinkedList java

2023-07-04 20:09:12

2020-07-30 13:22:19

語言Android大數(shù)據(jù)

2022-11-30 09:33:56

語言Java系統(tǒng)

2024-05-15 17:34:15

2024-02-07 12:39:00

AI數(shù)據(jù)

2024-02-26 07:26:27

RustC++開發(fā)

2022-12-16 15:20:19

RustC 語言

2024-02-29 09:43:44

2020-01-09 11:07:48

AI 數(shù)據(jù)機(jī)器學(xué)習(xí)

2023-06-25 14:58:08

C++語言Rust

2024-07-26 00:22:34

2025-01-08 09:30:00

Meta大模型訓(xùn)練

2017-08-03 08:34:54

gRPCCRust

2024-11-07 15:40:00

2022-10-21 18:41:23

RustC++Azure

2019-11-22 10:06:24

PythonGolangJava
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號