Rust 1.7 が本日(日本時間2016年3月4日)リリースされました。Rust は、安全性、スピード、並列プログラミングにフォーカスした、システムプログラミング向けの言語です。
また、同時に次のバージョン 1.8 がベータ版になりました。1.8 のリリース予定日は6週間後の2016年4月14日(日本時間の4月15日未明)です。
もしこれから Rust を始めるのでしたら、オフィシャルマニュアルの 日本語翻訳版 を読むのがいいでしょう。現状は Rust 1.6 のマニュアルをベースにしていますが、すでに全体の 約85% が翻訳済みとなってます。
(この記事はリリースアナウンスの抄訳です)
1.7 安定版の内容
1.7 は、主にライブラリ機能についてのリリースです。将来のリリースに向けた言語機能の開発も行われましたが、1.7 の開発期間にはホリデーシーズンが含まれていました(訳注:1.7 の開発期間は 2015年12月10日から2016年1月20日までの6週間)。そのため、GitHub にコメントを書く時間が減り、最愛の人たちと過ごす時間が増えた人もいたでしょう。
ライブラリの安定化
1.7 では約40個のライブラリ関数とメソッドが安定化されました。安定化された API の中で最大だったのは、標準ライブラリの HashMap<K, V>
型で独自のハッシュアルゴリズムをサポートするためのものでした。いままでハッシュマップは、SipHash をハッシュアルゴリズムとして使用していました。これは、デフォルトで DOS アタック(サービス拒否攻撃)への耐性をもたらします。その一方で SipHash は、小さなキーのハッシュ値を求めるのは あまり速くない ことが知られています。リンク先でも示されているように、このような小さな入力に対しては FNV ハッシュアルゴリズム がより高速に動作します。つまりこれは、HashMap<usize, V>
のようなキーが小さく、DOS への耐性がなくてもいい型については、ハッシュアルゴリズムを変更するだけで劇的なスピードの向上が望めるということです。
実際に動かしてみるには、crates.io から fnv クレート をチェックアウトして、以下のように HashMap
を作ります:
extern crate fnv;
use std::collections::HashMap;
use std::hash::BuildHasherDefault;
use fnv::FnvHasher;
type MyHasher = BuildHasherDefault<FnvHasher>;
fn main() {
let mut map: HashMap<_, _, MyHasher> = HashMap::default();
map.insert(1, "Hello");
map.insert(2, ", world!");
println!("{:?}", map);
}
ほとんどの場合は hasher の指定を省いても、型推論がうまくやってくれます。つまり、HashMap::default()
とするだけで、最大で約2倍速いハッシュが得られることになります。特筆すべきは Hash トレイトがハッシュアルゴリズムに非依存なので、スピードを向上させるために、ハッシュマップに格納する型の修正が不要なことです。
これ以外の重要な改良点には、以下のようなものがあります:
-
<[T]>::clone_from_slice()
は、あるスライスのデータを、別のスライスへコピーするための効率の良い方法です。 -
Ipv4Addr
とIpv6Addr
の多数の便利メソッド。例えばis_loopback()
は、アドレスが RFC 6890 で規定されるループバックアドレスの時true
を返します。 - FFI で使用される
CString
に対する、数多くの改良。 - 数多くの数値型に対する、次のような演算。それぞれの数値型に対して同じ関数が実装されているので、これらの数は先ほどの「40個」には含んでいない。
- チェック付き演算(訳注:オーバーフローとアンダーフローのチェック付き演算で
Option<T>
値を返す) - オーバーフロー演算(訳注:演算結果と共にオーバーフローしたかどうかを、
(T, bool)
型で返す) - 飽和(saturated)演算(訳注:オーバーフローする代わりに、飽和値を返す)
- チェック付き演算(訳注:オーバーフローとアンダーフローのチェック付き演算で
その他の変更については リリースノート を参照してください。
Cargo の機能
Cargo について小さなアップデートがありました:
-
ビルドスクリプト関連の改良。これにより、依存プロジェクト(訳注:の中の
rerun-if-changed
指示)が、本当にファイルが変更された時だけに、Cargo にビルドスクリプトを返すようになりました。ビルドスクリプトを含むリポジトリを使用しているなら、開発負荷が軽減されるはずです。 -
cargo rustc
サブコマンドの修正。テスト時などに、dev依存関係を使用するためのプロファイルが指定できるようになりました。