一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用Rust重寫了自己的項(xiàng)目

jf_wN0SrCdH ? 來源:Rust語言中文社區(qū) ? 2023-02-02 16:45 ? 次閱讀

前言

Rust 已經(jīng)悄然成為了最受歡迎的編程語言之一。作為一門新興底層系統(tǒng)語言,Rust 擁有著內(nèi)存安全性機(jī)制、接近于 C/C++ 語言的性能優(yōu)勢(shì)、出色的開發(fā)者社區(qū)和體驗(yàn)出色的文檔、工具鏈和IDE 等諸多特點(diǎn)。本文將介紹筆者使用 Rust 重寫項(xiàng)目并逐步落地生產(chǎn)環(huán)境的過程,以及在重寫過程選擇 Rust 的原因、遇到的問題以及使用 Rust 重寫帶來的成果。

我們目前正在使用 Rust 開發(fā)的項(xiàng)目叫做 KCL,目前全部實(shí)現(xiàn)代碼已經(jīng)在 Github 上開源。KCL 是一個(gè)基于約束的記錄及函數(shù)領(lǐng)域編程語言,致力于通過成熟的編程語言技術(shù)和實(shí)踐來改進(jìn)特領(lǐng)域如云原生 Kubernetes 領(lǐng)域的大量繁雜配置編寫和安全策略校驗(yàn)等,致力于構(gòu)建圍繞配置的更好的模塊化、擴(kuò)展性和穩(wěn)定性,更簡(jiǎn)單的邏輯編寫,以及更快的自動(dòng)化集成和良好的生態(tài)延展性。更具體的 KCL 使用場(chǎng)景請(qǐng)?jiān)L問 KCL 網(wǎng)站,本文中不再過多贅述。

KCL 之前是使用 Python 編寫的,出于用戶使用體驗(yàn)、性能和穩(wěn)定性的考慮,決定用 Rust 語言進(jìn)行重寫,并獲得了以下好處:

1.更少的 Bug,源于 Rust 強(qiáng)大的編譯檢查和錯(cuò)誤處理方式

2. 語言端到端編譯執(zhí)行性能提升了66%

3. 語言前端解析器性能提升了20 倍

4. 語言中端語義分析器性能提升了40 倍

5. 語言編譯器編譯過程平均內(nèi)存使用量變?yōu)樵瓉?Python 版本的一半

我們遇到了什么問題

就像社區(qū)中同類型項(xiàng)目 deno, swc, turbopack, rustc 等編譯器、構(gòu)建系統(tǒng)或者運(yùn)行時(shí)在技術(shù)上使用 Rust 做的事情類似,我們使用 Rust 完整構(gòu)建了編譯器的前中端和運(yùn)行時(shí),取得了一定的階段性成果,但是我們大約在一年前并不是這個(gè)樣子的。

一年前,我們使用 Python 語言構(gòu)建了整個(gè) KCL 語言編譯器的實(shí)現(xiàn),雖然在一開始的時(shí)候運(yùn)行良好,Python 簡(jiǎn)單易上手,生態(tài)豐富,團(tuán)隊(duì)的研發(fā)效率也很高,但是隨著代碼庫的擴(kuò)張和工程師人數(shù)的增加,代碼維護(hù)起來愈加困難。

盡管我們?cè)陧?xiàng)目中強(qiáng)制編寫 Python 類型注解,采用更嚴(yán)格的 lint 工具,代碼測(cè)試行覆蓋率也達(dá)到了 90% 以上,但是仍然會(huì)出現(xiàn)很多諸如 Python None 空對(duì)象,屬性未找到等運(yùn)行時(shí)才會(huì)出現(xiàn)錯(cuò)誤,并且重構(gòu) Python 代碼時(shí)也需要小心翼翼,反應(yīng)到 KCL 語言上就是一個(gè)接一個(gè)的 bug, 嚴(yán)重影響用戶使用體驗(yàn)。

此外,當(dāng) KCL 使用對(duì)象是廣大開發(fā)者用戶時(shí),編程語言或者說編譯器內(nèi)部實(shí)現(xiàn)出現(xiàn)任何錯(cuò)誤都是不可容忍的,這些也給我們的用戶使用體驗(yàn)帶來了一系列問題,使用 Python 編寫的程序啟動(dòng)速度較慢,性能無法滿足自動(dòng)化系統(tǒng)在線編譯和執(zhí)行的效率訴求,因?yàn)樵谖覀兊膱?chǎng)景中,用戶修改 KCL 代碼后需要能很快的展示編譯結(jié)果,顯然使用 Python 編寫的編譯器并不能很好地滿足使用需求。

為什么選擇 Rust

筆者所在團(tuán)隊(duì)基于如下原因選擇了 Rust

1. 使用 Go, Python, Rust 三種語言實(shí)現(xiàn)了簡(jiǎn)單的編程語言棧式虛擬機(jī)并作了性能對(duì)比,Go 和 Rust 在這個(gè)場(chǎng)景下性能接近,Python 有較大性能差距,綜合考慮下采用了 Rust,具體三種語言實(shí)現(xiàn)的棧式虛擬機(jī)代碼細(xì)節(jié)在https://github.com/Peefy/StackMachine,感興趣的同學(xué)可以前往瀏覽

2. 越來越多的編程語言的編譯器或運(yùn)行時(shí)特別是前端基礎(chǔ)設(shè)施項(xiàng)目采用 Rust 編寫或重構(gòu),此外基礎(chǔ)設(shè)施層,數(shù)據(jù)庫、搜索引擎、網(wǎng)絡(luò)設(shè)施、云原生、UI 層和嵌入式等領(lǐng)域都有 Rust 的出現(xiàn),至少在編程語言領(lǐng)域?qū)崿F(xiàn)方面經(jīng)過了可行性和穩(wěn)定性驗(yàn)證

3. 考慮到后續(xù)的項(xiàng)目發(fā)展會(huì)涉及區(qū)塊鏈智能合約方向,而社區(qū)中大量的區(qū)塊鏈和智能合約項(xiàng)目采用 Rust 編寫

4. 通過 Rust 獲得更好的性能和穩(wěn)定性,讓系統(tǒng)更容易維護(hù)、更加健壯的同時(shí),可以通過 FFI 暴露 C API 供多語言使用和擴(kuò)展,方便生態(tài)擴(kuò)展與集成

5. Rust 對(duì) WASM 的支持比較友好,社區(qū)中大量 WASM 生態(tài)是由 Rust 構(gòu)建,KCL 語言和編譯器可以借助 Rust 編譯到 WASM 并在瀏覽器中運(yùn)行

基于以上原因綜合考慮選擇了 Rust 而不是 Go 等其他語言,整個(gè)重寫過程下來發(fā)現(xiàn) Rust 綜合素質(zhì)確實(shí)過硬(第一梯隊(duì)的性能,足夠的抽象程度),雖然在一些語言特性特別是生命周期等上手成本有一些,生態(tài)上還不夠豐富。

總之編程語言可以做的事情,Rust 均可以做,具體可能還是要根據(jù)具體的場(chǎng)景和問題來做選擇。同時(shí)如果想要使用好 Rust, 還需要深入理解內(nèi)存、堆棧、引用、變量作用域等這些其它高級(jí)語言往往不會(huì)深入接觸的內(nèi)容。

使用 Rust 過程中遇到了哪些困難

雖然決定了使用 Rust 重寫整個(gè) KCL 項(xiàng)目,其實(shí)團(tuán)隊(duì)成員大部分成員是沒有使用 Rust 編寫一定代碼體量項(xiàng)目的經(jīng)驗(yàn),包括筆者個(gè)人自己也僅僅學(xué)習(xí)過《The Rust Programming Language》中的部分內(nèi)容,依稀記得學(xué)習(xí)到Rc和RefCell等智能指針內(nèi)容就放棄了,那時(shí)沒想到 Rust 中還能有與 C++ 中類似的東西。

使用 Rust 前預(yù)估的風(fēng)險(xiǎn)主要是 Rust 語言接觸和學(xué)習(xí)的成本,這個(gè)確實(shí)在各種 Rust 的文章博客中均有提到,因?yàn)?KCL 項(xiàng)目整體架構(gòu)并未發(fā)生太大變化,只是部分模塊設(shè)計(jì)和代碼編寫針對(duì) Rust 作了優(yōu)化,因此整個(gè)重寫是在邊學(xué)邊實(shí)踐中進(jìn)行。確實(shí)在剛開始使用 Rust 編寫整個(gè)項(xiàng)目的時(shí)候花費(fèi)在知識(shí)查詢、編譯排錯(cuò)的時(shí)間還是很多的,不過隨著項(xiàng)目的進(jìn)行漸入佳境,筆者個(gè)人經(jīng)驗(yàn)使用 Rust 遇到的困難主要是心智轉(zhuǎn)換和開發(fā)效率兩方面:

心智轉(zhuǎn)換

首先 Rust 的語法語義很好地吸收和融合了函數(shù)式編程中類型系統(tǒng)相關(guān)的概念,比如抽象代數(shù)類型 ADT 等,并且 Rust 中并無“繼承”等相關(guān)概念,如果不能很好地理解甚至連其他語言中稀松平常的結(jié)構(gòu)定義在 Rust 中可能都需要花費(fèi)不少時(shí)間,比如如下的 Python 代碼可能在 Rust 中的定義是這個(gè)樣子的

Python

5584b528-a28e-11ed-bfe3-dac502259ad0.png

Rust

5594d700-a28e-11ed-bfe3-dac502259ad0.png

當(dāng)然更多的時(shí)間是在與 Rust 編譯器本身的報(bào)錯(cuò)作斗爭(zhēng),Rust 編譯器會(huì)經(jīng)常使開發(fā)人員"碰壁",比如借用檢查報(bào)錯(cuò)等,特別是對(duì)于編譯器來講,它處理的核心結(jié)構(gòu)是抽象語法樹 AST,這是一個(gè)遞歸和嵌套的樹結(jié)構(gòu),在 Rust 中有時(shí)很難兼顧變量可變性與借用檢查的關(guān)系,就如 KCL 編譯器作用域Scope的結(jié)構(gòu)定義結(jié)構(gòu)那樣,對(duì)于存在循環(huán)引用的場(chǎng)景,用于需要顯示意識(shí)到數(shù)據(jù)的相互依賴關(guān)系,而大量使用Rc,RefCell和Weak等 Rust 中常用的智能指針結(jié)構(gòu)

55a72536-a28e-11ed-bfe3-dac502259ad0.png

開發(fā)效率

Rust 的開發(fā)效率可以用先抑后揚(yáng)來形容。在剛開始上手寫項(xiàng)目時(shí),如果團(tuán)隊(duì)成員沒有接觸過函數(shù)式編程相關(guān)概念以及相關(guān)的編程習(xí)慣,開發(fā)速度將顯著慢于 Python、Go 和 Java 等語言,不過一旦開始熟悉 Rust 標(biāo)準(zhǔn)庫常用的方法、最佳實(shí)踐以及常見 Rust 編譯器報(bào)錯(cuò)修改,開發(fā)效率將大幅提升,并且原生就能寫出高質(zhì)量、安全、高效的代碼。

比如筆者個(gè)人當(dāng)初遇到一個(gè)如下代碼所示的與生命周期錯(cuò)誤前前后后排查了很久的時(shí)間才發(fā)現(xiàn)原來是忘記標(biāo)注生命參數(shù)導(dǎo)致生命周期不匹配。此外 Rust 的生命周期與類型系統(tǒng)、作用域、所有權(quán)、借用檢查等概念耦合在一起,導(dǎo)致了較高的理解成本和復(fù)雜度,且報(bào)錯(cuò)信息往往不像類型錯(cuò)誤那么明顯,生命周期不匹配錯(cuò)誤報(bào)錯(cuò)信息有時(shí)也略顯呆板,可能會(huì)導(dǎo)致較高的排錯(cuò)成本,當(dāng)然熟悉相關(guān)概念寫多了之后效率會(huì)提高不少。

55cf9106-a28e-11ed-bfe3-dac502259ad0.png

使用 Rust 重寫收益比

經(jīng)過團(tuán)隊(duì)幾個(gè)人花費(fèi)幾個(gè)月時(shí)間使用 Rust 完全重寫并穩(wěn)定落地生產(chǎn)環(huán)境幾個(gè)月后,回顧整個(gè)過程感覺這件事情的收獲非常大。

從技術(shù)角度層面來看,重寫的過程不僅僅鍛煉了快速學(xué)習(xí)一門新的編程語言、編程知識(shí)并將其付諸實(shí)踐,并且整個(gè)重寫過程讓我們又反思了 KCL 編譯器中設(shè)計(jì)不合理的部分并進(jìn)行修改,對(duì)一個(gè)編程語言而言,這是一個(gè)長(zhǎng)周期的項(xiàng)目,我們收獲的是編譯器系統(tǒng)更加穩(wěn)定、安全,且代碼清晰,bug 更少、性能更好的技術(shù)產(chǎn)品服務(wù)于用戶,雖然沒有全部模塊得到高達(dá) 40 倍的性能,因?yàn)椴糠帜K如 KCL 運(yùn)行時(shí)的性能瓶頸在于內(nèi)存深拷貝操作,但筆者個(gè)人認(rèn)為仍然是值得的。且當(dāng) Rust 使用時(shí)間到達(dá)一定時(shí)長(zhǎng)后,心智和開發(fā)效率不再是限制因素,就像學(xué)車那樣,拿到駕照后更多是上路實(shí)踐和總結(jié)。

結(jié)語

筆者個(gè)人覺得使用 Rust 重寫項(xiàng)目后最重要的是不是我學(xué)會(huì)了一門新的編程語言,也不是 Rust 很流行很火因此我們?cè)陧?xiàng)目中采用一下,或者使用 Rust 編寫了多少炫技的代碼,是真真正正地使得語言和編譯器本身更加穩(wěn)定,能夠在生產(chǎn)環(huán)境平穩(wěn)落地并長(zhǎng)期使用,啟動(dòng)速度和自動(dòng)化效率不再受困擾,性能優(yōu)于社區(qū)其他同類型領(lǐng)域編程語言,使我們語言和工具的用戶感受到體驗(yàn)提升,這些都得益于 Rust 的無 GC、高性能、更好的錯(cuò)誤處理內(nèi)存管理、零抽象等特性。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1952

    瀏覽量

    35771
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1652

    瀏覽量

    49741
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    233

    瀏覽量

    6889

原文標(biāo)題:性能提升 40 倍!我們用 Rust 重寫了自己的項(xiàng)目

文章出處:【微信號(hào):Rust語言中文社區(qū),微信公眾號(hào):Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    只會(huì)用Python?教你在樹莓派上開始使用Rust

    結(jié)合起來,并在Raspberry Pi上安裝Rust。設(shè)置Raspberry Pi對(duì)于此項(xiàng)目,您將需要:Raspberry PiLED。220-1k歐姆電阻。面包板和接線。使用GPIO 18連接到LED
    發(fā)表于 05-20 08:00

    使用rust開發(fā)stm32系列教程

    本文為使用 rust 開發(fā) stm32 系列教程前言。Why RustRust 特性就不用多介紹了,有個(gè)編譯器管著有時(shí)候比C到處浪把自己整沒了好。ST官方逐漸停止對(duì)C固件庫的更新,使用MX感覺沒
    發(fā)表于 08-20 07:18

    如何在STM32 (Cortex M3)和GD32(RISC-V)上Rust開發(fā)

    RUST HAL 實(shí)現(xiàn)剛好是華科本科生寫的,恰好我也是華科的研究生,太巧了 ;)所以 rust 開發(fā)嵌入式不需要重復(fù)實(shí)現(xiàn)相同的功能,使用開源的 crate 軟件包就可以了。比如我們先下載下來
    發(fā)表于 06-21 10:38

    微軟開發(fā)基于Rust的新編程語言,將很快開源

    此前,微軟表示正探索將Rust作為C和C++的安全替代方案,并且也對(duì)外展示了使用Rust重寫Windows組件的體驗(yàn),根據(jù)微軟的說法,Rust是一種從根本上考慮安全性的編程語言,他們將
    的頭像 發(fā)表于 12-03 10:36 ?4029次閱讀

    Rust語言開發(fā)微服務(wù)

    Dubbo Rust 近期發(fā)布了首個(gè)正式版本,Dubbo Rust 目標(biāo)是對(duì)齊 Dubbo 3 的所有核心功能設(shè)計(jì)
    的頭像 發(fā)表于 10-28 09:31 ?2870次閱讀

    Google在Chromium項(xiàng)目中支持使用Rust

    Rust 1.66.1 發(fā)布 Rust 1.66.1 修復(fù)了 Cargo 在使用 SSH 克隆依賴項(xiàng)或注冊(cè)表索引時(shí)不驗(yàn)證 SSH 主機(jī)密鑰的問題。此安全漏洞被跟蹤為?CVE-2022-46176[1
    的頭像 發(fā)表于 01-16 10:52 ?1922次閱讀

    Rust受歡迎程度肉眼可見

    都說實(shí)踐中見真知,比起悶著頭看文檔,不如從一些小工具上親自上手,看看 Rust 是如何應(yīng)用在不同領(lǐng)域的?;诖耍裉煳覀兘o大家梳理 5 個(gè) Rust 編寫的開源項(xiàng)目,雖不能面面俱到
    的頭像 發(fā)表于 01-29 11:21 ?1103次閱讀

    CloudflareRust重寫Nginx C模塊,構(gòu)建沒有Nginx的未來

    近日,Cloudflare 工程師介紹了如何使用 Rust 重寫基于 C 語言的 Nginx 模塊。Cloudflare 工程師在博客寫道,他們 Rust 為 Cloudflare
    的頭像 發(fā)表于 03-08 09:36 ?909次閱讀

    一個(gè)Rust開發(fā)的壓測(cè)工具rsb

    一個(gè) Rust 開發(fā)的壓測(cè)工具,項(xiàng)目地址:rsb,給個(gè) star 鼓勵(lì)下。
    的頭像 發(fā)表于 03-21 09:32 ?975次閱讀

    Rust重寫的LSP:KCL IDE 插件的功能介紹與設(shè)計(jì)解析

    在這次更新中,我們發(fā)布了全新的 KCL VS Code 插件,并且 Rust 重寫了 LSP 的 Server 端。我們提供了 IDE 中常用的代碼輔助功能,如高亮、跳轉(zhuǎn)、補(bǔ)全、Outline、懸停、錯(cuò)誤提示等。
    的頭像 發(fā)表于 05-11 09:39 ?1196次閱讀
    <b class='flag-5'>Rust</b><b class='flag-5'>重寫</b>的LSP:KCL IDE 插件的功能介紹與設(shè)計(jì)解析

    Windows 11初嘗Rust,36000行內(nèi)核代碼已重寫!

    更早些時(shí)候,微軟 Rust 重寫了 DirectWrite Core 庫的概念驗(yàn)證,它是 Windows 的 DWrite 引擎的 Windows App SDK 實(shí)現(xiàn),用于文本分析、布局和渲染
    的頭像 發(fā)表于 05-19 16:39 ?1167次閱讀
    Windows 11初嘗<b class='flag-5'>Rust</b>,36000行內(nèi)核代碼已<b class='flag-5'>重寫</b>!

    如何在Rust項(xiàng)目中使用InfluxDB 2.x

    了更好的性能和更好的用戶體驗(yàn)。Rust語言提供了InfluxDB 2.x的官方客戶端庫,可以方便地在Rust項(xiàng)目中使用InfluxDB 2.x。 本教程將介紹如何在Rust
    的頭像 發(fā)表于 09-19 16:33 ?872次閱讀

    Rust重寫基礎(chǔ)軟件的實(shí)踐代碼

    項(xiàng)目轉(zhuǎn)化過程中我遇到了一個(gè)與 CAS (Compare and Swap) [2] 操作實(shí)現(xiàn)相關(guān)的問題,在計(jì)算機(jī)科學(xué)中CAS 是多線程/協(xié)程中用于實(shí)現(xiàn)同步的原子指令。
    的頭像 發(fā)表于 01-19 10:05 ?687次閱讀

    一次Rust重寫基礎(chǔ)軟件的實(shí)踐

    受到2022年“谷歌使用Rust重寫Android系統(tǒng)且所有Rust代碼的內(nèi)存安全漏洞為零” [1] 的啟發(fā),最近筆者懷著濃厚的興趣也順應(yīng)Rust 的潮流,嘗試著將一款C語言開發(fā)的基礎(chǔ)
    的頭像 發(fā)表于 01-25 11:21 ?835次閱讀

    JavaScript與Rust和WebAssembly集成

    偶然一次機(jī)會(huì),接觸了Rust的代碼。當(dāng)時(shí)想給團(tuán)隊(duì)小伙伴做演示,發(fā)現(xiàn)自己并不能在移動(dòng)端按照文檔生成演示demo。我就想,要是Rust代碼能轉(zhuǎn)化成JavaScript就好了。結(jié)果一搜,還真有。
    的頭像 發(fā)表于 01-24 15:43 ?339次閱讀
    JavaScript與<b class='flag-5'>Rust</b>和WebAssembly集成