【Rust日報】2020-11-03 《Rust日報》總第1000期

今日頭版

《Rust日報》第1000期,感謝有你

兩年半的時間,咱們一期期走來,到了今天發行的第1000期。回想我第一次看《Rust日報》,仍是在Rust 2018剛推出的時候。豐富的新聞和思考讓我眼前一亮,我慢慢開始喜歡這樣的報紙。天天瀏覽日報,已經成爲許多Rust愛好者的生活習慣。
Rust日報社很高興能和讀者們共同進步,也很樂於見到更多的企業、研究團隊開始關注這門編程技術。但願在將來的時間裏,咱們能更好地推廣Rust語言,傳遞更多的社區開發知識,第一時間傳播各地Rust開發者的動態和新聞。
加油,Rust愛好者們!

生態圈

內存數據交換格式Apache Arrow發佈了v2.0.0版本

Apache Arrow項目定義了基於內存的數據格式,致力於解決系統與系統間的數據傳輸問題。目前此項目已經發布了重大的更新v2.0.0版本,其中包含的Rust子項目尤其重要。Apache Arrow PMC認爲,Rust實現正在縮短與C/C++實現的功能差距,慢慢遇上功能最多的Java、C/C++版本。
本次更新的重點包含不少個模塊。核心的「Arrow」模塊包含了數據的表示,更新增長了原始類型數組的支持,如今它能從一個迭代器裏被加載和轉換。實現內部如今使用動態長度的數組,來統一3二、64位平臺間的差別。Arrow的運算內核也有了較大的改進,添加了大量針對字符串、整數的函數。運算內核如今能使用SIMD,將性能提高到五倍以上。針對不含空變量的數組,一些計算內核也有了優化,明顯地提升了速度。另外,更多的計算內核被優化,來下降內存複製的次數。其它的優化包括增長了Array trait的應用程序接口,方便確認數組已經分配的內存大小。
針對列式存儲格式Parquet的寫入器也正在製做中。這個寫入器包含重要的提高,好比支持嵌套的Arrow類型,和針對空值寫入的優化等等。另外,更新也面對Arrow之上編寫的DataFusion模塊,它是一個查詢器引擎,支持DataFrame和SQL兩種接口。它如今支持更多的DataFrame接口,它的實現也綜合利用了async/await語言特性,相比直接使用線程,它能優化多線程表現。
Arrow IPC是進程間交互和序列化的格式。Apache基金會在網站上描述了這個格式,指望包括在流中和文件中,交換Arrow數據的應用程序都使用這個格式。從前的1.0.0版本已經更新到了Arrow IPC的第五版,也有對第四版的兼容性設計。在全新的2.0.0版本,Arrow使用Rust語言實現這個數據格式,正在支持最新的第五版標準。
Arrow項目指望在下一個版本前,支持穩定的Rust發行版,支持更多的運行平臺,提升和其它語言的兼容性。它是一個開源項目,歡迎全部的開源軟件開發者提供支持和幫助。
Apache Arrow項目主頁: https://arrow.apache.org/blog/2020/10/27/rust-2.0.0-release/

IntelliJ Rust發佈第一百三十四期更新公告

知名集成開發環境公司Jetbrains更新了IntelliJ Rust開發插件。如今,IDEA企業版和RubyMine軟件都已能在Windows平臺上開發,雖然目前只支持MSVC工具鏈,而且須要安裝特殊的插件。另外,加載項目的每一個步驟,都在軟件的「同步」欄界面有必定的顯示,能更方便地查找項目加載中可能的錯誤。
一些小的功能更新包括,針對Rustc編譯器、Clippy靜態檢查軟件的代碼補全已經被支持。在Cargo.toml配置文件中,能夠經過「跳轉到定義」功能,查找當前包特性的定義來源。使用F6按鍵的重構代碼不只支持跨文件、目錄的移動,還能移動到另外一個包。內置的Rust REPL工具提供了新的「:clear」命令,能夠清空界面變量的類型信息。
本次更新還包括更多的修復,包括非零類型在調試中的顯示、移動語義項時較好地處理換行,以及幫助新的開發者設置工具鏈等等。IntelliJ Rust在項目主頁中,詳細地說明了本次更新的全部修改和有關信息。
IntelliJ Rust項目主頁: https://intellij-rust.github.io/2020/11/02/changelog-134.html

Rust-analyzer發佈第四十九期更新公告

普遍應用的rust-analyzer代碼分析軟件發佈了本次更新公告。如今,VSCode插件的內聯提示將使用更小的字體,來提升類型提示等的可讀性。遇到JSON-RPC的錯誤,如今將會產生可控的錯誤提示,而非直接中止運行。
本期更新包括必定量的修復和內部提高。語法高亮模塊已作少許更改,來修復一種較爲不常見的尖括號高亮錯誤問題。語句開頭的負號也獲得了高亮提示。針對特定模塊的可見性描述符,它的表示模塊作了必定修復,包括一些針對內聯提示的語法高亮提示。在包根部的全局標籤如今能被正常識別。如今,結構體的文檔測試也已經被支持。
此次更新內部的優化包括更新依賴庫LSP的版本,和更新Rust trait解析器chalk的版本號。
Rust-analyzer項目主頁: https://rust-analyzer.github.io/thisweek/2020/11/02/changelog-49.html

async-smux:異步TCP鏈接流複用軟件

做者@BlackBinary編寫了這個項目。async-smux實現了smux網絡協議,容許咱們複用同一條TCP鏈接,以構建在其上的多個TCP套接字。項目合理運用Rust語言的async/await語法,相比現有的Go語言實現,吞吐量提高到兩到三倍,握手速度也達到一至兩倍。項目接口包裝友好、易於使用,已經發布到crates.io網站,而且使用MIT協議開源。
async-smux項目主頁: https://github.com/black-binary/async-smux

Figment:半分層多源配置庫

Rocket框架的做者塞爾吉奧·貝尼特斯編寫了Figment項目。Figment是能從多個配置源中,提取配置信息並整合的庫,好比從多個不一樣類型的配置文件。項目以Apache-2.0/MIT雙協議在GitHub上開源。
Figment項目主頁: https://github.com/SergioBenitez/Figment

咱們能用Rust了嗎?

開發者烏格拉罕·阿闊克發佈了這個彙總項目。Rust語言在生態上的指望涉及到方方面面,包括網頁、機器學習和遊戲應用,也包括基礎的圖形和異步編程等等。項目給出了一系列的彙總,標記出Rust在這些領域的進度和發展情況,以供開發人員和貢獻者參考。
項目主頁: https://github.com/UgurcanAkkok/AreWeRustYet

思想碰撞

非泛型內部函數

Rust語言的泛型是在編譯時單型化的。也就是說,編譯器會複製須要泛型的源代碼,填入具體的類型,而後再生成目標代碼。這樣生成的泛型代碼運行速度較快,但犧牲了目標代碼的體積。這是由於,若是咱們的泛型可能性很是多,每一個具體的類型,都須要完整地複製原有的泛型代碼。最終生成的二進制文件中,每一個類型都對應一部分如出一轍的代碼。
Possible Rust網站給出了一種解決方案,嘗試解決這種問題。方案認爲,能夠把函數的非泛型部分置入函數內部,分爲母函數和子函數。母函數具備泛型參數,它將簡單轉換泛型參數爲非泛型的,而後傳給非泛型參數的子函數裏。這樣對全部的類型,只須要生成一個共同的子函數,而後生成多個簡單的轉換函數便可。經過這種方式,咱們完成了同時節省時間和空間的目標。
在具體的技術實現上,能夠把子母函數並列位於模塊中。但隨着函數數量的增長,咱們不得不當心命名私有的子函數,防止模塊內的函數衝突。因而咱們的考慮是,把子函數的定義放在母函數內部,這樣就能夠避免命名空間衝突了。這就構成了咱們最終的「非泛型內部函數」的寫法。
文章還從中層中間語言(MIR)的角度,分析了不一樣寫法下Rust編譯器前端輸出代碼的差異。文章認爲,目前這種「提取公因式」的優化還須要手工完成,但隨着時間的推移,將來的Rust編譯器能夠本身完成優化步驟,不須要開發者額外關心——這將會是很是好的結果。
Possible Rust網站: https://www.possiblerust.com/pattern/non-generic-inner-functions

用Rust重寫EBU R.128聲音響度算法庫

EBU R.128是歐洲廣播聯盟發起的標準,定義了符合人類感知的響度標準和算法。爲了計算統一的響度值,C語言的libebur128是經常使用的庫。本次文章中,做者塞巴斯蒂安·德羅格將這個庫移植到Rust語言,來爲他的項目減小外部連接依賴的數目。做者的庫參照了nnnoiseless的編寫思路,使用了smallvec和bitflags兩款小依賴。
編寫這個庫,做者首先編寫C庫的Rust應用接口。而後替換其中較小的函數到Rust語言,並導出到C語言的二進制接口。替換二進制接口到Rust語言,最終更換全部的函數到Rust語言。在這以後,整個庫已經遷移完畢,能夠選擇保留或取消C語言的接口。
做者選用了bindgen工具,用於生成C庫的Rust接口代碼。這裏,做者使用Rust語言裏的結構體,慢慢替換C語言定義的類型。C語言的少許for語句,能夠修改爲Rust語言的迭代器語法。然後,做者使用Box類型的語法,編寫導出到C語言的接口。爲了測試編寫的代碼,做者須要比較輸出的浮點數值,使用了quickcheck這款庫。在C語言使用宏的部分,做者一部分使用了trait,來適配不一樣類型的同種函數。爲了記錄響度算法要求的歷史記錄,Rust語言帶參數的枚舉類型幫助了做者,運行時的「懶加載」做者使用了Rust標準庫提供的Once類型,使用標準庫提供的VecDeque結構體。最終,做者替換了應用程序接口,完成了重寫過程。
做者作了簡單的性能測試,最終對相同的樣例,Rust語言的實現只用了原C語言實現50%~70%的時間,顯著地提高了處理效率。
響度算法對廣播電視、流媒體行業有必定的應用。人類傾向於聽到響度更高的聲音,因而節目製做人不惜犧牲動態範圍,提升響度,以獲取更多觀衆的注意。上世紀50年代開始,這場「響度大戰」開始了,廣告商、電視臺不斷拉高響度,觀衆只能調整音量來應對——長此以往,這樣的軍備競賽開始影響觀衆的聽覺和觀感。最終,ITU-R BS.1770標準問世,各大國家、地區制定相應的音頻技術規範,「響度大戰」才最終結束。我國中央電視臺的目標響度值爲-24 LKFS±2LU。
博客連接: https://coaxion.net/blog/2020/09/porting-ebu-r128-audio-loudness-analysis-from-c-to-rust-porting-details/

《蜜月後的Rust語言》

做者德雷克·摩爾分享了它兩年來的Rust開發經歷。做者主要關注Rust在嵌入式處理器的運用,從開發到調試,包括宏、格式化到內聯彙編,分享了不少Rust語言改進爲開發帶來的便利之處。Rust提供有別於傳統C語言的思路,是豐富而功能強大的語言。做者認爲,提高與Rust的關係將是他事業中最重要的部分。
博客連接: http://dtrace.org/blogs/bmc/2020/10/11/rust-after-the-honeymoon/

廣而告之

Rust庫團隊發起「可移植SIMD」小組

SIMD是「單指令多數據流」運算技術的外文名稱。這項技術經過引入較長的向量寄存器和指令,容許處理器使用單個指令同時處理多個數據。要達到這一點,每一個處理器平臺都給出了各不相同的指令集。Rust庫團隊發起這個小組,指望提出統一的 std::simd 包,在相同的程序接口下,涵蓋儘量多的處理器平臺。
「可移植SIMD」並非徹底涵蓋的,它將是一個最佳實踐的標準,指望做爲自動向量化優化的補充,容許在更多場合下使用這一統一的加速技術。另外,若是用戶的平臺不支持SIMD指令集,它將默認轉換爲普通的標量運算指令。
如今,「可移植SIMD」組織正在招收新的志願者,幫助完成這一標準的開發和完善過程。這一組織的官方頁面給出了目前的RFC草稿,和他們在Zulip協做軟件上的聯繫方式。

Rust語言官方博客: https://blog.rust-lang.org/inside-rust/2020/09/29/Portable-SIMD-PG.htmlhtml


來自 日報小組 洛佳
社區學習交流平臺訂閱:
  • Rustcc論壇: 支持rss
  • 微信公衆號:Rust語言中文社區

本文分享自微信公衆號 - Rust語言中文社區(rust-china)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。前端

相關文章
相關標籤/搜索