【Rust日报】2020-11-03 《Rust日报》总第1000期

2024-06-22 23:58
文章标签 rust 2020 03 日报 1000 总第

本文主要是介绍【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”模块包含了数据的表示,更新增加了原始类型数组的支持,现在它能从一个迭代器里被加载和转换。实现内部现在使用动态长度的数组,来统一32、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.html


来自 日报小组 洛佳

社区学习交流平台订阅:

  • Rustcc论坛: 支持rss

  • 微信公众号:Rust语言中文社区

这篇关于【Rust日报】2020-11-03 《Rust日报》总第1000期的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085776

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

第二十四章 rust中的运算符重载

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust中的运算符重载 目录 注意一、前言二、基本使用三、常用运算符四、通用约束 一、前言 C/C++中有运算符重载这一概念,它的目的是让即使含不相干的内容也能通过我们自定义的方法进行运算符操作运算。 比如字符串本身是不能相加的,但由于C++中的String重载了运算符+,所以我们就可以将两个字符串进行相加、但实际

Vue day-03

目录 Vue常用特性 一.响应更新 1. 1 v-for更新监测 1.2 v-for就地更新 1.3 什么是虚拟DOM 1.4 diff算法更新虚拟DOM 总结:key值的作用和注意点: 二.过滤器 2.1 vue过滤器-定义使用 2.2 vue过滤器-传参和多过滤器 三. 计算属性(computed) 3.1 计算属性-定义使用 3.2 计算属性-缓存 3.3 计算属

【Rust光年纪】Rust 机器人学库全景:功能、安装与API概览

机器人学+Rust语言=无限可能:六款库带你开启创新之旅! 前言 随着机器人技术的快速发展,对于机器人学领域的高效、可靠的编程语言和库的需求也日益增加。本文将探讨一些用于 Rust 语言的机器人学库,以及它们的核心功能、使用场景、安装配置和 API 概览,旨在为机器人学爱好者和开发人员提供参考和指导。 欢迎订阅专栏:Rust光年纪 文章目录 机器人学+Rust语言=无限可能:

【SpringMVC学习03】-SpringMVC的配置文件详解

在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。其实真正需要程序员开发的就两大块:一个是Handler,一个是jsp。 在springMVC的入门程序中,SpringMVC的核心配置文件——springmvc.xml为: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http:

第二十二章 rust数据库使用:sea-orm详解

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust数据库使用:sea-orm详解 目录 注意一、前言二、项目管理三、迁移文件四、实体文件五、业务使用 一、前言 只要开发稍微大型一点的项目,数据库都是离不开的。 rust目前并没有特别成熟的数据库框架,sea-orm这个框架是我目前所看到的成熟度最高的一个,并且仍在积极开发中。 所以本文将以sea-orm框