コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「Rust (プログラミング言語)」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Cewbot (会話 | 投稿記録)
159行目: 159行目:


=== rustc ===
=== rustc ===
rustcはRustで記述されたRustソースコードをコンパイルするコンパイラ(処理系)である。コンパイルの成果物として[[中間コード]]、および[[実行ファイル]]、[[静的リンク|静的ライブラリ]]、[[動的リンク|動的ライブラリ]]を出力する<ref>{{citebook|last=Blandy|first=Jim|year=2017|title=Programming Rust|publisher=O'Reilly Media, Inc|page=285|isbn=1491927283}}</ref>。rustcは[[クロスコンパイル]]を可能とし、[[Microsoft Windows|Windows]]、[[Linux]]、[[macOS]]向けの実行ファイル他、[[Android]]や[[iOS]]で動作するライブラリをホストマシンで出力することができる<ref>{{citeweb|author=Brian Anderson|url=https://blog.rust-lang.org/2016/05/13/rustup.html|title=Taking Rust everywhere with rustup|date=2016-05-13|accessdate=2018-01-28}}</ref>。
rustcはRustで記述されたRustソースコードをコンパイルするコンパイラ(処理系)である。コンパイルの成果物として[[中間コード]]、および[[実行ファイル]]、[[静的リンク|静的ライブラリ]]、[[動的リンク|動的ライブラリ]]を出力する<ref>{{citebook|last=Blandy|first=Jim|year=2017|title=Programming Rust|publisher=O'Reilly Media, Inc|page=285|isbn=1491927283}}</ref>。rustcは[[クロスコンパイル]]を可能とし、[[Microsoft Windows|Windows]]、[[Linux]]、[[macOS]]向けの実行ファイル他、[[Android (オペレーティングシステム)|Android]]や[[iOS]]で動作するライブラリをホストマシンで出力することができる<ref>{{citeweb|author=Brian Anderson|url=https://blog.rust-lang.org/2016/05/13/rustup.html|title=Taking Rust everywhere with rustup|date=2016-05-13|accessdate=2018-01-28}}</ref>。


対象プラットフォームは完成度に合わせて3つのティアに分かれている<ref name="rust-platform-support">{{citeweb|url=https://forge.rust-lang.org/platform-support.html|title=Rust Platform Support &middot; The Rust Programming Language|accessdate=2018-02-04}}</ref>。ティア1はバイナリリリースが提供されており、{{仮リンク|自動ビルド|en|Build automation}}と[[テスト自動化|自動テスト]]が整備され、それらが安定して成功(パス)することが保証されている。
対象プラットフォームは完成度に合わせて3つのティアに分かれている<ref name="rust-platform-support">{{citeweb|url=https://forge.rust-lang.org/platform-support.html|title=Rust Platform Support &middot; The Rust Programming Language|accessdate=2018-02-04}}</ref>。ティア1はバイナリリリースが提供されており、{{仮リンク|自動ビルド|en|Build automation}}と[[テスト自動化|自動テスト]]が整備され、それらが安定して成功(パス)することが保証されている。
ティア2はバイナリリリースが提供されており、自動ビルドと自動テストは整備されているがテストが成功することは保証されていない。ティア3は[[ソースコード]]としては対応しているが、自動ビルドと自動テストの動作が保証されておらず、公式リリースは提供されていない。
ティア2はバイナリリリースが提供されており、自動ビルドと自動テストは整備されているがテストが成功することは保証されていない。ティア3は[[ソースコード]]としては対応しているが、自動ビルドと自動テストの動作が保証されておらず、公式リリースは提供されていない。


[[Microsoft Windows|Windows]]、[[Linux]]、[[macOS]]向けのRust[[コンパイラ]]はティア1でリリースされている。[[Android]]、[[iOS]]、[[WebAssembly]]向けのRust[[コンパイラ]]はティア2でリリースされている。
[[Microsoft Windows|Windows]]、[[Linux]]、[[macOS]]向けのRust[[コンパイラ]]はティア1でリリースされている。[[Android (オペレーティングシステム)|Android]]、[[iOS]]、[[WebAssembly]]向けのRust[[コンパイラ]]はティア2でリリースされている。


Rust 1.12版より導入されたMIR (Mid-level IR)<ref name="MIR">{{cite web|url=https://blog.rust-lang.org/2016/04/19/MIR.html|title=Introducing MIR|last=Matsakis|first=Niko|date=2016-04-19|accessdate=2016-10-04}}</ref> によって、コンパイルと実行時間の迅速化ならびに型チェックの正確性の実現が図られている。
Rust 1.12版より導入されたMIR (Mid-level IR)<ref name="MIR">{{cite web|url=https://blog.rust-lang.org/2016/04/19/MIR.html|title=Introducing MIR|last=Matsakis|first=Niko|date=2016-04-19|accessdate=2016-10-04}}</ref> によって、コンパイルと実行時間の迅速化ならびに型チェックの正確性の実現が図られている。
208行目: 208行目:


==== 機能 ====
==== 機能 ====
rustupはRustプロジェクトがリリースしている[[コンパイラ]](rustc)、[[ビルドツール]](Cargo)などの[[ツールチェーン]]をインターネットを経由してホストマシンにダウンロード、インストールおよびマネージメントする機能を提供する。インストール対象の[[ツールチェーン]]のバージョンは、安定版、ベータ版、[[デイリービルド|ナイトリー]]版の全てを含んでおり、利用者が必要とするバージョンを指定してダウンロードすることができる。また、ターゲットプラットフォームについても全ての種類を含んでおり、ホストマシンと異なるプラットフォーム(例えば、ホストが[[macOS]]であっても[[Microsoft Windows|Windows]]や[[Android]]、[[iOS (アップル)|iOS]])のコンパイラをインストールすることができる。この場合、コンパイラは[[クロスコンパイラ]]として動作してターゲットプラットフォームに合わせたビルドを実施する。
rustupはRustプロジェクトがリリースしている[[コンパイラ]](rustc)、[[ビルドツール]](Cargo)などの[[ツールチェーン]]をインターネットを経由してホストマシンにダウンロード、インストールおよびマネージメントする機能を提供する。インストール対象の[[ツールチェーン]]のバージョンは、安定版、ベータ版、[[デイリービルド|ナイトリー]]版の全てを含んでおり、利用者が必要とするバージョンを指定してダウンロードすることができる。また、ターゲットプラットフォームについても全ての種類を含んでおり、ホストマシンと異なるプラットフォーム(例えば、ホストが[[macOS]]であっても[[Microsoft Windows|Windows]]や[[Android (オペレーティングシステム)|Android]]、[[iOS (アップル)|iOS]])のコンパイラをインストールすることができる。この場合、コンパイラは[[クロスコンパイラ]]として動作してターゲットプラットフォームに合わせたビルドを実施する。


==== 歴史 ====
==== 歴史 ====

2020年9月6日 (日) 07:31時点における版

Rust
Rust
Rustのロゴ
パラダイム システムプログラミング、関数型プログラミング並行計算ジェネリックプログラミング命令型プログラミングオブジェクト指向プログラミング ウィキデータを編集
登場時期
  • 2006年 ウィキデータを編集
設計者 グレイドン・ホアレ ウィキデータを編集
開発者 Mozilla、グレイドン・ホアレ、Rust Foundation ウィキデータを編集
最新リリース 1.82.0 / 2024年10月17日[1]
型付け 静的型付け強い型付け型推論、構造化データ
主な処理系 rustc
影響を受けた言語 Alef、C++C Sharp、Cyclone、ErlangHaskellLimbo、Newsqueak、OCamlRubySchemeStandard MLSwift ウィキデータを編集
ライセンス Apache-2.0、MIT License ウィキデータを編集
ウェブサイト
拡張子 rs ウィキデータを編集
テンプレートを表示

Rust(ラスト)はMozillaが支援する[2][3]オープンソースシステムプログラミング言語である。

Rust言語は速度、並行性、安全性を言語仕様として保証するC言語C++に代わるシステムプログラミング英語版に適したプログラミング言語を目指している[4]。2006年の開発初期は、Mozillaの従業員のグレイドン・ホアレ(Graydon Hoare)[5]の個人プロジェクトだったが、2009年にMozillaが開発に関わり始めてMozilla Researchの公式プロジェクトとなった[2]。2015年に1.0版がリリースされるまでにいくつもの破壊的な仕様変更があったが、1.0版以降は基本的には後方互換を保って6週間間隔で定期的にリリースされている。プロジェクトはオープンソースのコミュニティベース開発で進行しており[6]、言語仕様(検討段階含む)、ソースコード、ドキュメントはオープンソースライセンスで公開されている[7]

Rustはマルチパラダイムプログラミング言語であり、手続き型プログラミングオブジェクト指向プログラミング関数型プログラミングなどの実装手法をサポートしている。基本的な制御フローC言語に似ているが、ほぼ全ての命令文が式(expression)であるという点においてはML言語に似ている。コンパイル基盤にMIRとLLVMを用いており[8]、実行時速度性能はC言語と同等程度である[9]。強力な型システムとリソース管理の仕組みにより、メモリ安全性が保証されている。

Rustは2016〜2019年の間Stack Overflow Developer Surveyで「最も愛されているプログラミング言語」で一位を獲得し続けている[10][11][12][13]。一方で、Rustは学習難易度が高い言語とも考えられており[14]、2017年ロードマップでは学習曲線の改善を目的として挙げていた[15]

Rustという名前はさび菌に因んで付けられた[16]。この命名の後、当時の開発チームメンバーの多くが自転車を愛好していたことから、自転車のチェーンリングの錆つきを元にしたデザインのロゴが考案された[17]

開発体系

Rustはオープンソースのコミュニティベースで開発が進められている。プロジェクトの主管はRust Project Developers(Rust開発チーム)である[18]。2018年現在、言語発明者のグレイドン・ホアレはプロジェクトチームから外れている。プロジェクトの全てのソースコードGitHubで一般に公開されており[19]、コミュニティメンバーの協力により改良が進められる。プロジェクトの大部分のコミットはコミュニティメンバーによるものである[20]

Mozillaの理念[21]を守り、Rust言語は社会に開かれており、言語やツールに対する仕様の提案はRFCの形で取りまとめられ[22]、関連するチケットで仕様詳細について利用者から感想や提言を受けている[23][24]

言語やコアライブラリを開発するRust開発チームはServoウェブブラウザレイアウトエンジン)やRustコンパイラの実装経験を通して言語を改良している。例えば、C言語とRustを連携させるコードを自動生成するbindgenは元々は外部開発者が開発していたが[25]、Mozilla Servo開発チームがServoの開発で利用するためにC++とRustを連携させるコードも自動生成できるよう改良を重ね、現在はServo開発チームと密に連携しているRust開発チームに主管を移行して[26]Servoの開発と共に改良が続けられている[27]

設計と特徴

linux.conf.auで披露されたRustプログラミングで成功するために必要なキーコンセプトを紹介したプレゼンテーション

パラダイム

言語実装手法においてのプログラミングパラダイムは特定の実装手法に限定されない非純粋なマルチパラダイムプログラミング言語である。文法の表面的な記述は手続き型プログラミング、ブロックコードのまとまりの意味論は関数型プログラミング、型システムを用いたオブジェクト構造はオブジェクト指向プログラミングのパラダイム特性を持つ。特定のプログラミングパラダイムのみを使用してソースコードを記述することはなく、要所々々の必要な所で必要なパラダイムを使用してソースコードを記述することになる。

ソースコードをターゲットプラットフォームに最適化したオブジェクトファイルコンパイルするコンパイル言語のパラダイム特性を持つ。多くのスクリプト言語が持つインタプリタ機能や、SwiftGoが提供するようなREPL機能のパラダイム特性は持たない。

その他のパラダイムとして、関数の入出力パラメータにジェネリック型を指定するジェネリックプログラミング、非同期機能を実現する並行計算のパラダイム特性を持つ。

基礎文法

Rustの基礎的な文法はC言語C++に似て、波括弧で囲まれたブロックコード{ ... }if, else, whileなどの制御フローキーワードを持つ。 全てのC言語C++のキーワードが実装されているわけではなく、一方で幾つかのRustの制御命令(パターンマッチのためのmatch)はそれらの言語を習得したプログラマにとっては馴染みが少ないものも存在する。Rustの命令文は、表面的なC言語C++との文法の類似性にも関わらず、意味論的にはML系言語の命令式に近く、関数本体のほぼ全ての部分は制御フロー演算子でさえ「文(statement)」ではなく「式(expression)」である[28]。例えば普通のif式もC言語で言う所の条件演算子であり、if式の結果として返り値を返す。

ブロックコード内の命令文のセパレータにはセミコロン(;)を用いるが、C言語のそれと異なりRustのセミコロンは直前の命令文がブロックコードで括られる式の途中式であることを宣言するためのものである。セミコロンを末尾に置かない命令文はブロックコードの最終的な評価式として扱われ、その式の結果がブロックコードの外へ戻り値として返される[29]

Hello World

「Hello, world!」を標準出力に出力するHello worldプログラム。

fn main() {
    println!("Hello, world!");
}

階乗

階乗を求めるプログラム。if式の結果として1もしくはn * fac_recursive(n-1)を返し、関数の結果としてif式の結果を返す。

fn fac_recursive(n: u32) -> u32 {
    if n <= 1 {
        1
    } else {
        n * fac_recursive(n-1)
    }
}

型とポリモーフィズム

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

型システム

Rust言語が備える型システムは、impl(実装)、trait(トレイト)、struct(構造体)およびenum(列挙型)を基本として構成される。implが他の言語におけるクラスに近い役割を果たし、継承とポリモーフィズムはtraitによって提供される。traitにはメソッドを定義することができ、traitで宣言されたメソッドはimplによってstructへミックスインされる。structにはフィールドが定義可能で、traitとimplはそれ自身にはフィールドは定義できない。enumには複数種類の型のカテゴリ変数が定義可能で、数値型、文字列型、オブジェクト型などの複数の状態を選択的に持ちうる。菱形継承問題を回避するためにtraitのみが継承が可能である。

変数の型を決定する型システム静的型付けかつ強い型付けである。静的型付けと動的型付けの区分においての型付けは、コンパイル時に全ての変数に対して型を決定する静的型付けのみをサポートしている。そのため、PerlPythonのようなインタプリタ言語で見られるような、実行時に変数の型を動的に上書きすることはできない。強い型付けと弱い型付けの区分においての型付けは、実行時に変数の型を型変換(アップキャスト、ダウンキャスト、クロスキャスト)およびボクシングをすることを許さない強い型付けのみをサポートしている。C言語Javaは実行時に型変換をすることを許す弱い型付けをサポートしているが、Rust言語ではそのような型変換は認められていない。これら二点の静的型付けかつ強い型付けの特性により、変数の型は宣言時のもので決定的に固定される。

型推論

Rust言語ではキーワード「let」で宣言された変数に対して、左辺を変数、右辺を値とする等号式(var = val)で変数値の代入命令がなされた時に、「左辺の変数の型」は「右辺の値の型」であると型推論がなされる。変数の宣言には必ずしも型を決定するための初期値を必要としない。変数の宣言時に初期値が与えられた場合は「変数の型」は「初期値の型」であると型推論がなされるが、初期値が与えられなかった場合は以降のブロックコード中のその変数へ値が初めて代入された時に「左辺の変数の型」は「右辺の代入する値の型」であると型推論がなされる。変数への値の代入を複数回行う場合はキーワード「mut」を付与して宣言する必要がある。変数への代入が型不一致により失敗した場合にはコンパイル時にエラーを検出する[31]

ポリモーフィズムの実現

ポリモーフィズムを実現するため、構造体フィールドおよび関数の入出力値は特定のトレイトの実装をするジェネリック型を指定することが出来る。そのような定義の中では、ジェネリック型で型が宣言された変数および入出力値はそのトレイトの特性のみ使用できる。これはジェネリック関数が定義されるとすぐに型判定ができることを意味している。これはC++ダック・タイピングで具体的な型がインスタンス化されるまで判定できないテンプレートとは対照的である。しかし、Rustのジェネリクスの実装はC++テンプレートの典型的な実装と似ており、インスタンス化ごとにコードの個別のコピーが生成される。これはモノモーフィゼーション[32]と呼ばれ、JavaHaskellで通常使用される型消去方式とは対照的である。モノモーフィゼーションの利点は特定のユースケースごとに最適化されたコードであり、欠点は結果のバイナリのコンパイル時間およびサイズが増加することである。Rustのトレイトを用いたポリモーフィズムの実現は、実行時のオーバーヘッドがない「ゼロコスト抽象化」と表現されている[33]

リソース管理

Rustはメモリやその他リソースの管理にRAIIを採用しており、リソースの利用区間をコンパイル時に静的に検証するボローチェッカー(borrow checker)という機能で実現されている。ガベージコレクション参照カウントとは異なり、コンパイル時に静的にリソースの利用区間を検証することで、実行時のリソース管理コストを少量に抑えている。

ボローチェッカー

一つのリソースは一つの所有者(変数やブロック)のみに関連付けされるという制約がRust特有のリソース管理機能として存在する。これは、あるリソースの所有権(ownership)はある所有者(owner)が持っている、のように表現される。同時に、リソースの所有権を複数の変数が持つことは出来ない。これはC++のスマートポインタの一種であるunique_ptrの振る舞いに似ている。ボローチェッカーは所有権の競合および不正利用を検証する。

リソースには参照(&記号)の概念が存在し、これは所有権の概念と並行して扱われる。所有権は一つの所有者しか持てないが、参照は複数の所有者が持ちうる。参照は同一のリソースを複数の箇所で利用するために利用される。ただし、所有権によるリソース管理は有効であり、所有権が解放されたリソースを指す参照は同時に無効化される。ボローチェッカーはこの参照についてもライフタイム(lifetimes)としてリソースの生存期間を検証する。

ボローチェッカーはリソースの所有権とライフタイムの両方を静的に解析することで、ヌルポインタ不正なメモリ域を指すポインター英語版リソース利用競合を制限したメモリ安全性を実現している。

特異なリソース型

リソースのメモリ確保は基本的にはスタックメモリを利用しており、ヒープメモリを利用したメモリ確保はBoxVecなどの特定の型のみで限定的に利用されている。

コンパイル時に型のサイズが決定できない可変長配列を表すような型はヒープメモリを利用するBox型を使用してリソースを管理する。Boxリソース自体はスタックメモリで管理されるが、Boxリソースが所有権を持つ実態のリソースはヒープメモリで管理される。標準のヒープメモリ確保にはシステムアロケータを利用するが[34]、対象プラットフォームやビルド時の指定により他のメモリ確保APIを利用することもある。ヒープメモリはスタックメモリに比べて速度性能が落ちるため、必要時にのみ限定的に利用されている。

ライブラリ

Rustのライブラリはクレート(crate)という呼称で提供される。多くのクレートはcrates.ioで公開されている。同サイトはバージョン毎のソースコードをアーカイブとして提供している。クレートは必ずしもcrates.ioに登録されている必要はなく、Webサーバファイルシステムを指すURIで指定することもできる[35]。ライブラリはソースコードプロジェクトで配布されることが一般的だが、コンパイルしたバイナリライブラリファイル(拡張子rlib)で出力することも可能である。

コアライブラリ

コアライブラリはcoreの名称で提供されている[36]。このライブラリは標準ライブラリに依存しない基幹ライブラリであり、一切の上位ライブラリ、システムライブラリ、libcライブラリにリンクしていない。コアライブラリは最小限であり、ヒープ割り当てを認識せず並行性や入出力も提供していない。それらのことはプラットフォームへの調整が必要であり、このライブラリはプラットフォームに依存しない。

標準ライブラリ

標準ライブラリはstdの名称で提供されている[37]。このライブラリは基礎的な型(Vec<T>やOption<T>)、言語の基本の処理、標準のマクロ、入出力(I/O)、マルチスレッドなどの機能を提供する。標準ライブラリは標準でリンクしてソフトウェアがビルドされるが、より根幹的なソフトウェアやリソースの小さい組み込み環境ではリンクを外してソフトウェアをビルドすることができる。

外部ライブラリ

Rustは基本的で汎用的な機能を含め標準ライブラリではなく外部ライブラリとして提供している。これはいわゆる「電池が付属しています (“Battery Included”)」の反対を行くもので、言語と共に更新することで保守的になりがちな標準ライブラリではなく、言語とは独立して更新することで最善を繰り返し探求しうる外部ライブラリとすることで、それらの機能をより良い品質で提供する考えに基づいていたものである[38]。外部ライブラリの利便性と品質の保証のためにcrates.ioAPIガイドラインを提供している。

言語開発のコミュニティがそれらについて携わっていないわけではなく、基礎的な外部ライブラリはコミュニティ配下で開発が進められている。

開発ツール

Rustの開発ツールは独立したソフトウェアとして提供されている。

rustc

rustcはRustで記述されたRustソースコードをコンパイルするコンパイラ(処理系)である。コンパイルの成果物として中間コード、および実行ファイル静的ライブラリ動的ライブラリを出力する[44]。rustcはクロスコンパイルを可能とし、WindowsLinuxmacOS向けの実行ファイル他、AndroidiOSで動作するライブラリをホストマシンで出力することができる[45]

対象プラットフォームは完成度に合わせて3つのティアに分かれている[46]。ティア1はバイナリリリースが提供されており、自動ビルド英語版自動テストが整備され、それらが安定して成功(パス)することが保証されている。 ティア2はバイナリリリースが提供されており、自動ビルドと自動テストは整備されているがテストが成功することは保証されていない。ティア3はソースコードとしては対応しているが、自動ビルドと自動テストの動作が保証されておらず、公式リリースは提供されていない。

WindowsLinuxmacOS向けのRustコンパイラはティア1でリリースされている。AndroidiOSWebAssembly向けのRustコンパイラはティア2でリリースされている。

Rust 1.12版より導入されたMIR (Mid-level IR)[8] によって、コンパイルと実行時間の迅速化ならびに型チェックの正確性の実現が図られている。

Cargo

Cargo
最新版
0.35.0 / 2019年4月12日 (5年前) (2019-04-12)[47]
リポジトリ github.com/rust-lang/cargo
プログラミング
言語
Rust
種別 ビルドツールパッケージ管理システム
公式サイト doc.rust-lang.org/stable/cargo/
テンプレートを表示

CargoはRust製ソフトウェアプロジェクトのCUIのビルドツールである。規定のファイル構成(ディレクトリ、設定ファイル、ソースファイル)のプロジェクトディレクトリで利用される。プロジェクトのビルド(コンパイル)、依存ライブラリのダウンロード、テスト、ドキュメント生成などをサポートする[48]。Cargoの依存ライブラリのダウンロード先はcrates.ioである[49]。 サブコマンドは拡張可能で標準のコマンドの他、README.mdファイルの自動生成コマンド[50]などの拡張コマンドが存在する。

rustup

rustup
開発元 Rust Project Developers
初版 2016年4月15日 (8年前) (2016-04-15)
最新版
1.17.0 / 2019年3月6日 (5年前) (2019-03-06)
リポジトリ https://github.com/rust-lang-nursery/rustup.rs
プログラミング
言語
Rust
対応OS Windows, Linux, macOS
公式サイト https://www.rustup.rs
テンプレートを表示

rustupはツールチェーンの管理ソフトウェアである。ツールチェーンのダウンロードとインストール、ソフトウェアバージョンの管理、コンパイルターゲットの切り替えの機能を提供する[51][52]

機能

rustupはRustプロジェクトがリリースしているコンパイラ(rustc)、ビルドツール(Cargo)などのツールチェーンをインターネットを経由してホストマシンにダウンロード、インストールおよびマネージメントする機能を提供する。インストール対象のツールチェーンのバージョンは、安定版、ベータ版、ナイトリー版の全てを含んでおり、利用者が必要とするバージョンを指定してダウンロードすることができる。また、ターゲットプラットフォームについても全ての種類を含んでおり、ホストマシンと異なるプラットフォーム(例えば、ホストがmacOSであってもWindowsAndroidiOS)のコンパイラをインストールすることができる。この場合、コンパイラはクロスコンパイラとして動作してターゲットプラットフォームに合わせたビルドを実施する。

歴史

Rust 1.13版以前はシェルスクリプトで実装されたrustup.shが公開されていた[53]。これと並行してRust言語で実装された同等機能を提供するrustup.rsの開発が進められており、Rust 1.14版でrustup.shは非推奨となり[54]、Rust 1.14版以降はrustup.rsが公式リリースとして提供されている[55][56]

評価

Rustは2016〜2019年に渡ってStack Overflow Developer Surveyで「最も愛されているプログラミング言語」で一位を獲得し続け[10][11][12][13]、プログラマの好意的な評価は多い。

一方で、Rustは学習難易度が高い言語とも考えられている[57]。多くのRust初学者のプログラマにおいて、自身が正しいと思って書いたソースコードのコンパイルに対してコンパイラ(ボローチェッカー)がエラーを検出する、「ボローチェッカーとの戦い」(fighting with the borrow checker)が発生しがちである[58][59]。小さなアプリケーションの実装について同時期に言語開発されているGo言語と比較した場合、Rust言語よりGo言語の方が開発効率が良いという評価がある[14]。学習難易度の高さは開発チームも認識しており、2017年ロードマップでは学習曲線の改善を目的として挙げていた[15][60]

Rustの実行時速度性能は同じくコンパイラにLLVMを利用している場合のC言語と同等程度であり[61][62]、一部の処理ではC言語を上回った速度が確認されている[9]。2018年2月時点で、ウェブサーバアプリケーションの汎用処理では速度性能の良いRust製ライブラリは開発が進んでいない[63]。単純なテキスト処理では速度性能は良い[64]

歴史

誕生

2006年、Mozillaで働いていたグレイドン・ホアレ[65]は現代のインターネット環境で高い並行性と高い安全性が求められるシステムプログラミング言語としてC言語C++に代わりうるプログラミング言語 Rust言語の開発に着手した[4]MozillaがRustの開発に関わりはじめたのは2009年で[66][2]、Rustは2010年のモジラ・サミットで公に姿を表した[67]。RustソースコードコンパイルするRustコンパイラは、初期の頃はOCaml言語で作られたコンパイラ(rustboot)が用いられていたが[68]、2010年にはRust言語自身でRustコンパイラを作るセルフホスティングへ移行したコンパイラ(rustc)の開発が始められ[69]、翌年にはブートストラップ問題を解決した最初の完動品が完成した[70]。この時よりRustコンパイラはコンパイル基盤にLLVMを用いたものとなった[71]

0.x版

プレアルファ(0.1版)と呼ばれる最初のバージョンは2012年1月にリリースされた[72]。Mozillaはこれを新しいモノ好みの人やプログラミング言語愛好家のためのアルファ版と位置づけていた。最初の安定版である1.0版がリリースされるまでの0.x版リリースでは、いくつもの大きな破壊的な仕様変更が言語およびライブラリに加えられた。

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

判定は、0.4版以前の従来の静的型付けに加えて、型状態システムをサポートしていた。型状態システムは、特別なcheck文を使用してプログラム文の前後での型決定をモデル化した。C言語やC++コードでのアサーションの場合と同様に、プログラム実行中ではなくコンパイル時に型不一致を検出する。型状態の概念はRust特有のものではなく、NILで採用されていたものである[75]。実際にはほとんど使用されていなかったため型状態は削除されたが、ブランディングパターンで同じ機能を実現できる[76]

オブジェクト指向のシステムは、0.2版から0.4版にかけて大きく変わっていった。0.2版で初めてクラス(class)が導入され、0.3版でインターフェース(interface)を通したデストラクタポリモーフィズムが追加され、0.4版で継承を提供する手段としてトレイト(trait)が追加された。インターフェースはトレイトに一部の機能が統合されて、異なる不要な機能として削除された。クラスもまた削除され、構造体とトレイトを使用したミックスインに置き換えられた。

コアのメモリモデルは、0.9版から0.11版の間、2つのビルトインのポインタ型(ヒープメモリ型~とガベージコレクション型@)を機能を単純化するために用意していた。それらは、標準ライブラリのBox型とGc型で置き換えられ、Gc型は最終的には削除された[77]

2014年1月、Dr. Dobb's Journalの編集長アンドリュー・ビンストックはD言語Go言語Nim言語と同様にC++の競争相手になる機会を得たとコメントした。ビンストックによると、Rustは非常にエレガントな言語として広く見られているが、バージョン間で繰り返し大きく変更されたため普及が遅れているという[78]

1.x版

2015年5月16日、安定版となるRust 1.0がリリースされた[79]。1.0版の後、安定版およびベータ版が6週間おきに定期リリースされている[80]。またナイトリー版が毎日リリースされている[81]。新たな機能はナイトリー版で開発が進められ、ベータ版で動作が検証されている[82]

2016年8月2日にリリースされたFirefox 48にはRustで書き直されたメディアパーサが組み込まれており、Mozillaが開発しているブラウザFirefoxにおいてRustで書かれたコードが書き加えられる初例となった[83][84]

2016年9月にRustはFedora 24の標準コンポーネントに加えられ、RPMパッケージ管理システムを用いてのインストール作業が容易化されている[85]

2018年版

2018年12月6日にバージョン1.31がリリースされた[86]。今回からエディション制が導入され、最新版は"Rust 2018"、従来版は"Rust 2015"と呼ばれることになる。言語機能への破壊的変更は新しいほうのエディションで行われるが、互換性を損なわない改良は引き続き両者に適用される。また、2015年版から2018年版へはcargo fixトランスコンパイルできる[86]

Rustで実装されたソフトウェア

RustコンパイラはRust自身で記述されている[69]

その他のRustを使って開発されているプロジェクト:

学習用参考図書など

  • Jim Blandy, Jason Orendorff:"Programming Rust: Fast, Safe Systems Development", O'Reilly Media, ISBN 978-1491927281,First Ed. (2017年12月21日)。
  • Abhishek Chanda:"Network Programming with Rust", Packt Publishing, ISBN 978-1788624893 (2018年2月28日)。
  • Steve Klabnik, Carol Nichols: "The Rust Programming Language", No Starch Press, ISBN 978-1593278281 (2018年6月26日)。
  • Jim Blandy, Jason Orendorff: 「プログラミングRust」、オライリージャパン 、ISBN 978-4873118550 (2018年8月10日)。
  • κeen, 河野 達也, 小松 礼人:「実践Rust入門[言語仕様から開発手法まで] 」、技術評論社(2019年5月8日)。
  • Steve Klabnik, Carol Nicholes:「プログラミング言語Rust 公式ガイド」、 KADOKAWA、ISBN 978-4048930703 (2019年6月28日)。
  • プログラミング言語 Rust, 2nd Edition
  • 酒井 和哉:「Rustプログラミング入門」、オーム社、ISBN 978-4-274-22435-5(2019年10月13日)

出典

  1. ^ 出典URL: https://blog.rust-lang.org/2024/10/17/Rust-1.82.0.html, 題名: Announcing Rust 1.82.0, 作品または名前の言語: 英語, 閲覧日: 2024年10月17日, 出版日: 2024年10月17日
  2. ^ a b c Mozilla Research. “Rust”. 2018年2月4日閲覧。
  3. ^ The Rust Language”. Lambda the Ultimate (2010年7月8日). 2010年10月30日閲覧。
  4. ^ a b Avram, Abel (2012年8月3日). “Interview on Rust, a Systems Programming Language Developed by Mozilla”. InfoQ. 2013年8月17日閲覧。 “GH: A lot of obvious good ideas, known and loved in other languages, haven't made it into widely used systems languages ... There were a lot of good competitors in the late 1970s and early 1980s in that space, and I wanted to revive some of their ideas and give them another go, on the theory that circumstances have changed: the internet is highly concurrent and highly security-conscious, so the design-tradeoffs that always favor C and C++ (for example) have been shifting.”
  5. ^ CやC++に代わると期待--安全な並行性とメモリーの安全性に焦点当てる「Rust」”. ZDNet Japan (2020年2月1日). 2020年2月2日閲覧。
  6. ^ Rust Project Developers. “The Rust Community · The Rust Programming Language”. 2018年2月4日閲覧。
  7. ^ Rust Project Developers. “rust-lang/rust: A safe, concurrent, practical language.”. github. 2018年2月4日閲覧。
  8. ^ a b Matsakis, Niko (2016年4月19日). “Introducing MIR”. 2016年10月4日閲覧。
  9. ^ a b Rust versus C gcc fastest programs”. 2018年8月22日閲覧。
  10. ^ a b Stack Overflow Developer Survey 2016 Results”. Stack Overflow. 2017年3月22日閲覧。
  11. ^ a b Stack Overflow Developer Survey 2017”. Stack Overflow. 2017年3月22日閲覧。
  12. ^ a b Stack Overflow Developer Survey 2018”. Stack Overflow. 2018年8月8日閲覧。
  13. ^ a b Stack Overflow Developer Survey 2019”. Stack Overflow. 2019年10月3日閲覧。
  14. ^ a b Matthias Endler (2017年9月15日). “Go vs Rust? Choose Go.”. 2018年1月28日閲覧。
  15. ^ a b Aaron Turon. “Rust's 2017 roadmap”. 2018年1月28日閲覧。
  16. ^ Internet archaeology: the definitive, end-all source for why Rust is named "Rust"”. 2020年5月10日閲覧。
  17. ^ Rust logo(type)”. Mozilla Foundation. 2020年5月10日閲覧。
  18. ^ The Rust Team · The Rust Programming Language”. Rust Project Developers. 2018年2月4日閲覧。
  19. ^ The Rust Programming Language”. github. 2018年2月4日閲覧。
  20. ^ Contributors to rust-lang/rust”. github. 28 January, 2018閲覧。
  21. ^ The Mozilla Manifesto”. 2012年4月9日閲覧。
  22. ^ rust-lang/rfcs: RFCs for changes to Rust”. github. 2018年2月4日閲覧。
  23. ^ rust-lang/rfcs: RFCs for changes to Rust”. 2018年1月28日閲覧。
  24. ^ Aaron Turon. “Refining Rust's RFCs”. 2018年1月28日閲覧。
  25. ^ bindgen 0.17.0 - Docs.rs”. Onur Aslan. 2018年2月4日閲覧。 “authors Jyun-Yan You”
  26. ^ Yamakaky (2016年7月22日). “merge into upstream! · Issue #21 · rust-lang-nursery/rust-bindgen”. github. 2018年2月4日閲覧。
  27. ^ rust-lang-nursery/rust-bindgen Automatically generates Rust FFI bindings to C (and some C++) libraries.”. 2018年2月4日閲覧。
  28. ^ rust/src/grammar/parser-lalr.y” (2017年5月23日). 28 January, 2018閲覧。
  29. ^ “Frequently Asked Questions · The Rust Programming Language - When should I use an implicit return?”. 2018年1月28日閲覧。
  30. ^ : higher-kinded polymorphism
  31. ^ Walton, Patrick (2010年10月1日). “Rust Features I: Type Inference”. 2011年1月21日閲覧。
  32. ^ : monomorphization
  33. ^ Aaron Turon (2015年5月11日). “Abstraction without overhead: traits in Rust - The Rust Programming Language Blog”. 2018年2月4日閲覧。
  34. ^ jemalloc is removed by default”. 2020年6月12日閲覧。
  35. ^ Rust Team. “Working with an unpublished minor version”. 2018年1月28日閲覧。
  36. ^ Rust project developers. “core- Rust”. 2018年1月28日閲覧。
  37. ^ Rust project developers. “std- Rust”. 2018年1月28日閲覧。
  38. ^ Brian Anderson (2017年5月5日). “The Rust Libz Blitz - The Rust Programming Language Blog”. 2018年2月4日閲覧。
  39. ^ The Rust Project Developers. “rand - Cargo: packages for Rust”. 2018年1月28日閲覧。
  40. ^ The Rust Project Developers. “regex - Cargo: packages for Rust”. 2018年1月28日閲覧。
  41. ^ Kang Seonghoon. “chrono - Cargo: packages for Rust”. 2018年1月28日閲覧。
  42. ^ The Rust Project Developers. “libc - Cargo: packages for Rust”. 2018年1月28日閲覧。
  43. ^ The Rust Project Developers. “log - Cargo: packages for Rust”. 2018年1月28日閲覧。
  44. ^ Blandy, Jim (2017). Programming Rust. O'Reilly Media, Inc. p. 285. ISBN 1491927283 
  45. ^ Brian Anderson (2016年5月13日). “Taking Rust everywhere with rustup”. 2018年1月28日閲覧。
  46. ^ Rust Platform Support · The Rust Programming Language”. 2018年2月4日閲覧。
  47. ^ Releases · rust-lang/cargo · GitHub”. 2019年4月14日閲覧。
  48. ^ Yehuda Katz (2016年5月5日). “Cargo: predictable dependency management - The Rust Programming Language Blog”. 2018年2月4日閲覧。
  49. ^ Alex Crichton (2014年11月20日). “Cargo: Rust's community crate host”. 2018年1月28日閲覧。
  50. ^ livioribeiro (2015年10月15日). “Cargo-readme: generate README.md from doc comments”. 2018年1月28日閲覧。
  51. ^ RustUp aka How to install rust the convenient way” (2016年6月2日). 2018年2月4日閲覧。
  52. ^ Brian Anderson (2016年5月13日). “Taking Rust everywhere with rustup - The Rust Programming Language Blog”. 2018年2月4日閲覧。
  53. ^ vanjacosic (2016年9月27日). “rust/getting-started.md at 1.13.0 · rust-lang/rust”. 2018年2月4日閲覧。
  54. ^ rust-lang-deprecated/rustup.sh: The rustup.sh script for installing Rust from release channels”. 2018年1月28日閲覧。
  55. ^ vanjacosic (2016年12月17日). “rust/getting-started.md at 1.14.0 · rust-lang/rust”. 2018年2月4日閲覧。
  56. ^ rust-lang-nursery/rustup.rs: The Rust toolchain installer”. 2018年1月28日閲覧。
  57. ^ Klabnik, Steve (2014年10月24日). “Interview with Steve Klabnik: How Rust Compares to Other Languages and More”. codementor. 2018年2月4日閲覧。 “Rust has a significant lack of resources because it’s so new, and so it’s much harder as a first language.”
  58. ^ book/references-and-borrowing.md at master · rust-lang/book” (2017年5月10日). 2018年2月4日閲覧。 “Many new users to Rust experience something we like to call ‘fighting with the borrow checker’”
  59. ^ Ivan Sagalaev (2016年11月2日). “Why Rust's ownership/borrowing is hard”. 2018年2月4日閲覧。
  60. ^ Aaron Turon. “Rust should have a lower learning curve”. 2018年1月28日閲覧。
  61. ^ Miscellany: C++ design goals in the context of Rust”. 2018年1月28日閲覧。
  62. ^ Frequently Asked Questions · The Rust Programming Language - How fast is Rust?”. 2018年1月28日閲覧。
  63. ^ Web Framework Benchmarks - Round 15 2018-02-14”. Framework Benchmarks Google Group. 2018年3月4日閲覧。
  64. ^ Web Framework Benchmarks - Round 15 2018-02-14”. Framework Benchmarks Google Group. 2018年3月4日閲覧。
  65. ^ : Graydon Hoare
  66. ^ Project FAQ” (2010年9月14日). 2012年1月11日閲覧。
  67. ^ 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.
  68. ^ rustlangの2017年3月12日のツイート2018年2月4日閲覧。
  69. ^ a b Hoare, Graydon (2010年10月2日). “Rust Progress”. 2013年10月22日時点のオリジナルよりアーカイブ。2010年10月30日閲覧。 “the second version of the compiler, written in Rust and compiled with the bootstrap compiler”
  70. ^ 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 :)
  71. ^ Chris Double (2011年3月31日). “A Quick Look at the Rust Programming Language”. 2018年2月4日閲覧。 “The rustc compiler lives in stage0/rustc. The output of this compiler is LLVM bytecode which must then be compiled using LLVM tools.”
  72. ^ 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日閲覧。
  73. ^ 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…
  74. ^ Commit dabccadd3202513ab0bcb424e2c62c90ab23062d” (2011年2月26日). 2012年1月11日閲覧。
  75. ^ Strom, Robert E.; Yemini, Shaula (1986). Typestate: A Programming Language Concept for Enhancing Software Reliability. IEEE Transactions on Software Engineering. ISSN 0098-5589. http://www.cs.cmu.edu/~aldrich/papers/classic/tse12-typestate.pdf 2010年11月14日閲覧。. 
  76. ^ Walton, Patrick (2012年12月26日). “Typestate Is Dead, Long Live Typestate!”. Pcwalton.github.com. 2018年9月5日閲覧。
  77. ^ Walton, Patrick (2013年1月2日). “Removing Garbage Collection From the Rust Language”. Pcwalton.github.com. 2018年9月5日閲覧。
  78. ^ Andrew Binstock. “The Rise And Fall of Languages in 2013”. 2018年9月5日閲覧。
  79. ^ The Rust Core Team (2015年5月15日). “Announcing Rust 1.0 - The Rust Programming Language Blog”. 2018年2月4日閲覧。
  80. ^ Alex Crichton (2014年10月27日). “rfcs/0507-release-channels.md at master · rust-lang/rfcs”. 2018年2月4日閲覧。
  81. ^ Aaron Turon (2014年10月30日). “Stability as a Deliverable - The Rust Programming Language Blog”. 2018年2月4日閲覧。
  82. ^ Scheduling the Trains”. 2017年1月1日閲覧。
  83. ^ Firefox リリースノート Firefox 48.0”. Mozilla Foundation (2016年8月2日). 2016年8月3日閲覧。
  84. ^ Firefox に組み込まれた Rust”. Mozilla Foundation (2016年8月2日). 2016年8月3日閲覧。
  85. ^ Rust meets Fedora”. fedoramagazine.org (2016年9月21日). 2016年10月6日閲覧。
  86. ^ a b Announcing Rust 1.31 and Rust 2018”. 2018年12月17日閲覧。
  87. ^ Dave Herman. “Shipping Rust in Firefox”. 2018年1月28日閲覧。
  88. ^ Serdar Yegulalp. “Mozilla's Rust-based Servo browser engine inches forward”. 2018年1月28日閲覧。
  89. ^ David Bryant. “A Quantum Leap for the Web”. 2018年1月28日閲覧。
  90. ^ Salim Alam. “Habitat at RustConf”. 2018年1月28日閲覧。
  91. ^ Salim Alam. “The Epic Story of Dropbox's Exodus From the Amazon Cloud Empire”. 2018年1月28日閲覧。
  92. ^ Serdar Yegulalp. “The Epic Story of Dropbox's Exodus From the Amazon Cloud Empire”. 2018年1月28日閲覧。
  93. ^ Steve Klabnik. “intermezzOS: a little OS”. 2018年1月28日閲覧。
  94. ^ Red Hat deprecates BTRFS, is Stratis the new ZFS-like hope?”. Marksei, Weekly sysadmin pills. 2018年1月28日閲覧。
  95. ^ “Building a Container Runtime in Rust”. (29 June 2017). https://blogs.oracle.com/developers/building-a-container-runtime-in-rust 8 July 2017閲覧. "Why Rust? (…) Rust sits at a perfect intersection of [C and Go]: it has memory safety and higher-level primitives, but doesn't sacrifice low level control over threading and therefore can handle namespaces properly." 
  96. ^ Valery Vavilov. “As Blockchain Changes The World, Bitfury’s New Platform Exonum is About to Change Blockchain”. 2018年1月28日閲覧。
  97. ^ Balbaert, Ivo. Rust Essentials. Packt Publishing. p. 6. ISBN 1785285769. https://books.google.com/books?id=TeiuCQAAQBAJ&pg=PA6&lpg=PA6&dq=OpenDNS+Rust&source=bl&ots=UL5thAAi8w&sig=Wf-Z5xSRYU-IXyGiyIl2FVEQWEc&hl=en&sa=X&ved=0ahUKEwizzdSk59LLAhVpnoMKHWdbDrQQ6AEINzAF#v=onepage&q=OpenDNS%20Rust&f=false 21 March 2016閲覧。 
  98. ^ Using HyperLogLog to Detect Malware Faster Than Ever”. OpenDNS Security Labs. 19 March 2016閲覧。
  99. ^ ZeroMQ: Helping us Block Malicious Domains in Real Time”. OpenDNS Security Labs. 19 March 2016閲覧。
  100. ^ Piston A modular game engine written in Rust”. Piston.rs. 2017年8月1日閲覧。
  101. ^ Joseph Birr-Pixton. “ctz/rustls: A modern TLS library in Rust”. 2018年2月4日閲覧。
  102. ^ Remacs:Re-Implementing Emacs In Rust”. phoronix.com (2017年1月11日). 2017年1月19日閲覧。
  103. ^ Pijul”. pijul.org. 8 July 2017閲覧。
  104. ^ Google. “xi-editor”. 2018年1月28日閲覧。
  105. ^ Andrew Gallant (2016年9月23日). “ripgrep is faster than {grep, ag, git grep, ucg, pt, sift}”. 2018年1月28日閲覧。
  106. ^ Xiph.Org Foundation. “rav1e: The fastest and safest AV1 encoder.”. 2018年5月1日閲覧。
  107. ^ Parity Technologies. “Parity’s Polkadot Dev Update #2”. 2018年12月5日閲覧。
  108. ^ mirakc: A Mirakurun-compatible PVR backend written in Rust”. 2020年8月10日閲覧。

外部リンク