作成者にもかかわらず、いきなり遅刻しました。ごめんなさい。Rust Advent Calendar 2013、今からでも参加できますのでぜひ。
今日はRustの特徴を簡潔に紹介します。
Rustを学んでいると、ハードウェアに近い部分でのプログラミングをうまくサポートするための仕様が言語設計の随所に現れます。値とポインタ/参照の区別、C++のスマートポインタに似たポインタのセマンティクス、Cと互換性のある構造体のメモリレイアウト、C言語とのFFI、そしてRuntimeless Rust。Runtimeless RustはC言語やC++で言うところのフリースタンディング環境を指す用語です。現時点のRuntimeless Rustは少し手間を掛けることで言語のコアに限った形で利用することができる段階ですが、Runtimeless Rustのより良いサポートは長期的な目標の1つとしてコミュニティの中でも共有されています。
先に述べたように、RustはC言語やC++を意識している面がありますが、それらの言語との違いとして、ヌルポインタや解放済みのポインタをうっかり使うということが起こらないようになっています。また、強制的なキャストやC言語の関数を呼び出す箇所などの安全性を保証できない操作はそれと意識して使うことを促すような機能が組み込まれています。
"The Definition of Standard ML"の著者の一人であるRobert Harperは今年の講演"The Future of Standard ML"の中でRustをOCamlやF#、Scala、SML#と並んでML-like languageに位置づけていました。実際、Rustの型システムにはMLやHaskellの影響が強く現れています。例えば、Rustの標準ライブラリに含まれているOption型の定義は次の通りです。
pub enum Option<T> {
None,
Some(T),
}
enumというキーワードはC言語などでも使われていますが、その用法はC言語のenumよりも代数的データ型やバリアントに近いものになっています。また、パターンマッチや型推論もRustに取り込まれています。
let foo = may_return_int(); // foo: Option<int>
match foo {
Some(42) => println!("the answer of everything, you know"),
Some(n) => println!("I got {} cookies!", n),
None => println!("grrr...")
}
// declare the type of variable explicitly
let bar: int = match foo {
Some(n) => n,
None => 4643
};
上の例で分かる通り、matchは値を持つ式として使うことができます。他の制御構造、例えばifも値を持ちます。
let baz = if x % 2 == 0 { "even" } else { "odd" };
また、変数とそれに紐付けられる値はデフォルトで不変 (immutable) であり、変数にmut修飾を加えることで変更できるようになります。
このように、Rustは関数プログラミングをよくサポートした言語で発展した技術を取り込んでいます。
Rustは処理の基本単位であるタスクとメッセージパッシングのための機構であるチャンネルやポートといった道具を使って並行/並列プログラミングをサポートします。値がデフォルトで不変であることは並行/並列プログラミングをサポートする上でも有利に働きます。なぜなら、不変な値を排他制御なしにタスク間で共有したとしても、書き込みで競合を起こすことはない[1]からです。
RustはGraydon Hoareの個人的なプロジェクトとして2006年に始まりましたが、現在では彼の雇用主であるMozillaがRustプロジェクトをバックアップしています。また、サムスンも現時点でRustを使っているコードベースとして1、2を争う[2]規模のプロジェクトであるServoレイアウトエンジンを中心にRustの開発をサポートする立場にあります。
しかし、RustプロジェクトそのものはMozillaとサムスンの社員のみで回っているというわけではなく、コミュニティの参加者による多くのコミットもまたプロジェクトを前進させる原動力となっています。
Rustは今のところ安定版リリースである1.0に向けて言語仕様とライブラリ、処理系や周辺ツールの開発を精力的に継続しています。現在の最新リリースである0.8が公開されてからも標準ライブラリの様々な部分に修正が加えられているので、長期のサポートを必要とするようなコードをRustで今すぐ書くことはお勧めできません。[3]
その1.0は2014年にリリースされると言われています。楽しみですね!
Rustが一般に公開されたのは2010年の2月。日本ではRust Samuraiというコミュニティが2013年に2度イベントを開催しています。たまに比較対象に挙がるGoやD言語と比べると、まだ知名度も安定性も導入事例も到底及びませんが、この文書を読んで少しでもRustに興味を持った方がいたならば幸いです。
[1] | C++でいうところのbitwise constな値の場合。当然ながらlogical constな値は内部で排他制御を要する。 |
[2] | もう一つは現時点で唯一のRust処理系とその標準ライブラリ。 |
[3] | Gitリポジトリのmasterを追いかけてコードを追随させる覚悟がある場合を除く。今の時点で自前フォークは後でつらいので止めた方が良いと思います。 |