Rust 1.37.0版本:配置文件引导的优化,未命名的常量和货物供应商

敬请关注的Rust编程语言新版本的出版物翻译。


引言


Rust开发团队很高兴地宣布发布新版本1.37.0。 Rust是一种编程语言,它使每个人都可以创建可靠而高效的软件。


如果您使用rustup安装了旧版本的Rust,那么要升级到1.37.0版,您只需要运行以下命令:


$ rustup update stable 

如果尚未安装rustup ,则可以从我们网站的相应页面进行安装 ,以及在GitHub上查看详细的发行说明


稳定版包含哪些内容?


Rust 1.37.0的主要创新包括通过类型别名,内置cargo vendor ,未命名常量,配置文件引导的优化,货物项目的default-run键和#[repr(align(N))] 。 有关更多信息,请参见详细的发行说明


通过类型别名链接到enum选项


从Rust 1.37.0开始,通过类型别名可以引用enum选项:


 type ByteOption = Option<u8>; fn increment_or_zero(x: ByteOption) -> u8 { match x { ByteOption::Some(y) => y + 1, ByteOption::None => 0, } } 

impl块中, Self充当类型的别名,因此在Rust 1.37.0中,可以使用Self::Variant语法引用枚举选项:


 impl Coin { fn value_in_cents(&self) -> u8 { match self { Self::Penny => 1, Self::Nickel => 5, Self::Dime => 10, Self::Quarter => 25, } } } 

更具体地说,现在Rust允许您通过“相对类型的分辨率” <MyType<..>>::Variant引用枚举选项。 稳定性报告中提供了更详细的说明。


供应商依赖性的本地货运支持


作为独立包装存在数年之后, cargo vendor团队现已整合到Cargo中。 此命令将项目的所有依赖关系提取到vendor/目录中,并显示在组装期间使用供应商代码所需的配置片段。


cargo vendor已经在实际项目中使用: rustc编译器使用它来发送其所有依赖项以发布tarball,而具有单一存储库的项目使用它来修复版本控制中的依赖项代码。


在宏中使用未命名的常量


现在,您可以通过用下划线( _ )替换其标识符来创建 (unnamed) (const )。 例如,在rustc编译器中rustc我们找到了以下代码:


 ///   ,    ///  ,   -  . #[macro_export] macro_rules! static_assert_size { ($ty:ty, $size:expr) => { const _: [(); $size] = [(); ::std::mem::size_of::<$ty>()]; // ^    . } } static_assert_size!(Option<Box<String>>, 8); // 1. static_assert_size!(usize, 8); // 2. 

注意第二个static_assert_size!(..) :由于使用了未命名的常量,因此在声明新元素时可以防止名称冲突。 之前,您需要编写static_assert_size!(MY_DUMMY_IDENTIFIER, usize, 8); 。 通过引入未命名的常量,可以更轻松地创建符合人体工程学的可重复使用的声明性和过程宏,以进行静态分析。


配置文件引导的优化


现在, rustc编译器中提供了Profile-Guided Optimization(PGO) ,可以通过-C profile-generate-C profile-use编译器标志启用它。


Profile-Guided Optimization是一种编译器软件优化技术,用于分析测试运行而不是源代码。 它通过在两个阶段编译优化程序来工作:


  1. 首先,使用内置在编译器中的工具创建程序。 这可以通过传递rustc标志-C profile-generate 。 然后,应在数据样本上运行该工具程序,随后它将把概要分析数据写入文件。
  2. 然后,程序再次 rustc ,这一次使用-C profile-use标志将收集的概要分析数据传递回rustc 。 该程序集将使用收集的数据来允许编译器对代码放置,嵌入和其他优化做出更好的决策。

有关Profile-Guided Optimization的更多信息,请参见rustc编译器手册中的相应章节。


在Cargo项目中选择可执行文件


cargo run是用于快速测试控制台应用程序的非常方便的工具。 当一个软件包中存在多个可执行文件时,必须使用--bin标志显式声明要运行的可执行文件的名称。 这使得cargo run不像我们希望的那样符合人体工程学,尤其是当某个特定的可执行文件比其他可执行文件被更频繁地调用时。


Rust 1.37.0通过向Cargo.toml添加一个新的default-run键( [package]部分)来解决此问题。 因此,如果未--bin标志,则Cargo将启动配置中声明的二进制文件。


#[repr(align(N))]进行枚举


从Rust 1.37.0开始,属性#[repr(align(N))]可用于确定内存枚举的对齐方式 (以前该属性仅适用于结构( struct )和并集( union ))。 例如,如预期的那样, Align16枚举将具有16个字节的对齐方式,而没有#[repr(align(16))]自然对齐方式将为4


 #[repr(align(16))] enum Align16 { Foo { foo: u32 }, Bar { bar: u32 }, } 

使用#[repr(align(N))进行枚举的AlignN<T>与为此对齐方式定义AlignN<T>结构的包装器,然后使用AlignN<MyEnum>


 #[repr(align(N))] struct AlignN<T>(T); 

对标准库的更改


Rust 1.37.0稳定了标准库的以下组件:



其他变化


语法货物包裹管理器Clippy分析器也进行了一些更改。


成员1.37.0


许多人一起创建了Rust 1.37.0。 没有你们大家,我们不可能做到这一点, 谢谢!


新的Rust基础设施赞助商


我们要感谢两个新的Rust基础设施赞助商,他们提供了构建Rust 1.37.0所需的资源:Amazon Web Services(AWS)和Microsoft Azure:


  • AWS为发布工件(编译器,库,工具和源代码)提供了托管,通过CloudFront向用户授予了对这些工件的访问权限,防止了Crater的EC2退化,并管理了AWS上托管的另一个与Rust相关的基础架构。
  • 为了对rust-lang / rust存储库进行极其苛刻的测试,Microsoft Azure提供了构建器。

来自翻译


如果您对Rust语言有任何疑问,他们将可以在俄语电报聊天对新手进行的类似聊天中为您提供帮助。


本文由andreevlexozkrifffunkillGymmasssorla共同翻译。

Source: https://habr.com/ru/post/zh-CN463823/


All Articles