Rustツールチェーン

ツールチェーンはインストールされたRustコンパイラ、関連ツール、標準ライブラリ一式を指します。SOLID-RustではRustツールチェーンをインストールするためにrustupという公式のツールチェーン管理システムを使用します。

チャンネル

ツールチェーンのリリースはnightly, beta, stableという3つのチャンネルに分類されています [The Book]

Rustの開発はRustのGitリポジトリmaster ブランチで行われています。すべての変更は master ブランチに入る前にCI [Guide to Rustc Development] で自動的にテストされており、マージ後に全てのテストをパスするような変更のみが master ブランチにマージされます。

../../_images/rust-bors.svg

master ブランチの内容が毎晩nightlyツールチェーンとしてリリースされます。6週間おきに master ブランチを基にして beta ブランチが作成され、betaツールチェーンのテストサイクルが始まります。それから6週間経過した後、この beta ブランチから stable ブランチが作成され、stableツールチェーンとして最終的にリリースされます。

自動化テストで検出されなかったバグが発見された場合、まず master ブランチでバグ修正が行われ、nightlyツールチェーンに反映されます。緊急性に応じてbetaツールチェーンやstableツールチェーンにもバックポートされる場合があります。

下図に master ブランチから各チャンネルにツールチェーンがリリースされるまでの流れの例を示しています。

../../_images/rust-channels.svg

SOLID-Rustではnightlyツールチェーンのみをサポートしています。 Nightlyツールチェーンを使用するのはSOLIDターゲットがTier 3ターゲットであり、rustup経由で配布されているツールチェーンでTier 3ターゲット向けにビルドするためには現時点ではunstable featuresが必要なためです。

Unstable features

Rustは後方互換性 (安定性) を重視しています [The Book] 。新しい機能を追加する際には、一部のコーナーケースを除き、それが将来のバージョンにわたってずっと使用できることを保証しています。しかし、追加した機能は、実際に使われるようになってはじめて根本的な設計ミスが明らかになるかもしれません。したがって、単純にこのアプローチを取ると新機能の追加に非常に慎重になる必要があり、進歩が妨げられてしまいます。

そこで、安定性と進歩を両立するために、開発中の実験的な機能をunstable features (不安定な機能)という名前の下で使用できるようにしています。こうした機能はnightlyツールチェーンのみで使用でき、またソースコード中で #![feature(const_option)] のように機能を明示的に有効化する必要があります。

Unstable featuresに関する進捗のトラッキングや議論は rust-lang/rust#90957 等のtracking issueで行われています。

Note

Unstable featuresの本質はその機能が将来のRustのバージョン (e.g., Rust 1.61.0, 1.100.0, Rust 1.10000.0, ...) にわたって現在と同じ形で存在し続けることにコミットメントされていないという点です。

信頼性という点ではunstable featuresはまちまちです。多くは他の機能と同様に十分テストされており、「誰かが安定化を提言する」「最終的な名前を決める」ことが次のステップである場合がよくあります。一方、一般的な使用には耐えるものの、コーナーケースの動作が規定されていなかったり、コンパイラがICEを起こしたりする場合があります。また、 #![feature(specialization)] (rust-lang/rust#31844) などRustの安全性の保証を脅かすことが知られている機能もわずかに存在し、使用時にコンパイラが警告を出力します。