Rust (プログラミング言語)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
Rust
パラダイム 並列計算関数型オブジェクト指向命令型プログラミング構造化静的型付け
登場時期 2010
設計者 グレイドン・ホアレ
開発者 モジラ
評価版リリース 0.10[1] / 2014-04-03[2]
型付け 静的型付け強い型付け型推論、構造化データ
主な処理系 rustc
影響を受けた言語 AlefC++Camlp4Common LispErlangHaskellHermesLimboNapierNapier88NewsqueakNILSatherStandard ML
プラットフォーム FreeBSDLinuxMac OS XWindows
ライセンス MIT
ウェブサイト rust-lang.org
拡張子 .rs .rc

Rust は実験的な並列かつマルチパラダイムのプログラミング言語である。モジラによって開発中である[3]純関数型プログラミング並列アクターモデル手続き型プログラミングオブジェクト指向プログラミングをサポートする実用的な言語を目指し開発中である。

概要[編集]

主任開発者はグレイドン・ホアレ[4]である。彼は2006年にこの言語の開発に着手し、モジラが関わりはじめたのは2009年で[5]、2010年のモジラ・サミットで公に姿を表した[6]。初期のコンパイラーは OCaml 言語で作られていたが、2010年にはコンパイラーをRust言語自身で作る作業が開始された[7]。翌年には最初の完動品が作成された[8]。このコンパイラーはLLVMで構築された。

Rust コンパイラーの第 0.1 版は2012年1月に完成している[9]。モジラはこれを新しいモノ好みの人やプログラミング言語愛好家のためのアルファ版と位置づけている。

モジラの理念を守り[10]、Rust 言語は社会に開かれており、開発者たちは利用者からの感想や提言を求めている。

Rust言語のウェブサイトには「このアルファ版のソフトウェアにはたくさんのバグや不完全なところがあるのは分かっており、それらは将来変更されます。しばらくの間は不安定な仕様や廃止される仕様があり、後の版でのソースコードの互換性も保証されていません。ご自身の責任でお使いください。」[11]と述べられている。実験的な取り組みであるという性質上、言語にもコンパイラーにもベータ版が公開される予定日は決められていない。

特徴[編集]

Rust言語はインターネット上で動作する大きなクライアントとサーバープログラムを作成するのに都合が良い言語を目指したものである。結果として、安全性、メモリ管理、並列性が、この言語の目立った特徴となっている。性能はC++言語に匹敵するものになるはずである[12]

Rust言語の文法はC言語C++言語に類似しており、ブロックは中括弧で区切られ、制御文にはifelsedowhileforの予約語が使われる。C言語やC++言語にある予約語のすべてが存在するわけではない一方、多方向分岐に使われるmatch文など、C、C++言語のプログラマーには馴染みがない予約語が含まれる。Rust言語はC言語やC++言語と文法的には類似点があるにもかかわらず、意味論(セマンティクス)の点でははとても異なっている。

このシステムの設計はメモリー・セーフであり、ヌルポインターや不正なメモリ域を指すポインターは許容されていない。データの値は決まったフォームのみで初期化され、それらの全ての入力は既に初期化されている必要がある[13]

この言語の型システムでは Haskell 言語に倣い「型クラス」を用いることができる。これはアドホックな多相性を容易にするものであり、可変型宣言により実現されるものである。高類多相性[14]など、Haskell 言語にある他の特徴はサポートされていない。

Rust言語では予約語「let」で宣言された変数に対して型推論が行われる。これらの変数は型を決定するための値を必要としない。コード中のどこかでそれらの変数への値の代入[15]が失敗した場合にはコンパイル時エラーが発生する[16]。型が明示された関数の引数に対しては型推論は行われない。

fn fib(n: int) -> int { }

なお、これを

fn fib(n) -> { }

のように、型を省いて記述することはできない。

並列性の機構は軽量タスクとして提供される。これと類似の仕組みは Erlang言語などのアクターモデルの言語にも見られるものである。それらのシステムにおいて、複数のタスク同士は直接にデータを共有するのではなく、メッセージ・パッシングによってデータのやり取りを行う。性能上の理由から、データのやり取りには固有の箱[17]を使って行われ、データの複製はされない。それらの箱は所有者が一人であることが保証されたもので、送信タスクから受信タスクに向けて開放することができる。

Rust言語が備えるオブジェクトシステムはクラス、インターフェース、トレイトにより構成される。継承と多相性はそれぞれトレイトとインターフェースによって提供され、クラスは他のクラスから継承することはできない。トレイトの仕組みは複数のクラスに混入させることのできる再利用可能なメソッド実装を提供する。それらのメソッドは実行に必要なフィールド群を規定するものの、それ自身はそれらのフィールドを定義することは出来ない。この特徴によって C++ 言語でおきる菱形継承問題が回避されている。(クラスとトレイトの仕組みは実験的なものであり、現時点の予定として、インターフェースは Rust 第 0.4 版でトレイトと統合されて削除されることになっている。)

プログラム例[編集]

以下のコードは Rust 第 0.4 版において正しいプログラムである。文法や意味論は後の版で改変される可能性がある。

Hello World[編集]

fn main() {
    io::println("hello, world");
}

階乗[編集]

階乗を求めるプログラム。再帰呼び出しによるものと、繰り返し処理によるもの。

/* return文なしに暗黙に値を返す Rust言語の機能を示す例である。
   関数型様式のプログラムを作成する際に、この特徴は便利である。
   C言語やC++言語とは異なり、Rust言語の if は文ではなく式である。
   そのため、返し値を伴わなければならない。 */
fn fac_recur(n: int) -> int {
    if n <= 1 { 1 }
    else { n * fac_recur(n-1) }
}
fn fac_iter(n: int) -> int {
    // 変数は予約語「mut[18]」で宣言することで可変になる。
    let mut i = 1,
            result = 1;
    while i <= n {
        result *= i;
        i += 1;
    }
    return result;  // 明示的なreturn文。関数型の例と対照的。
}

言語の発展[編集]

この言語の開発の初期の頃、変数名や関数名など識別子としてASCII文字以外の文字を使うことは禁じられていた。言語についてのある質疑応答の中で、現場の非英語圏のプログラマーのほとんどが識別子にはASCII文字を使っていると述べられていた。しかしその制限は反論を引き出すことになった[19]。それで、2011年2月に言語に変更が行われ、この制限は削除された[20]

脚注[編集]

  1. ^ rust/RELEASES.txt
  2. ^ [rust-dev] Rust 0.10 Released
  3. ^ The Rust Language”. Lambda the Ultimate (2010年7月8日). 2010年10月30日閲覧。
  4. ^ : Graydon Hoare
  5. ^ Project FAQ” (2010年9月14日). 2012年1月11日閲覧。
  6. ^ Future Tense” (2011年4月29日). 2012年2月6日閲覧。 “At Mozilla Summit 2010, we launched Rust, a new programming language motivated by safety and concurrency for parallel hardware, the “manycore” future which is upon us.
  7. ^ Hoare, Graydon (2010年10月2日). “Rust Progress”. 2010年10月30日閲覧。
  8. ^ Hoare, Graydon (2011年4月20日). “rust-dev] stage1/rustc builds”. 2011年4月20日閲覧。 “After that last change fixing the logging scope context bug, looks like stage1/rustc builds. Just shy of midnight :)
  9. ^ catamorphism (2012年1月20日). “Mozilla and the Rust community release Rust 0.1 (a strongly-typed systems programming language with a focus on memory safety and concurrency)”. 2012年2月6日閲覧。
  10. ^ The Mozilla Manifesto”. 2012年4月9日閲覧。
  11. ^ : This is alpha-level software with many known bugs, incomplete features and planned future changes. Use at your own risk, expect some instability, disruption and source-level incompatibility for a while yet.
  12. ^ Walton, Patrick (2010年12月5日). “C++ Design Goals in the Context of Rust”. 2011年1月21日閲覧。 “… It’s impossible to be “as fast as C” in all cases while remaining safe… C++ allows all sorts of low-level tricks, mostly involving circumventing the type system, that offer practically unlimited avenues for optimization. In practice, though, C++ programmers restrict themselves to a few tools for the vast majority of the code they write, including stack-allocated variables owned by one function and passed by alias, uniquely owned objects (often used with auto_ptr or the C++0x unique_ptr), and reference counting via shared_ptr or COM. One of the goals of Rust’s type system is to support these patterns exactly as C++ does, but to enforce their safe usage. In this way, the goal is to be competitive with the vast majority of idiomatic C++ in performance, while remaining memory-safe…
  13. ^ Doc language FAQ” (2010年9月14日). 2012年1月11日閲覧。
  14. ^ : higher-kinded polymorphism
  15. ^ : assign
  16. ^ Walton, Patrick (2010年10月1日). “Rust Features I: Type Inference”. 2011年1月21日閲覧。
  17. ^ : unique box
  18. ^ 「可変の」を意味する英語「mutable」に由来
  19. ^ Jelliffe, Rick (2010年11月8日). “Vale Java? Scala Vala palava”. 2012年3月29日閲覧。 “… It is just plain ignorant to say that non-English programmers always write with ASCII. (Just as it would be ignorant to say that they never do.) It is that kind of rather blithe dismissal that foreign cultures and languages need to be supported that creates extra unnecessary barriers. That argument ran out of legs in the early 1990s: all platforms have well -established Unicode libraries with serviceable properties for this…
  20. ^ Commit dabccadd3202513ab0bcb424e2c62c90ab23062d” (2011年2月26日). 2012年1月11日閲覧。

外部リンク[編集]