今日头版
《Rust日报》第1000期,感谢有你
两年半的时间,我们一期期走来,到了今天发行的第1000期。回想我第一次看《Rust日报》,还是在Rust 2018刚推出的时候。丰富的新闻和思考让我眼前一亮,我慢慢开始喜欢这样的报纸。每天浏览日报,已经成为许多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
本文分享自微信公众号 - Rust语言中文社区(rust-china)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4581704/blog/4703132