BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Rust 1.51がリリース - const genericsが安定化、Cargoとコンパイル時間が改善

Rust 1.51がリリース - const genericsが安定化、Cargoとコンパイル時間が改善

原文(投稿日:2021/03/28)へのリンク

Rust 1.51にはconst genericsの安定版MVP(minimum value proposition、最小限の価値提案)が提供されており、型や有効期限ではなく、整数などの定数値による型のパラメータ化が可能になっている。新しいFeature ResolverによるCargoの改善、macOSでのコンパイル速度の向上なども、新しいRustリリースに含まれている。

1.51よりも前に、const genericsがRustの世界にまったく存在しなかった訳ではない。事実としてRust 1.47には、配列操作を簡素化する目的で、const genericsの限定的なサポートが取り入れられている。Rustの配列で問題なのは、例えば[T; N]のように、型表現の一部に整数が含まれていることだ。そのためRust 1.46までは、サポートする必要のあるすべてのN値に対して、配列のトレイトを手作業で実装しなければならなかった。これはRustの標準ライブラリでも同じであったため、配列を操作する標準関数では、対象が最大で32要素までの配列に制限されていた。

このような配列の制限は、前述のように1.47で排除されたが、Rust 1.51では整数や文字、論理値(boolean)などの整数型(integral types)に対してconst generics型を生成できるようになった。以下のスニペットは、同じサイズの2つの配列に対するラッパの宣言方法を示したものだ。

struct ArrayPair<T, const N: usize> {
    left: [T; N],
    right: [T; N],
}

impl<T: Debug, const N: usize> Debug for ArrayPair<T, N> {
    // ...
}

const genericsを使えばさまざまなgeneric typeを新たに宣言できるが、実装としてはまだ完全ではない。実際にRustチームでは、文字列と独自型のサポートと、定数引数ではない複雑な式を使ってconst genericsを特定する機能の開発に取り組んでいる。独自型でconst genericsをサポートするには、構造的等価性の概念を定義する必要がある。この概念を実装した型のみが、const parameterとして使用できるのだ。

今後の開発には、const genericsのアドバンテージを活用したメソッドを標準ライブラリに追加することも含まれている。その一例が、すでに安定版となったarray::IntoIterで、参照ではなく値によって配列のイテレーションを行うものだ。

Cargoの新たなFeature Resolverは、例えばあるクレートを、コンパイル時に使用される開発者用の依存関係と、最終的なバイナリ用の依存関係の両方で指定した場合に発生する、長年の問題を解決することを目的としている。クレートが依存性グラフに2回以上現れると、ビルドを1回にするために、Cargoはそのクレートを使用するフィーチャをすべてひとつにまとめようとする。しかしながら、コンパイル時に使用するstdなどのフィーチャを、最終的なバイナリには含めたくない状況があるかも知れない。例えばターゲットが組み込みシステムで、#![no_std]クレートのみを使用する場合などだ。

この振る舞いを解決するため、クレートが2度コンパイルされるケースを検出可能な新しいresolverオプションがCargoに追加された。

コンパイル時間の面においては、前述のようにRust 1.51では、macOSでのパフォーマンスが大幅に向上している。これはデバッグ情報をバイナリから収集するという、新たな動作によるものだ。事実として、現在はdysmutilではなく、デバッグ情報をインクリメンタルに収集可能な新しいバックエンドが使用されている。これにより、最終バイナリ全体を走査するという、大規模プロジェクトでは極めて高価になる可能性のある処理が不要になった。

変更、修正、安定版への移行に関するすべての情報は、公式リリースノートに掲載されている。

この記事に星をつける

おすすめ度
スタイル

BT