Rustの最新バージョンの最も重要な改善点は、不要なコピーの回避によって実現したメモリ使用量の削減だ。さらにrustdoc
も、CommonMark準拠のエンジンを一貫的に使用してドキュメントをレンダリングするようになった。
Rustチームによると、特定のオブジェクトのコピーを避けることで、rustc
のメモリ使用量が5-10パーセント削減された。ただしこの数値は、コンパイルされるプログラムによって異なる可能性がある。具体的に言うと、現在のrustc
は、これまではローカル変数と引数の間であった等価性の判断を関数まで拡げている。これによって、引数をローカルにバインドする場合に、その引数のコピーを作る必要がなくなった。このコピーの振る舞いは、かつてはMIRレベルにあったが、その後廃止された、ローカル変数と引数との区別の名残だった。ローカル変数と取得引数の区別を廃止したことによって、メモリ使用量が改善されただけでなく、デバッグ情報に関する誤解も少なくなっている。変更可能なローカルバインディングでは状況がさらに悪く、引数が実際に変更されていないにも関わらず、デバッガではローカル変数が変化する場合もあった。
もうひとつの興味深い点は、rustc
において、到達不能な
命令をハードウェアトラップに変更するLLVMのTrapUnreachable
が有効になったことだ。これまでは、制御フローが到達不能な命令を踏み越えると、メモリ上でその後にあるコードが実行される可能性があった。この変更によって、到達不能な
コードにおける未定義動作による影響の軽減が期待できる。
ドキュメントに関しては、rustdoc
は、CommonMarkに完全準拠するための作業を続けてきた。Rust 1.23のドキュメントは、従来のRustのレンダラであるHoedownと、CommonMark準拠のレンダリングエンジンの両方でレンダリングされる。この処理は今後しばらく継続される予定で、レンダリングに何らかの差異があった場合はrustdoc
が警告することによって、ドキュメントの保守担当者がそれを修正することができる。将来的には、CommonMark準拠のエンジンがデフォルトになる予定だ。
Rust 1.23では、プリミティブ型にAsciiExt
トレイトが追加されるなど、ライブラリの安定化も図られている。これによってu8
、char
、str
は、AsciiExtトレイトをインポートせずにそのメソッドを使用できる。
RustのパッケージマネージャであるCargoにも、複数のパッケージの同時アンインストールのサポート、“cargo install --version
”を使った特定のパッケージバージョンのインストールなど、いくつかの改良が加えられている。
その他にも多数の変更と改良が加えられたRust 1.23は、“rustp update stable
”の実行でインストールすることができる。
この記事を評価
- 編集者評
- 編集長アクション