Rust 1.38加入工作管线编译功能,可加速部分Crate编译工作

Rust团队发布最新的Rust 1.38,支持工作管线编译(Pipelined Compilation),提升了平行化处理的能力,也为宏扩展了#“deprecated”属性,并且会为错误使用mem::{uninitialized, zeroed}语法的用例发出警告。

由于在编译Crate的时候,编译器不需要完整的相依项目就可以进行构建,其需要的信息仅是类型、相依项目以及输出等元数据,而这些元数据都在编译过程的初期产生,因此从Rust 1.38版本开始,Cargo将在元数据准备就绪之后,自动开始构建Crate。

开发者不需要变动任何程序代码,就能够使用这项新功能,官方提到,这项更改对于单个Crate的构建没有任何影响,但是测试实验显示,部分Crate图(Graph)的构建,可以提高10到20%的编译速度,对于其他编译工作则改进幅度不大,速度提升的程度取决于执行构建所使用的硬件。

Rust团队在Rust 1.36版本发布时提到,由于根本的原因,开发者不可能安全地使用std::mem::uninitialized语法,因此开发者应该以MaybeUninit代替,且避免使用std::mem::uninitialized,不过现在Rust终究尚未弃用mem::uninitialized,因此rustc现在会为mem :: uninitialized或mem :: zeroed初始化错误提供Linting功能。

部分类型当包含全零进制模式的行为未被定义时,由于这些类型所代表的类指标对象不可为null,因此当使用mem::uninitialized和mem::zeroed初始化这些类型时,便会出现错误,而新的Lint现在会发出警告。不过,由于Rust中仍有许多不为零的类型,因此开发者还是可以使用mem::uninitialized和mem::zeroe,来初始化这些结构。Rust团队提到,这些检查并不会针对所有使用mem::uninitialized和mem::zeroed的情况,只会识别确定会出现错误的程序代码。

Rust在1.9版本的时候,加入了#“deprecated”属性,让Crate作者可以知会用户,Crate中即将要弃用的项目,而在Rust 1.38中扩展了这个属性,现在开发者可以使用std::any::type_name新函数,以获取类型的名字,像是在执行期间,审查实例化类型参数的具体类型。

官方表示,这是一个调试用的标准函数库函数,不能保证字符串的明确内容和格式,回传的值只是该类型的最佳描述,多个类型可能共享相同的type_name值,而这个值在未来编译器版本可能会变更。