今日头版
《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”模块包含了数据的表示,更新增长了原始类型数组的支持,如今它能从一个迭代器里被加载和转换。实现内部如今使用动态长度的数组,来统一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
本文分享自微信公众号 - Rust语言中文社区(rust-china)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。前端