「Rust (プログラミング言語)」の版間の差分
Hirotek654 (会話 | 投稿記録) Version 1.23リリース。 |
|||
(73人の利用者による、間の150版が非表示) | |||
1行目: | 1行目: | ||
{{Infobox programming language |
{{Infobox programming language |
||
| fetchwikidata = ALL |
|||
| onlysourced = false |
|||
| name = Rust |
| name = Rust |
||
| logo = [[File:Rust programming language black logo.svg|144px]] |
|||
| caption = |
|||
| paradigm = [[並列計算]]、[[関数型]]、[[オブジェクト指向]]、[[命令型プログラミング]]、[[構造化]]、[[静的型付け]] |
|||
| year = [[2010年]] |
|||
| designer = グレイドン・ホアレ |
|||
| developer = Rust Project Developers |
|||
| latest_release_version = 1.23<ref>{{cite web|title=Announcing Rust 1.23|url=https://blog.rust-lang.org/2018/01/04/Rust-1.23.html|website=blog.rust-lang.org|date= 2018/01/04|accessdate=2018/01/04}}</ref> |
|||
| latest_release_date = {{Start date and age|2018|01|04}} |
|||
| typing = [[静的型付け]]、[[強い型付け]]、[[型推論]]、構造化データ |
| typing = [[静的型付け]]、[[強い型付け]]、[[型推論]]、構造化データ |
||
| implementations = |
| implementations = rustc |
||
| |
| 登場時期 = {{Start date and age|2010|07|07}} |
||
| influenced_by = [[Alef]], [[C++]], [[Camlp4]], [[Common Lisp]], [[Erlang]], [[Haskell]], [[Hermes]], [[Limbo]], Napier, [[Napier88]], [[Newsqueak]], NIL, [[Sather]], [[Standard ML]] |
|||
| influenced = [[Swift (プログラミング言語)|Swift]] |
|||
| operating_system = [[FreeBSD]], [[Linux]], [[macOS]], [[Microsoft Windows|Windows]] |
|||
| license = [[MIT License|MIT]] |
|||
| file_ext = <code>.rs</code> <code>.rlib</code> |
|||
| website = [https://www.rust-lang.org/ rust-lang.org] |
|||
}} |
}} |
||
'''Rust'''(ラスト)は並列かつマルチパラダイムのプログラミング言語である。[[Mozilla Foundation|Mozilla]]によって開発されている<ref name="lamda">{{cite web|url=http://lambda-the-ultimate.org/node/4009|title=The Rust Language|first=Noel|date=2010-07-08|publisher=Lambda the Ultimate|accessdate=2010-10-30}}</ref>。[[関数型プログラミング]]、[[アクターモデル|並列アクターモデル]]、[[手続き型プログラミング]]、[[オブジェクト指向プログラミング]]をサポートする実用的な言語を目指している。 |
|||
'''Rust'''(ラスト)は、性能、[[メモリ安全性]]、安全な[[並行性]]を目指して設計された[[マルチパラダイムプログラミング言語|マルチパラダイム]]の[[プログラミング言語]]である。[[C言語]]、[[C++]]に代わる[[システムプログラミング言語]]を目指しており<ref name="infoq2012" />、構文的には[[C++]]に似ているが<ref>{{cite web |url=https://www.apriorit.com/dev-blog/520-rust-vs-c-comparison |title=Rust vs. C++ Comparison |access-date=20 November 2018 |archive-date=20 November 2018 |archive-url=https://web.archive.org/web/20181120221225/https://www.apriorit.com/dev-blog/520-rust-vs-c-comparison |url-status=live }}</ref>、「ボローチェッカー」(borrow checker) で参照の有効性を検証することによってメモリ安全性を保証できる。Rustは[[ガベージコレクション]]なしでのメモリ安全性を達成しており、必要な場面で[[参照カウント]]を使うこともできる<ref>{{cite web|title=Fearless Security: Memory Safety|url=https://hacks.mozilla.org/2019/01/fearless-security-memory-safety/|access-date=4 November 2020|archive-date=8 November 2020|archive-url=https://web.archive.org/web/20201108003116/https://hacks.mozilla.org/2019/01/fearless-security-memory-safety/|url-status=live}}</ref><ref>{{cite web|title=Rc<T>, the Reference Counted Smart Pointer|url=https://doc.rust-lang.org/book/ch15-04-rc.html|access-date=4 November 2020|archive-date=11 November 2020|archive-url=https://web.archive.org/web/20201111223851/https://doc.rust-lang.org/book/ch15-04-rc.html|url-status=live}}</ref> |
|||
== 概要 == |
|||
。 |
|||
主任開発者はグレイドン・ホアレ<ref>{{lang-en-short|Graydon Hoare}}</ref>である。彼は2006年にこの言語の開発に着手し、Mozillaが関わりはじめたのは2009年で<ref name="proj-faq">{{cite web|url=https://github.com/mozilla/rust/wiki/Doc-project-FAQ|title=Project FAQ|date=2010-09-14|accessdate=2012-01-11}}</ref>、2010年のモジラ・サミットで公に姿を表した<ref name="future-tense">{{cite web|url=http://www.slideshare.net/BrendanEich/future-tense-7782010|title=Future Tense|date=2011-04-29|accessdate=2012-02-06|quote={{lang|en|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.}}}}</ref>。初期のコンパイラーは[[OCaml]]言語で作られていたが、2010年にはコンパイラーをRust言語自身で作る作業が開始された<ref name="rust-in-rust">{{cite web|url=http://blog.mozilla.com/graydon/2010/10/02/rust-progress/|title=Rust Progress|last=Hoare|first=Graydon|date=2010-10-02|accessdate=2010-10-30}}</ref>。翌年には最初の完動品が作成された<ref name="rust-compiles-rust">{{cite web|url=https://mail.mozilla.org/pipermail/rust-dev/2011-April/000330.html|title=rust-dev] stage1/rustc builds|last=Hoare|first=Graydon|date=2011-04-20|accessdate=2011-04-20|quote={{lang|en|After that last change fixing the logging scope context bug, looks like stage1/rustc builds. Just shy of midnight :)}}}}</ref>。このコンパイラーは[[LLVM]]で構築された。 |
|||
Rustプロジェクトは[[オープンソース]]のコミュニティベース開発で進行しており<ref>{{citeweb|author=Rust Project Developers|url=https://www.rust-lang.org/en-US/community.html|title=The Rust Community · The Rust Programming Language|accessdate=2018-02-04}}</ref>、言語仕様(検討段階含む)、ソースコード、ドキュメントは[[オープンソースライセンス]]で公開されている<ref>{{citeweb|author=Rust Project Developers|url=https://www.rust-lang.org|title=rust-lang/rust: A safe, concurrent, practical language.|publisher=github|accessdate=2018-02-04}}</ref>。2006年の開発初期は、Mozillaの従業員のグレイドン・ホアレ(Graydon Hoare)<ref>{{Cite web|和書|title=CやC++に代わると期待--安全な並行性とメモリーの安全性に焦点当てる「Rust」|url=https://japan.zdnet.com/article/35148786/|website=ZDNet Japan|date=2020-02-01|accessdate=2020-02-02|language=ja}}</ref>の個人プロジェクトだったが、2009年に[[Mozilla]]が開発に関わり始めてMozilla Researchの公式プロジェクトとなった<ref name="mozilla-research-rust" /><ref name="lamda">{{cite web|url=http://lambda-the-ultimate.org/node/4009|title=The Rust Language|first=Noel|date=2010-07-08|publisher=Lambda the Ultimate|accessdate=2010-10-30}}</ref>。2015年に1.0版がリリースされるまでにいくつもの破壊的な仕様変更があったが、1.0版以降は基本的には[[後方互換]]を保って6週間間隔で定期的にリリースされている。 |
|||
Rustコンパイラーの第0.1版は2012年1月に完成している<ref name="rustc-0.1">{{cite web|url=http://www.reddit.com/r/programming/comments/opgxd/mozilla_and_the_rust_community_release_rust_01_a/|title=Mozilla and the Rust community release Rust 0.1 (a strongly-typed systems programming language with a focus on memory safety and concurrency)|author=catamorphism|date=2012-01-20|accessdate=2012-02-06}}</ref>。Mozillaはこれを新しいモノ好みの人やプログラミング言語愛好家のためのアルファ版と位置づけている。 |
|||
Rustは[[マルチパラダイムプログラミング言語]]であり、[[手続き型プログラミング]]、[[オブジェクト指向プログラミング]]、[[関数型プログラミング]]などの実装手法をサポートしている。基本的な制御構文は[[C言語]]に似ているが、その多くが[[式 (プログラミング)|式(expression)]]であるという点においては[[Standard ML|ML言語]]に似ている。コンパイル基盤に[[LLVM]]を用いており<ref name="MIR" />、実行時速度性能は[[C言語]]と同等程度である<ref name="benchmarksgame-rust" />。強力な型システムとリソース管理の仕組みにより、[[メモリ安全性]]が保証されている。 |
|||
Mozillaの理念を守り<ref name="moz-manifesto">{{cite web|url=http://www.mozilla.org/about/manifesto.en.html|title=The Mozilla Manifesto|accessdate=2012-04-09}}</ref>、Rust言語は社会に開かれており、開発者たちは利用者からの感想や提言を求めている。 |
|||
Rustは2016–2022年の間[[Stack Overflow]] Developer Surveyで「最も愛されているプログラミング言語」で一位を獲得し続けている<ref name="stackoverflow-mostloved" />。一方で、Rustは学習難易度が高い言語とも考えられており<ref name="go-vs-rust" />、2017年ロードマップでは学習曲線の改善を目的として挙げていた<ref name="roadmap-2017" />。 |
|||
Rust 1.0が日本時間の2015年5月16日にリリースされた<ref name="rust-blog">{{cite web|url=http://blog.rust-lang.org/2015/05/15/Rust-1.0.html|title=The Rust Programming Language Blog|accessdate=2015-5-15}}</ref>。 |
|||
Rustという名前は[[サビキン目|さび菌]]に因んで付けられた<ref name="reddit-archaeology">{{Cite web|url=https://www.reddit.com/r/rust/comments/27jvdt/internet_archaeology_the_definitive_endall_source/|title=Internet archaeology: the definitive, end-all source for why Rust is named "Rust"|accessdate=2020/05/10|publisher=}}</ref>。この命名の後、当時の開発チームメンバーの多くが自転車を愛好していたことから、自転車のチェーンリングの錆つきを元にしたデザインのロゴが考案された<ref>{{Cite web|url=https://bugzilla.mozilla.org/show_bug.cgi?id=680521|title=Rust logo(type)|accessdate=2020/05/10|publisher=Mozilla Foundation}}</ref>。当然、チェーンリングの錆がさび菌によって生じるわけがなく、「設計者のグレイドン・ホアレが生物学オタクであることから酸化鉄の「錆」ではなく「さび菌」なのだ」と、参考文献<ref name="reddit-archaeology" />の末尾に記されている。 |
|||
2016年8月2日にリリースされた[[Mozilla Firefox|Firefox 48]]にはRustで書き直されたメディアパーサが組み込まれており、Mozillaが開発している[[ウェブブラウザ|ブラウザ]]のFirefoxにおいてRustで書かれたコードが書き加えられる初例となった<ref name="Media_Parser">{{cite web|url=https://www.mozilla.jp/firefox/48.0/releasenotes/|title=Firefox リリースノート Firefox 48.0 |
|||
|publisher=[[Mozilla Foundation]]|date=2016-08-02|accessdate=2016-08-03}}</ref><ref name="First_codes_in_the_Firefox">{{cite web|url=https://dev.mozilla.jp/2016/07/shipping-rust-in-firefox/|title=Firefox に組み込まれた Rust|publisher=[[Mozilla Foundation]]|date=2016-08-02|accessdate=2016-08-03}}</ref>。 |
|||
== 開発体制 == |
|||
2016年9月にRustは[[Fedora|Fedora 24]]の標準コンポーネントに加えられ、[[RPM Package Manager|RPM]]の[[パッケージ管理システム]]を用いてのインストール作業が容易化されている<ref name="Fedora">{{cite web|url=https://fedoramagazine.org/rust-meets-fedora/|title=Rust meets Fedora|publisher=fedoramagazine.org|date=2016-09-21|accessdate=2016-10-06}}</ref>。 |
|||
Rustは[[オープンソース]]のコミュニティベースで開発が進められている。プロジェクトの主管はRust Project Developers(Rust開発チーム)である<ref>{{citeweb|url=https://www.rust-lang.org/en-US/team.html|title=The Rust Team · The Rust Programming Language|publisher=Rust Project Developers|accessdate=2018-02-04}}</ref>。2018年現在、言語発明者のグレイドン・ホアレはプロジェクトチームから外れている。プロジェクトの全ての[[ソースコード]]は[[GitHub]]で一般に公開されており<ref>{{citeweb|url=https://github.com/rust-lang|title=The Rust Programming Language|publisher=github|accessdate=2018-02-04}}</ref>、コミュニティメンバーの協力により改良が進められる。プロジェクトの大部分の[[コミット (バージョン管理)|コミット]]はコミュニティメンバーによるものである<ref>{{citeweb|title=Contributors to rust-lang/rust|url=https://github.com/rust-lang/rust/graphs/contributors|publisher=github|accessdate=28 January, 2018}}</ref>。 |
|||
Mozillaの理念<ref name="moz-manifesto">{{cite web|url=http://www.mozilla.org/about/manifesto.en.html|title=The Mozilla Manifesto|accessdate=2012-04-09}}</ref>を守り、Rust言語は社会に開かれており、言語やツールに対する仕様の提案はRFCの形で取りまとめられ<ref>{{citeweb|url=https://github.com/rust-lang/rfcs|title=rust-lang/rfcs: RFCs for changes to Rust|publisher=github|accessdate=2018-02-04}}</ref>、関連するチケットで仕様詳細について利用者から感想や提言を受けている<ref>{{citeweb|url=https://github.com/rust-lang/rfcs|title=rust-lang/rfcs: RFCs for changes to Rust|accessdate=2018-01-28}}</ref><ref>{{citeweb|author=Aaron Turon|url=https://aturon.github.io/blog/2016/07/05/rfc-refinement/|title=Refining Rust's RFCs|accessdate=2018-01-28}}</ref>。 |
|||
== 特徴 == |
|||
ネットワークを相手に動作する比較的大きな、サーバやクライアントプログラムを作成するのに都合が良い言語を目指したものである。結果として、安全性、メモリ管理、並列性が、この言語の目立った特徴となっている。性能はC++言語に匹敵するものになるはずである<ref name="cpp-design-goals">{{cite web|url=http://pcwalton.blogspot.com/2010/12/c-design-goals-in-context-of-rust.html|title=C++ Design Goals in the Context of Rust|last=Walton|first=Patrick|date=2010-12-05|accessdate=2011-01-21|quote={{lang|en|… 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 <code>auto_ptr</code> or the C++0x <code>unique_ptr</code>), and reference counting via <code>shared_ptr</code> 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…}}}}</ref>。 |
|||
言語やコアライブラリを開発するRust開発チームは[[Servo]]([[ウェブブラウザ]]用[[レンダリングエンジン|レイアウトエンジン]])やRustコンパイラの実装経験を通して言語を改良している。例えば、[[C言語]]とRustを連携させるコードを自動生成するbindgenは元々は外部開発者が開発していたが<ref>{{citeweb|author=|url=https://docs.rs/crate/bindgen/0.17.0|title=bindgen 0.17.0 - Docs.rs|quote=authors Jyun-Yan You|publisher=Onur Aslan|accessdate=2018-02-04}}</ref>、Mozilla Servo開発チームがServoの開発で利用するために[[C++]]とRustを連携させるコードも自動生成できるよう改良を重ね、現在はServo開発チームと密に連携しているRust開発チームに主管を移行して<ref>{{citeweb|author=Yamakaky|date=2016-07-22|url=https://github.com/rust-lang-nursery/rust-bindgen/issues/21|title=merge into upstream! · Issue #21 · rust-lang-nursery/rust-bindgen|publisher=github|accessdate=2018-02-04}}</ref>Servoの開発と共に改良が続けられている<ref>{{citeweb|url=https://github.com/rust-lang-nursery/rust-bindgen|title=rust-lang-nursery/rust-bindgen Automatically generates Rust FFI bindings to C (and some C++) libraries.|accessdate=2018-02-04}}</ref>。 |
|||
バージョン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> によって、コンパイルと実行時間の迅速化ならびに型チェックの正確性の実現が図られている。ブロックに中括弧を使うなど、構文は[[C言語]]風である。 |
|||
== 設計と特徴 == |
|||
制御構造には <code>if</code>, <code>else</code>, <code>do</code>, <code>while</code>, <code>for</code> などがある。以上のようにC言語風であるが、C言語のキーワードが全てあるわけではなく、一方で多方向分岐の <code>match</code> 文など、あまり馴染みがないキーワードもある<ref>「予約語」と「キーワード」を混同しないこと。詳しくは「[[予約語]]」の記事を参照。</ref>。 |
|||
[[File:Rust 101.webm|thumb|[[linux.conf.au]]で披露されたRustプログラミングで成功するために必要なキーコンセプトを紹介したプレゼンテーション]] |
|||
=== パラダイム === |
|||
構文は似ているが、[[プログラム意味論|意味論]](セマンティクス)では大きく異なる部分がある。 |
|||
言語実装手法においての[[プログラミングパラダイム]]は特定の実装手法に限定されない非純粋な[[マルチパラダイムプログラミング言語]]である。文法の表面的な記述は[[手続き型プログラミング]]、ブロックコードのまとまりの意味論は[[関数型言語|関数型プログラミング]]、型システムを用いたオブジェクト構造は[[オブジェクト指向プログラミング]]のパラダイム特性を持つ。特定の[[プログラミングパラダイム]]のみを使用して[[ソースコード]]を記述することはなく、要所々々の必要な所で必要なパラダイムを使用して[[ソースコード]]を記述することになる。 |
|||
このシステムの設計はメモリー・セーフであり、[[ヌルポインタ]]や不正なメモリ域を指すポインターは許容されていない。データの値は決まったフォームのみで初期化され、それらの全ての入力は既に初期化されている必要がある<ref name="lang-faq">{{cite web|url=https://github.com/mozilla/rust/wiki/Doc-language-FAQ|title=Doc language FAQ|date=2010-09-14|accessdate=2012-01-11}}</ref>。 |
|||
[[ソースコード]]をターゲットプラットフォームに最適化した[[オブジェクトファイル]]に[[コンパイル]]する[[コンパイル言語]]のパラダイム特性を持つ。多くの[[スクリプト言語]]が持つ[[インタプリタ]]機能や、[[Swift (プログラミング言語)|Swift]]や[[Go (プログラミング言語)|Go]]が提供するような[[REPL]]機能のパラダイム特性は持たない。 |
|||
この言語の型システムでは[[Haskell]]言語に倣い「型クラス」を用いることができる。これはアドホックな多相性を容易にするものであり、可変型宣言により実現されるものである。高類多相性<ref>{{lang-en-short|higher-kinded polymorphism}}</ref>など、Haskell言語にある他の特徴はサポートされていない。 |
|||
その他のパラダイムとして、関数の入出力パラメータに[[ジェネリック型]]を指定する[[ジェネリックプログラミング]]、非同期機能を実現する[[並行計算]]のパラダイム特性を持つ。 |
|||
Rust言語では予約語「<code>let</code>」で宣言された変数に対して型推論が行われる。これらの変数は型を決定するための値を必要としない。コード中のどこかでそれらの変数への値の代入<ref>{{lang-en-short|assign}}</ref>が失敗した場合にはコンパイル時エラーが発生する<ref name="type-inference">{{cite web|url=http://pcwalton.blogspot.com/2010/10/rust-features-i-type-inference.html|title=Rust Features I: Type Inference|last=Walton|first=Patrick|date=2010-10-01|accessdate=2011-01-21}}</ref>。型が明示された関数の引数に対しては型推論は行われない。 |
|||
=== 基礎文法 === |
|||
<source lang="rust"> |
|||
Rustの基礎的な文法は[[C言語]]や[[C++]]に似て、[[括弧#波括弧{}|波括弧]]で囲まれたブロックコード<code>{ ... }</code>、<code>if</code>, <code>else</code>, <code>while</code>などの[[制御構造|制御フロー]]キーワードを持つ。 |
|||
fn fib(n: u32) -> u32 { } |
|||
全ての[[C言語]]や[[C++]]のキーワードが実装されているわけではなく、一方で幾つかのRustの制御命令(例えばパターンマッチのための<code>match</code>)はそれらの言語を習得したプログラマにとっては馴染みが少ないものも存在する。Rustの命令文は、表面的な[[C言語]]や[[C++]]との文法の類似性にもかかわらず、[[プログラム意味論|意味論]]的には[[ML (プログラミング言語)|ML系言語]]の命令式に近く、関数本体のほぼ全ての部分は制御フロー演算子でさえ「[[文 (プログラミング)|文(statement)]]」ではなく「[[式 (プログラミング)|式(expression)]]」である<ref name="grammar_expr">{{cite web|url=https://github.com/rust-lang/rust/blob/5b13bff5203c1bdc6ac6dc87f69b5359a9503078/src/grammar/parser-lalr.y#L1309-L1573|title=rust/src/grammar/parser-lalr.y|date=2017-05-23|accessdate=28 January, 2018}}</ref>。例えば普通の<code>if</code>式も[[C言語]]で言う所の[[条件演算子]]であり、<code>if</code>式の結果として返り値を返す。 |
|||
</source> |
|||
ブロックコード内の命令文のセパレータにはセミコロン(<code>;</code>)を用いるが、[[C言語]]のそれと異なりRustのセミコロンは直前の命令文がブロックコードで括られる式の途中式であることを宣言するためのものである。セミコロンを末尾に置かない命令文はブロックコードの最終的な評価式として扱われ、その式の結果がブロックコードの外へ戻り値として返される<ref>{{citeweb|url=https://www.rust-lang.org/en-US/faq.html#when-should-i-use-an-implicit-return|title=“Frequently Asked Questions · The Rust Programming Language - When should I use an implicit return?|accessdate=2018-01-28}}</ref>。これは関数定義であれば、結果を返す箇所にはセミコロンをつけない。結果が不要ならばセミコロンによって明示的に捨てるのである。そして結果を返さないならば、それは文と呼ばれる。 |
|||
なおこれを以下のように、型を省いて記述することはできない。 |
|||
==== Hello World ==== |
|||
<source lang="rust"> |
|||
「Hello, world!」を[[標準出力]]に出力する[[Hello world]]プログラム。 |
|||
fn fib(n) -> { } |
|||
<syntaxhighlight lang="rust"> |
|||
</source> |
|||
並列性の機構は軽量タスクとして提供される。これと類似の仕組みは[[Erlang]]言語などの[[アクターモデル]]の言語にも見られるものである。それらのシステムにおいて、複数のタスク同士は直接にデータを共有するのではなく、メッセージ・パッシングによってデータのやり取りを行う。性能上の理由から、データのやり取りには固有の箱<ref>{{lang-en-short|unique box}}</ref>を使って行われ、データの複製はされない。それらの箱は所有者が一人であることが保証されたもので、送信タスクから受信タスクに向けて開放することができる。 |
|||
Rust言語が備えるオブジェクトシステムは、impl(実装)、trait([[トレイト]])、struct([[構造体]])を基本として構成される。implが他の言語におけるクラスに近い役割を果たし、継承と多相性はトレイトによって提供される。トレイトにはメソッドを定義することができ、実装によって[[ミックスイン]]される。structにはフィールドが定義可能で、traitとimplはそれ自身にはフィールドは定義できない。[[菱形継承問題]]を回避するためにtraitのみが継承が可能である。 |
|||
== プログラム例 == |
|||
以下のコードはRust 1.0.0 Alphaにおいて正しいプログラムである。文法や意味論は後の版で改変される可能性がある。 |
|||
=== [[Hello World]] === |
|||
<source lang="rust"> |
|||
fn main() { |
fn main() { |
||
println!(" |
println!("Hello, world!"); |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
=== 階乗 === |
==== 階乗 ==== |
||
階乗を求めるプログラム。 |
[[階乗]]を求めるプログラム。<code>if</code>式の結果として<code>1</code>もしくは<code>n * fac_recursive(n-1)</code>を返し、関数の結果として<code>if</code>式の結果を返す。 |
||
< |
<syntaxhighlight lang="rust"> |
||
/* return 文なしに暗黙に値を返すRust言語の機能を示す例である。 |
|||
関数型様式のプログラムを作成する際に、この特徴は便利である。 |
|||
C言語やC++言語とは異なり、Rust言語の if は文ではなく式である。 |
|||
そのため、返し値を伴わなければならない。 */ |
|||
fn fac_recursive(n: u32) -> u32 { |
fn fac_recursive(n: u32) -> u32 { |
||
if n <= 1 { |
if n <= 1 { |
||
87行目: | 60行目: | ||
n * fac_recursive(n-1) |
n * fac_recursive(n-1) |
||
} |
} |
||
}</ |
}</syntaxhighlight> |
||
=== 変数 === |
|||
<source lang="rust"> |
|||
[[変数 (プログラミング)|変数]]は<code>let</code>キーワードで定義され、'''不変'''([[イミュータブル]])である<ref>"by default variables are immutable." [https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html The Rust Programming Language]</ref>。変数への再代入はコンパイルエラーとなる<ref>"E0384. An immutable variable was reassigned." [https://doc.rust-lang.org/error-index.html#E0384 Rust Compiler Error Index]</ref>。 |
|||
fn fac_iterative(n: u32) -> u32 { |
|||
// 変数は予約語 mut で宣言することで可変になる。 |
|||
可変変数を扱いたい場合、変数宣言時に<code>mut</code>キーワードを利用して可変であることを明示しなければならない<ref>"you can make them mutable by adding <code>mut</code> in front of the variable name." [https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html The Rust Programming Language]</ref>。この機能は例えば巨大構造体のコピーを避けながら一部を変更するために有効活用できる。 |
|||
let mut result = 1; |
|||
for i in 2..n+1 { |
|||
またRustはシャドーイング(同名変数の複数回定義)に対応している<ref>"you can declare a new variable with the same name as a previous variable, and the new variable shadows the previous variable." [https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html The Rust Programming Language]</ref>。シャドーイングにより一時的な変数の変更や変数型の変更が可能になる<ref>"By using let, we can perform a few transformations on a value but have the variable be immutable after those transformations have been completed. ... The other difference between mut and shadowing is that because we’re effectively creating a new variable when we use the let keyword again, we can change the type of the value but reuse the same name." [https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html The Rust Programming Language]</ref>。 |
|||
result *= i; |
|||
変数とは別に<code>const</code>キーワードで定義される'''定数'''を持つ。定数は常に等しい値を持つ(<code>mut</code>やシャドーイングに対応していない)。 |
|||
=== 型とポリモーフィズム === |
|||
この言語の型システムでは[[Haskell]]言語に倣い「型クラス」を用いることができる。これはアドホックな[[多相性]]を容易にするものであり、可変型宣言により実現されるものである。高カインド多相性<ref>{{lang-en-short|higher-kinded polymorphism}}</ref>など、Haskell言語にある他の特徴はサポートされていない。 |
|||
==== 型システム ==== |
|||
Rust言語が備える[[型システム]]は、impl(実装)、trait([[トレイト]])、struct([[構造体]])およびenum([[列挙型]])を基本として構成される。implが他の言語における[[クラス (コンピュータ)|クラス]]に近い役割を果たし、[[継承 (プログラミング)|継承]]とポリモーフィズムはtraitによって提供される。traitには[[メソッド (計算機科学)|メソッド]]を定義することができ、traitで宣言された[[メソッド (計算機科学)|メソッド]]はimplによってstructへ[[ミックスイン]]される。structには[[インスタンス変数|フィールド]]が定義可能で、traitとimplはそれ自身には[[インスタンス変数|フィールド]]は定義できない。enumには複数種類の型のカテゴリ変数が定義可能で、数値型、文字列型、オブジェクト型などの複数の状態を選択的に持ちうる。[[菱形継承問題]]を回避するためにtraitのみが[[継承 (プログラミング)|継承]]が可能である。 |
|||
<!-- |
|||
Rust言語のtrait、struct、implを使った[[ミックスイン]]の実例: |
|||
<syntaxhighlight lang="rust"> |
|||
// トレイトToLabelStringの宣言 |
|||
trait ToLabelString { |
|||
fn to_label_string(self) -> String; |
|||
} |
|||
// 構造体Personの宣言 |
|||
struct Person { |
|||
name: String |
|||
} |
|||
// 構造体Personの実装 |
|||
impl Person { |
|||
fn name(&self) -> &str { |
|||
&self.name |
|||
} |
} |
||
} |
|||
return result; // 明示的な return 文。関数型の例と対照的。 |
|||
}</source> |
|||
// 構造体PersonへのトレイトToLabelStringの実装(ミックスイン) |
|||
impl ToLabelString for Person { |
|||
fn to_label_string(self) -> String { |
|||
self.name |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
--> |
|||
変数の型を決定する[[型システム]]は[[静的型付け]]かつ[[強い型付け]]である。[[型システム#静的な型付けと動的な型付け|静的型付けと動的型付け]]の区分においての型付けは、[[コンパイル]]時に全ての変数に対して型を決定する[[静的型付け]]を基本としているが、トレイトをポインタを介して利用することで、ダックタイピングに似た型付けが可能なトレイトオブジェクトが存在する。ほかに、Anyトレイトにて、実行時リフレクションを用いた動的型付けも可能である。[[型システム#強い型付けと弱い型付け|強い型付けと弱い型付け]]の区分においての型付けは、実行時に変数の型を[[型変換]](アップキャスト、ダウンキャスト、クロスキャスト)および[[ボックス化|ボクシング]]をすることを許さない強い型付けのみをサポートしている。[[C言語]]、[[Java]]は実行時に[[型変換]]をすることを許す弱い型付けをサポートしているが、Rust言語では変換先の型が明示されていない状況での[[型変換]]は認められていない。なお、型が確定している変数への代入や、シグネチャによりやはり型が確定している関数への引数渡しおよび返値の受け取り等に際しては、型強制のための関数が定義されていればそれを暗黙のうちに呼び出すことができる。<ref> |
|||
{{cite web |
|||
| url = https://doc.rust-lang.org/reference/type-coercions.html |
|||
| title = Type coercions |
|||
| website = The Rust Reference |
|||
| access-date = 27 March 2024 |
|||
}} |
|||
</ref> |
|||
==== 型推論 ==== |
|||
Rustコンパイラは変数への代入時(<code>variable = value</code>)、変数の型を値の型に基づき[[型推論]]する。[[変数 (プログラミング)|変数]]の宣言には必ずしも型を決定するための初期値を必要としない。[[変数 (プログラミング)|変数]]の宣言時に初期値が与えられた場合は「[[変数 (プログラミング)|変数]]の型」は「初期値の型」であると[[型推論]]がなされるが、初期値が与えられなかった場合は以降のブロックコード中のその変数へ値が初めて代入された時に「左辺の[[変数 (プログラミング)|変数]]の型」は「右辺の代入する値の型」であると[[型推論]]がなされる。変数への代入が型不一致により失敗した場合にはコンパイル時にエラーを検出する<ref name="type-inference">{{cite web|url=http://pcwalton.blogspot.com/2010/10/rust-features-i-type-inference.html|title=Rust Features I: Type Inference|last=Walton|first=Patrick|date=2010-10-01|accessdate=2011-01-21}}</ref>。 |
|||
<!-- |
|||
<syntaxhighlight lang="rust"> |
|||
let mut i; |
|||
i = 0u32; // ここで初めて変数iをu32型と決定 |
|||
i = 1u64; // ここは型不一致でエラー |
|||
</syntaxhighlight> |
|||
型が明示された関数の引数に対しては[[型推論]]は行われない。 |
|||
<syntaxhighlight lang="rust"> |
|||
fn fib(n: u32) -> u32 { } |
|||
</syntaxhighlight> |
|||
なおこれを以下のように、型を省いて記述することはできない。 |
|||
<syntaxhighlight lang="rust"> |
|||
fn fib(n) -> { } |
|||
</syntaxhighlight> |
|||
--> |
|||
==== ポリモーフィズムの実現 ==== |
|||
ポリモーフィズムを実現するため、[[構造体]]の[[インスタンス変数|フィールド]]および[[サブルーチン|関数]]の入出力値は特定の[[トレイト]]の実装をする[[総称型|ジェネリック型]]を指定することが出来る。そのような定義の中では、[[総称型|ジェネリック型]]で型が宣言された変数および入出力値はその[[トレイト]]の特性のみ使用できる。これはジェネリック関数が定義されるとすぐに型判定ができることを意味している。これは[[C++]]の[[ダック・タイピング]]で具体的な型が[[インスタンス|インスタンス化]]されるまで判定できない[[テンプレート (プログラミング)|テンプレート]]とは対照的である。しかし、Rustのジェネリクスの実装は[[C++]]の[[テンプレート (プログラミング)|テンプレート]]の典型的な実装と似ており、[[インスタンス|インスタンス化]]ごとにコードの個別のコピーが生成される。これは[[ポリモーフィズム|単相化]]<ref>{{lang-en-short| monomorphization}}</ref>と呼ばれ、[[Java]]や[[Haskell]]で通常使用される[[型消去]]方式とは対照的である。単相化の利点は特定のユースケースごとに最適化されたコードであり、欠点は結果のバイナリのコンパイル時間およびサイズが増加することである。Rustの[[トレイト]]を用いたポリモーフィズムの実現は、実行時のオーバーヘッドがない「ゼロコスト抽象化」と表現されている<ref>{{citeweb|author=Aaron Turon|url=https://blog.rust-lang.org/2015/05/11/traits.html|title=Abstraction without overhead: traits in Rust - The Rust Programming Language Blog|date=2015-05-11|accessdate=2018-02-04}}</ref>。 |
|||
=== リソース管理 === |
|||
[[システムプログラミング言語]]には効率良いリソース管理機能が必須である(例: [[主記憶装置|メモリ]]・[[ファイル記述子|ファイル]]管理)。[[C言語]]はプログラマがリソースを直接管理し高い効率を得られる反面、[[メモリリーク]]のようなバグ混入の危険性を孕んでいる。より高級な言語(例: [[Java]])では[[ガベージコレクション]]のような動的リソース管理機構により高い安全性を得られる反面、動的管理のオーバーヘッドが必ず付きまとう。 |
|||
Rustは所有権を軸とし[[RAII]]・[[Rust (プログラミング言語)#%E5%8F%82%E7%85%A7|参照]]・[[Rust (プログラミング言語)#%E3%83%9C%E3%83%AD%E3%83%BC%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC|借用チェッカー]]などを言語仕様として組み入れることで、リソース管理検証をコンパイル時・静的におこなう。ゆえに動的管理のオーバーヘッドを避けつつ、安全性が担保されたリソースアクセスが可能になっている(c.f. ゼロコスト抽象化)。 |
|||
以下はRustのリソース管理を支える個別の概念である。 |
|||
==== 所有権 ==== |
|||
'''所有権'''({{lang-en-short|Ownership}})はリソース管理の中心を成す重要な概念である。一つのリソースは一つの所有者(変数やブロック)のみに関連付けされるという制約がRust特有のリソース管理機能として存在する。これは、あるリソースの所有権はある所有者(owner)が持っている、のように表現される。同時に、リソースの所有権を複数の変数が持つことは出来ない。 |
|||
これは[[C++]]のスマートポインタの一種である<code>unique_ptr</code>の振る舞いに似ている。 |
|||
==== 参照 ==== |
|||
[[参照 (計算機科学)|'''参照''']]({{lang-en-short|Reference}})は「他者所有値の一時的な借り受け」を表現する値である<ref name="名前なし">"A reference represents a borrow of some owned value." [https://doc.rust-lang.org/std/primitive.reference.html ''Primitive Type reference'']. The Rust Standard Library. 2022-12-24閲覧.</ref>。すなわち参照とは、値の所有権を元の所有者に置いたまま作成される、値へのアクセス扉である<ref>"A ''reference'' ... to access the data stored at that address; that data is owned by some other variable." ''[https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html References and Borrowing]''. The Rust Programming Language. 2022-12-24閲覧.</ref>。参照を介して参照先の値を読み書きできる一方、参照を解放しても(所有権がないので)参照先の値は存在し続ける。参照は常に有効な参照先を指すと保証されている<ref>"A reference cannot outlive its referent" ''[https://doc.rust-lang.org/nomicon/references.html References]''. The Rustonomicon. 2022-12-24閲覧.</ref><ref>"A lifetime is said to “outlive” another one if its representative scope is as long or longer than the other." [https://doc.rust-lang.org/std/primitive.reference.html ''Primitive Type reference'']. The Rust Standard Library. 2022-12-24閲覧.</ref>。参照を得ることを'''借用'''({{lang-en-short|borrow}})という<ref name="名前なし"/>。 |
|||
参照はいくつかの問題を解決するためにRustへ導入された。まず値へのアクセスを所有者のみに限定した場合、所有者変数がブロック/関数の内外を引き回されて冗長になる<ref>"The issue ... we have to return the <code>String</code> to the calling function so we can still use ... . Instead, we can provide a reference" ''[https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html References and Borrowing]''. The Rust Programming Language. 2022-12-24閲覧.</ref>。値の所有権を有さずにアクセスを可能にする、扉・[[プロキシ]]・[[エイリアス]]のようなオブジェクトがあればこれは解決する。しかし単にアクセスオブジェクトを渡すとその有効範囲が不明なため[[ポインタ (プログラミング)#%E3%83%80%E3%83%B3%E3%82%B0%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF|ダングリング参照]]を起こしうる。これは参照と参照先の生存期間等を比較することで静的に検出できる([[Rust (プログラミング言語)#%E3%83%9C%E3%83%AD%E3%83%BC%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC|借用チェッカー]])。これにより参照は常に有効になり、[[ヌルポインタ|ヌル参照]]チェックも不要になる。このような背景で導入されたのがRustの参照である。 |
|||
参照に関する型・演算子・式が存在する。借用を表す[[式 (プログラミング)|式]]を借用式 <code>&expr</code>({{lang-en-short|borrow expression}})という<ref>"'''<sup>Syntax</sup>''' ''BorrowExpression''" ''[https://doc.rust-lang.org/reference/expressions/operator-expr.html#borrow-operators Operator expressions]''. The Rust Reference. 2022-12-24閲覧.</ref>。型・演算子は以下である。 |
|||
{| class="wikitable" |
|||
|+表. 参照に関する型と演算子 |
|||
!参照型({{lang-en-short|reference type}})<ref>"Primitive Type reference ... References, <code>&T</code> and <code>&mut T</code>." [https://doc.rust-lang.org/std/primitive.reference.html ''Primitive Type reference'']. The Rust Standard Library. 2022-12-24閲覧.</ref> |
|||
!借用演算子({{lang-en-short|borrow operator}})<ref>"Borrow operators" ''[https://doc.rust-lang.org/reference/expressions/operator-expr.html#borrow-operators Operator expressions]''. The Rust Reference. 2022-12-24閲覧.</ref> |
|||
|- |
|||
|共有参照型 <code>&T</code>({{lang-en-short|shared reference type}})<ref>"shared reference type is written <code>&type</code>" [https://doc.rust-lang.org/reference/types/pointer.html#shared-references- ''Pointer types'']. The Rust Reference. 2022-12-24閲覧.</ref> |
|||
|共有借用演算子 <code>&</code>({{lang-en-short|shared borrow operator}})<ref>"The <code>&</code> (shared borrow) ... operators" ''[https://doc.rust-lang.org/reference/expressions/operator-expr.html#borrow-operators Operator expressions]''. The Rust Reference. 2022-12-24閲覧.</ref> |
|||
|- |
|||
|可変参照型 <code>&mut T</code>({{lang-en-short|mutable reference type}})<ref>"A mutable reference type is written <code>&mut type</code>" ''[https://doc.rust-lang.org/reference/types/pointer.html#mutable-references-mut Pointer types]''. The Rust Reference. 2022-12-24閲覧.</ref> |
|||
|可変借用演算子 <code>&mut</code>({{lang-en-short|mutable borrow operator}})<ref>"<code>&mut</code> (mutable borrow) operators" ''[https://doc.rust-lang.org/reference/expressions/operator-expr.html#borrow-operators Operator expressions]''. The Rust Reference. 2022-12-24閲覧.</ref> |
|||
|} |
|||
すなわち、演算子 <code>&</code> を用いた式 <code>&expr</code> の評価により型 <code>&T</code> の値が得られる。<code>&mut</code> でも同様である。 |
|||
共有参照型は参照先の読み取りのみが可能で書き換えができないが、値が不変であるため同じ値を指す複数の共有参照が生成できる<ref>"When a shared reference to a value is created, it prevents direct mutation of the value." [https://doc.rust-lang.org/reference/types/pointer.html#shared-references- ''Pointer types'']. The Rust Reference. 2022-12-24閲覧.</ref>。参照は<code>Copy</code> トレイトによりムーブでなくコピーで渡される<ref>"The following traits are implemented for all <code>&T</code>, regardless of the type of its referent: <code>Copy</code>" [https://doc.rust-lang.org/std/primitive.reference.html ''Primitive Type reference'']. The Rust Standard Library. 2022-12-24閲覧.</ref>。可変参照型は両方が可能であるが、値が可変であるため同じ値を指す他の参照が生成できない<ref>"if you have a mutable reference to a value, you can have no other references to that value." ''[https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html References and Borrowing]''. The Rust Programming Language. 2022-12-24閲覧.</ref>。ゆえに参照は <code>Copy</code> トレイトを持たずコピーでなくムーブで渡される<ref>"<code>&mut T</code> references get all of the above except <code>Copy</code> and <code>Clone</code> (to prevent creating multiple simultaneous mutable borrows)" [https://doc.rust-lang.org/std/primitive.reference.html ''Primitive Type reference'']. The Rust Standard Library. 2022-12-24閲覧.</ref>。 |
|||
==== ボローチェッカー ==== |
|||
既に解放されたリソースを指し続ける参照はバグを引き起こす(例: [[ポインタ (プログラミング)#%E3%83%80%E3%83%B3%E3%82%B0%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF|ダングリングポインタ]])。もし静的にこれを検証できれば、オーバーヘッド無しに安全性を担保できる。また検証により不正な参照を避けられるため参照への[[ヌルポインタ|ヌル代入]]が不要となり、[[ヌルポインタ]]チェックを不要にできる。 |
|||
Rustでは'''借用チェッカー'''({{lang-en-short|borrow checker}}、'''ボローチェッカー''')により所有権の競合および不正利用を静的に検証する。所有権が解放されたリソースを指す参照は無効であり、使用した場合はコンパイルエラーとなる。ボローチェッカーは参照についてもライフタイム(lifetimes)としてリソースの生存期間を検証する。これにより[[ヌルポインタ]]や[[ポインタ (プログラミング)#%E3%83%80%E3%83%B3%E3%82%B0%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF|ダングリングポインタ]]、[[競合状態|リソース利用競合]]を制限した[[メモリ安全性]]を実現している。 |
|||
==== 特異なリソース型 ==== |
|||
リソースのメモリ確保は基本的にはスタックメモリを利用しており、ヒープメモリを利用したメモリ確保は<code>Box</code>や<code>Vec</code>などの特定の型のみで限定的に利用されている。 |
|||
コンパイル時に型のサイズが決定できない可変長配列を表すような型はヒープメモリを利用する<code>Box</code>型を使用してリソースを管理する。<code>Box</code>リソース自体はスタックメモリで管理されるが、<code>Box</code>リソースが所有権を持つ実体のリソースはヒープメモリで管理される。標準のヒープメモリ確保にはシステムアロケータを利用するが<ref>{{Cite web|url=https://blog.rust-lang.org/2019/01/17/Rust-1.32.0.html#jemalloc-is-removed-by-default|title=jemalloc is removed by default|accessdate=2020-06-12|publisher=}}</ref>、対象プラットフォームやビルド時の指定により他のメモリ確保APIを利用することもある。ヒープメモリはスタックメモリに比べて速度性能が落ちるため、必要時にのみ限定的に利用されている。 |
|||
==== 境界チェック ==== |
|||
Rustは実行時に[[メモリ安全性#%E5%A2%83%E7%95%8C%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF|境界チェック]]をおこなう。これにより[[バッファオーバーラン]]をはじめとしたメモリアクセスに対する安全性を得ている。この機能はゼロコスト抽象化でなく実行時の命令であるため、安全性と引き換えにいくらかの性能オーバーヘッドが発生している。他の[[システムプログラミング言語]]として代表的な[[C言語]]や[[C++]]は境界チェックを強制しないため、Rustの特徴の1つとなっている。 |
|||
==== ライフタイム ==== |
|||
'''ライフタイム'''({{lang-en-short|Lifetime}})はジェネリック型の一種で、リソースやそれらへの参照の生存期間を表す。<ref> |
|||
{{cite web |
|||
| url = https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html |
|||
| title = Validating References with Lifetimes |
|||
| website = The Rust Programming Language |
|||
| access-date = 02 January 2024 |
|||
}} |
|||
</ref> |
|||
参照を関数やメソッドとの間で受け渡ししたり、構造体や列挙型など別のデータ型に保存すると、参照の生存期間が参照を定義したスコープだけでは決まらなくなる。この場合、参照や参照先リソースに対してライフタイムの付加が必要となる。ライフタイムは<code>'lifetime</code>の形式で記述する。ライフタイムを参照型に付加する場合は<code>&</code>の直後、それ以外の型に対してはジェネリック型として付加する。この他、別のジェネリック型に対してライフタイムを付加することもできる。特に、あるライフタイムに対して別のライフタイムを境界条件として与え、どちらか片方がもう片方よりも長く生存することを要求することができる。<ref> |
|||
{{cite web |
|||
| url = https://doc.rust-lang.org/stable/reference/trait-bounds.html |
|||
| title = Trait and lifetime bounds |
|||
| website = The Rust Reference |
|||
| access-date = 02 January 2024 |
|||
}} |
|||
</ref> |
|||
ボローチェッカーはライフタイムを持つ変数に対し、その変数が指す参照先やリソースの生存期間がライフタイムにより要求される生存期間を満たしているかどうかをチェックする。チェックに失敗した場合はコンパイルエラーとする。注意すべき点として、ライフタイムを与えることにより参照先やリソースの生存期間を延長することはできない。それらの生存期間はあくまでそれらを定義および使用するスコープによって決まるため、ライフタイムのチェックでエラーが出た場合は参照先の生存期間を修正する必要がある。 |
|||
関数やメソッドの定義にあっては、付加すべきライフタイムに、ある特定のパターンが存在することが知られている。そのようなパターンの通りにライフタイムを指定したい場合は、ライフタイムの手動付加を省略し、コンパイラにライフタイムを自動付加させることができる。この機能は'''ライフタイムエリゾン'''({{lang-en-short|lifetime elision}})<ref> |
|||
{{cite web |
|||
| url = https://doc.rust-lang.org/stable/reference/trait-bounds.html |
|||
| title = Trait and lifetime bounds |
|||
| website = The Rust Reference |
|||
| access-date = 02 January 2024 |
|||
}} |
|||
</ref>と呼ばれる。ライフタイムエリゾンのパターン以外のライフタイムが必要な場合はライフタイムエリゾンは使用できず、ライフタイムを明示的に付加しなければならない。 |
|||
関数の型を定義する際、その引数や返値が参照を含む場合はしばしばライフタイムが必要となるが、そのライフタイムが指し示す生存期間が関数の型だけでは決められず、その型に含まれる関数やクロージャを実際に定義しないと生存期間も決まらないことがある。このような場合、関数の型にて用いるライフタイムを、関数型としては任意の生存期間を持って構わないと定めることができる。そのようなライフタイムは'''高階トレイト境界'''({{lang-en-short|higher-rank trait bound}}、HRTB)<ref> |
|||
{{cite web |
|||
| url = https://doc.rust-lang.org/nomicon/hrtb.html |
|||
| title = Higher-Rank Trait Bounds (HRTBs) |
|||
| website = The Rustonomicon |
|||
| access-date = 02 January 2024 |
|||
}} |
|||
</ref>として定義する。HRTBを用いて定義した関数型は単一の型ではなく、ライフタイムが取り得る限りの[[場合の数]]だけある型の集まりとなり、理論上「関数の集まり」になることに由来している。 |
|||
==== 移動 ==== |
|||
Rustの特徴として、変数をメモリ上で自由に移動することができる。<ref> |
|||
{{cite web |
|||
| url = https://doc.rust-lang.org/std/pin/ |
|||
| title = Module std::pin |
|||
| website = The Rust Standard Library |
|||
| access-date = 02 January 2024 |
|||
| quote = By default, all types in Rust are movable. Rust allows passing all types by-value, ... |
|||
}} |
|||
</ref> これにより、関数やメソッド呼び出しでの変数受け渡しを値により行うことができる。また、それらの操作や代入等における所有権の移動もこの特徴に依存している。 |
|||
<code>Box<T></code>型(<code>T</code>は型、以下同様)のようなスマートポインタ、および<code>Vec<T></code>型のように可変長データを指すポインタの場合、ポインタが指しているデータは通常は移動しないが、ポインタそのものは移動する。すなわち、ポインタの値を受け渡しする挙動となる。 |
|||
変数の移動を防止したい場合は、一般には<code>Pin<P></code>型(<code>P</code>はトレイト<code>Pointer<T></code>を持つ型、典型的にはスマートポインタ)を使用する。この型は<code>Box<T></code>型や<code>&mut T</code>型の取得を禁止しており、これにより<code>Pin<P></code>型が指すデータの移動を防ぐ。なお、<code>Pin<P></code>型から<code>Pin<&mut T></code>型を得ることは可能で、これを用いてデータの移動を防ぎつつ変更することは可能である。また、<code>Pin<P></code>型そのものを値受け渡しなどにより移動することもできる。 |
|||
Rustにて変数の移動を防ぐ必要がある状況としては、主に以下がある。 |
|||
* 構造体型にて、自身ないしはそのフィールドへのポインタを持つ。<ref> |
|||
{{cite web |
|||
| url = https://doc.rust-lang.org/std/pin/#example-self-referential-struct |
|||
| title = Module std::pin, Example: self-referential struct |
|||
| website = The Rust Standard Library |
|||
| access-date = 02 January 2024 |
|||
}} |
|||
</ref> |
|||
* 変数のアドレスをRustの外のライブラリなどへ渡す。 |
|||
=== ライブラリ === |
|||
Rustのライブラリはクレート(crate)という呼称で提供される。多くのクレートは[https://crates.io crates.io]で公開されている。同サイトはバージョン毎のソースコードをアーカイブとして提供している。クレートは必ずしもcrates.ioに登録されている必要はなく、[[Webサーバ]]や[[ファイルシステム]]を指す[[Uniform Resource Identifier|URI]]で指定することもできる<ref>{{citeweb|author=Rust Team|url=https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#working-with-an-unpublished-minor-version|title=Working with an unpublished minor version|accessdate=2018-01-28}}</ref>。ライブラリはソースコードプロジェクトで配布されることが一般的だが、コンパイルしたバイナリライブラリファイルで出力することも可能である。<ref>{{Cite web | url = https://rustc-dev-guide.rust-lang.org/backend/libs-and-metadata.html | title = Libraries and Metadata | website = Rust Compiler Development Guide | access-date = 2024-12-11}}</ref>スタティックライブラリ(拡張子<code>rlib</code>)およびダイナミックライブラリ(拡張子はプラットフォームに依存)をサポートしている。いずれの形式にあっても、コンパイルされたオブジェクトコードが含まれる。スタティックライブラリではこれに加えてコンパイラのバックエンドがサポートする[[中間表現]]での出力を含めることも可能であり<ref>{{Cite web | url = https://github.com/rust-lang/rust/pull/71323 | title = Add -Cbitcode-in-rlib. #71323 | author = Nicholas Nethercote | website = GitHub | access-date = 2024-12-11}}</ref>、{{仮リンク|Link-Time Optimization|en|Interprocedural optimization#WPO_and_LTO}}にてこれを利用することができる。 |
|||
==== コアライブラリ ==== |
|||
コアライブラリはcoreの名称で提供されている<ref>{{citeweb|author=Rust project developers|url=https://doc.rust-lang.org/core/|title=core- Rust|accessdate=2018-01-28}}</ref>。このライブラリは標準ライブラリに依存しない基幹ライブラリであり、一切の上位ライブラリ、システムライブラリ、libcライブラリにリンクしていない。コアライブラリは最小限であり、ヒープ割り当てを認識せず並行性や入出力も提供していない。それらのことはプラットフォームへの調整が必要であり、このライブラリはプラットフォームに依存しない。 |
|||
==== 標準ライブラリ ==== |
|||
標準ライブラリはstdの名称で提供されている<ref>{{citeweb|author=Rust project developers|url=https://doc.rust-lang.org/std/|title=std- Rust|accessdate=2018-01-28}}</ref>。このライブラリは基礎的な型(Vec<T>やOption<T>)、言語の基本の処理、標準のマクロ、入出力(I/O)、マルチスレッドなどの機能を提供する。標準ライブラリは標準でリンクしてソフトウェアがビルドされるが、より根幹的なソフトウェアやリソースの小さい組み込み環境ではリンクを外してソフトウェアをビルドすることができる。 |
|||
==== 外部ライブラリ ==== |
|||
Rustは基本的で汎用的な機能を含め標準ライブラリではなく外部ライブラリとして提供している。これはいわゆる「バッテリー同梱 (“Battery Included”)」の反対を行くもので、言語と共に更新することで保守的になりがちな標準ライブラリではなく、言語とは独立して更新することで最善を繰り返し探求しうる外部ライブラリとすることで、それらの機能をより良い品質で提供する考えに基づいていたものである<ref>{{citeweb|author=Brian Anderson|url=https://blog.rust-lang.org/2017/05/05/libz-blitz.html|title=The Rust Libz Blitz - The Rust Programming Language Blog|date=2017-05-05|accessdate=2018-02-04}}</ref>。外部ライブラリの利便性と品質の保証のために[https://crates.io crates.io]と[https://rust-lang-nursery.github.io/api-guidelines/ APIガイドライン]を提供している。 |
|||
言語開発のコミュニティがそれらについて携わっていないわけではなく、基礎的な外部ライブラリはコミュニティ配下で開発が進められている。 |
|||
* 基礎的なライブラリ |
|||
** rand - [[擬似乱数|乱数]]生成<ref>{{citeweb|author=The Rust Project Developers|url=https://crates.io/crates/rand|title=rand - Cargo: packages for Rust|accessdate=2018-01-28}}</ref> |
|||
** regex - [[正規表現]]<ref>{{citeweb|author=The Rust Project Developers|url=https://crates.io/crates/regex|title=regex - Cargo: packages for Rust|accessdate=2018-01-28}}</ref> |
|||
** chrono - [[時刻]]操作<ref>{{citeweb|author=Kang Seonghoon|url=https://crates.io/crates/chrono|title=chrono - Cargo: packages for Rust|accessdate=2018-01-28}}</ref> |
|||
** libc - [[C言語]]インターフェース<ref>{{citeweb|author=The Rust Project Developers|url=https://crates.io/crates/libc|title=libc - Cargo: packages for Rust|accessdate=2018-01-28}}</ref> |
|||
** log - [[データログ|ログ]]出力インターフェース<ref>{{citeweb|author=The Rust Project Developers|url=https://crates.io/crates/log|title=log - Cargo: packages for Rust|accessdate=2018-01-28}}</ref> |
|||
== 開発ツール == |
|||
Rustの開発ツールは独立したソフトウェアとして提供されているが、Rustの公式なインストール方法に従えば、以下のツール一式が手に入る。 |
|||
=== 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 (オペレーティングシステム)|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つのTier(ティア)に分かれている<ref name="rust-platform-support">{{citeweb|url=https://forge.rust-lang.org/platform-support.html|title=Rust Platform Support · The Rust Programming Language|accessdate=2018-02-04}}</ref>。Tier 1はバイナリリリースが提供されており、{{仮リンク|自動ビルド|en|Build automation}}と[[テスト自動化|自動テスト]]が整備され、それらが安定して成功(パス)することが保証されている。 |
|||
Tier 2はバイナリリリースが提供されており、自動ビルドと自動テストは整備されているがテストが成功することは保証されていない。Tier 3は[[ソースコード]]としては対応しているが、自動ビルドと自動テストの動作が保証されておらず、公式リリースは提供されていない。 |
|||
[[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> によって、コンパイルと実行時間の迅速化ならびに型チェックの正確性の実現が図られている。 |
|||
=== Cargo === |
|||
{{Infobox Software |
|||
| 名称 = Cargo |
|||
| スクリーンショット = [[ファイル:Rustc_building_paru_with_cargo_screenshot.png|250px]] |
|||
| 開発元 = |
|||
| 初版 = |
|||
| 最新版 = 1.79.0 |
|||
| 最新版発表日 = {{Start date and age|2024|06|13}}<ref>{{Cite web|title=Releases · rust-lang/cargo · GitHub|url=https://github.com/rust-lang/rust/releases/tag/1.79.0}}</ref> |
|||
| リポジトリ = {{URL|https://github.com/rust-lang/cargo}} |
|||
| プログラミング言語 = Rust |
|||
| 対応OS = |
|||
| サポート状況 = <!-- 開発中 --> |
|||
| 種別 = [[ビルド (ソフトウェア)|ビルドツール]]、[[パッケージ管理システム]] |
|||
| ライセンス = <!-- [[MIT License]] --> |
|||
| 公式サイト = {{URL|https://doc.rust-lang.org/stable/cargo/}} |
|||
}} |
|||
CargoはRust製ソフトウェアプロジェクトのCUIのビルドツールである。規定のファイル構成(ディレクトリ、設定ファイル、ソースファイル)のプロジェクトディレクトリで利用される。プロジェクトのビルド(コンパイル)、依存ライブラリのダウンロード、テスト、ドキュメント生成などをサポートする<ref>{{citeweb|author=Yehuda Katz|url=https://blog.rust-lang.org/2016/05/05/cargo-pillars.html|title=Cargo: predictable dependency management - The Rust Programming Language Blog|date=2016-05-05|accessdate=2018-02-04}}</ref>。通常はCargoを中心に開発を行えるように設計されているため、rustcコンパイラを直接呼び出すことは稀である。Cargoの依存ライブラリのダウンロード先は[https://crates.io/ crates.io]である<ref>{{citeweb|author=Alex Crichton|url=https://blog.rust-lang.org/2014/11/20/Cargo.html|title=Cargo: Rust's community crate host|date=2014-11-20|accessdate=2018-01-28}}</ref>。 |
|||
サブコマンドは拡張可能で標準のコマンドの他、README.mdファイルの自動生成コマンド<ref>{{citeweb|author=livioribeiro|url=https://users.rust-lang.org/t/cargo-readme-generate-readme-md-from-doc-comments/3306|title=Cargo-readme: generate README.md from doc comments|date=2015-10-15|accessdate=2018-01-28}}</ref>などの拡張コマンドが存在する。この拡張はcargo-xxxと名付けたコマンドを適切にインストールするだけで、cargoにxxxというサブコマンドを追加できる。 |
|||
=== rustup === |
|||
{{Infobox Software |
|||
| 名称 = rustup |
|||
| 開発元 = Rust Project Developers |
|||
| 初版 = {{Start date and age|2016|4|15}} |
|||
| 最新版 = 1.24.3 |
|||
| 最新版発表日 = {{Start date and age|2021|05|31}} |
|||
| リポジトリ = https://github.com/rust-lang/rustup/ |
|||
| プログラミング言語 = Rust |
|||
| 対応OS = Windows, Linux, macOS |
|||
| 対応プラットフォーム = |
|||
| 対応言語 = |
|||
| サポート状況 = |
|||
| 種別 = |
|||
| ライセンス = |
|||
| 公式サイト = https://www.rustup.rs |
|||
}} |
|||
rustupは[[ツールチェーン]]の管理ソフトウェアである。[[ツールチェーン]]のダウンロードとインストール、ソフトウェアバージョンの管理、コンパイルターゲットの切り替えの機能を提供する<ref>{{citeweb|author=|url=http://www.shadercat.com/rustup-aka-how-to-install-rust-the-convenient-way/|title=RustUp aka How to install rust the convenient way|date=2016-06-02|accessdate=2018-02-04}}</ref><ref>{{citeweb|author=Brian Anderson|url=https://blog.rust-lang.org/2016/05/13/rustup.html|title=Taking Rust everywhere with rustup - The Rust Programming Language Blog|date=2016-05-13|accessdate=2018-02-04}}</ref>。 |
|||
==== 機能 ==== |
|||
rustupはRustプロジェクトがリリースしている[[コンパイラ]](rustc)、[[ビルドツール]](Cargo)などの[[ツールチェーン]]をインターネットを経由してホストマシンにダウンロード、インストールおよびマネージメントする機能を提供する。インストール対象の[[ツールチェーン]]のバージョンは、安定版、ベータ版、[[デイリービルド|ナイトリー]]版の全てを含んでおり、利用者が必要とするバージョンを指定してダウンロードすることができる。また、ターゲットプラットフォームについても全ての種類を含んでおり、ホストマシンと異なるプラットフォーム(例えば、ホストが[[macOS]]であっても[[Microsoft Windows|Windows]]や[[Android (オペレーティングシステム)|Android]]、[[iOS]])のコンパイラをインストールすることができる。この場合、コンパイラは[[クロスコンパイラ]]として動作してターゲットプラットフォームに合わせたビルドを実施する。 |
|||
==== 歴史 ==== |
|||
Rust 1.13版以前は[[シェルスクリプト]]で実装された<code>rustup.sh</code>が公開されていた<ref>{{citeweb|author=vanjacosic|url=https://github.com/rust-lang/rust/blob/1.13.0/src/doc/book/getting-started.md#installing-on-linux-or-mac|title=rust/getting-started.md at 1.13.0 · rust-lang/rust|date=2016-09-27|accessdate=2018-02-04}}</ref>。これと並行してRust言語で実装された同等機能を提供する<code>rustup.rs</code>の開発が進められており、Rust 1.14版で<code>rustup.sh</code>は非推奨となり<ref>{{citeweb|url=https://github.com/rust-lang-deprecated/rustup.sh|title=rust-lang-deprecated/rustup.sh: The rustup.sh script for installing Rust from release channels|accessdate=2018-01-28}}</ref>、Rust 1.14版以降は<code>rustup.rs</code>が公式リリースとして提供されている<ref>{{citeweb|author=vanjacosic|url=https://github.com/rust-lang/rust/blob/1.14.0/src/doc/book/getting-started.md#installing-rust-1|title=rust/getting-started.md at 1.14.0 · rust-lang/rust|date=2016-12-17|accessdate=2018-02-04}}</ref><ref>{{citeweb|url=https://github.com/rust-lang-nursery/rustup.rs|title=rust-lang-nursery/rustup.rs: The Rust toolchain installer|accessdate=2018-01-28}}</ref>。 |
|||
== 評価 == |
|||
Rustは2016〜2022年に渡って[[Stack Overflow]] Developer Surveyで「最も愛されているプログラミング言語」で一位を獲得し続け<ref name="stackoverflow-mostloved">{{Cite web|url=https://survey.stackoverflow.co/2022/#technology-most-loved-dreaded-and-wanted|title=Stack Overflow Developer Survey 2022|website=Stack Overflow|access-date=2022-07-10}}</ref>、プログラマの好意的な評価は多い。 |
|||
一方で、Rustは学習難易度が高い言語とも考えられている<ref>{{citeweb|first=Steve|last=Klabnik|date=2014-10-24|url=https://www.codementor.io/steveklabnik/interview-with-steve-klabnik-how-rust-compares-to-other-languages-and-more-8t5ut6nau|title=Interview with Steve Klabnik: How Rust Compares to Other Languages and More|publisher=codementor|quote=Rust has a significant lack of resources because it’s so new, and so it’s much harder as a first language.|accessdate=2018-02-04}}</ref>。多くのRust初学者のプログラマにおいて、自身が正しいと思って書いたソースコードのコンパイルに対してコンパイラ(ボローチェッカー)がエラーを検出する、「ボローチェッカーとの戦い」(fighting with the borrow checker)が発生しがちである<ref>{{citeweb|url=https://github.com/rust-lang/book/blob/master/first-edition/src/references-and-borrowing.md#meta|title=book/references-and-borrowing.md at master · rust-lang/book|quote=Many new users to Rust experience something we like to call ‘fighting with the borrow checker’|date=2017-05-10|accessdate=2018-02-04}}</ref><ref>{{citeweb|author=Ivan Sagalaev|url=https://news.ycombinator.com/item?id=11093389|title=Why Rust's ownership/borrowing is hard|date=2016-11-02|accessdate=2018-02-04}}</ref>。小さなアプリケーションの実装について同時期に言語開発されている[[Go (プログラミング言語)|Go言語]]と比較した場合、Rust言語より[[Go (プログラミング言語)|Go言語]]の方が開発効率が良いという評価がある<ref name="go-vs-rust">{{citeweb|author=Matthias Endler|url=https://matthias-endler.de/2017/go-vs-rust/|title=Go vs Rust? Choose Go.|date=2017-09-15|accessdate=2018-01-28}}</ref>。学習難易度の高さは開発チームも認識しており、2017年ロードマップでは学習曲線の改善を目的として挙げていた<ref name="roadmap-2017">{{citeweb|author=Aaron Turon|url=https://blog.rust-lang.org/2017/02/06/roadmap.html|title=Rust's 2017 roadmap|accessdate=2018-01-28}}</ref><ref>{{citeweb|author=Aaron Turon|url=https://github.com/rust-lang/rust-roadmap/issues/3|title=Rust should have a lower learning curve|accessdate=2018-01-28}}</ref>。 |
|||
この問題を改善するために、2020年現在において、自動化をメインテーマにした開発を続けており、前述にあるcargo、rustup等のツール以外にも、rustfmt、clippy、cargo docなどのツール類をIDE環境のみならずCUI環境でも利用可能な状態へと整備を続けている。また、後方互換性を維持しているため、crates.ioを用いる事でライブラリ類などの生産性の向上にも努めている。 |
|||
Rustの実行時速度性能は同じくコンパイラに[[LLVM]]を利用している場合の[[C言語]]と同等程度であり<ref>{{citeweb|url=https://pcwalton.blogspot.com/2010/12/c-design-goals-in-context-of-rust.html|title=Miscellany: C++ design goals in the context of Rust|accessdate=2018-01-28}}</ref><ref>{{citeweb|url=https://www.rust-lang.org/en-US/faq.html#how-fast-is-rust|title=Frequently Asked Questions · The Rust Programming Language - How fast is Rust?|accessdate=2018-01-28}}</ref>、一部の処理では[[C言語]]を上回った速度が確認されている<ref name="benchmarksgame-rust">{{citeweb|url=https://benchmarksgame-team.pages.debian.net/benchmarksgame/faster/rust.html|title=Rust versus C gcc fastest programs| Computer Language Benchmarks Game|accessdate=2018-08-22}}</ref>。2018年2月時点で、[[Webサーバ|ウェブサーバ]]アプリケーションの汎用処理では速度性能の良いRust製ライブラリは開発が進んでいない<ref>{{citeweb|publisher=Framework Benchmarks Google Group|url=https://www.techempower.com/benchmarks/#section=data-r15&hw=ph&test=json|title=Web Framework Benchmarks - Round 15 2018-02-14|accessdate=2018-03-04}}</ref>。単純なテキスト処理では速度性能は良い<ref>{{citeweb|publisher=Framework Benchmarks Google Group|url=https://www.techempower.com/benchmarks/#section=data-r15&hw=ph&test=text|title=Web Framework Benchmarks - Round 15 2018-02-14|accessdate=2018-03-04}}</ref>。 |
|||
その後のベンチマークでは、並行処理やグラフィックス処理においても、JavaやGoを上回っており、コンパイラの出力するコードの優秀性が証明されている。ただし、サポートされていないグラフィックスボード(Cのライブラリをインクルードしなければならない)では、C/C++の実効性能には及んでいない。{{要出典|date=2022年11月|title=その後のベンチマークが何を指すのか不明}} |
|||
== 歴史 == |
|||
=== 誕生 === |
|||
2006年、[[Mozilla]]で働いていたグレイドン・ホアレ<ref>{{lang-en-short|Graydon Hoare}}</ref>は現代のインターネット環境で高い並行性と高い安全性が求められる[[システムプログラミング言語]]として[[C言語]]や[[C++]]に代わりうる[[プログラミング言語]] Rust言語の開発に着手した<ref name="infoq2012">{{cite web|url=http://www.infoq.com/news/2012/08/Interview-Rust|title=Interview on Rust, a Systems Programming Language Developed by Mozilla|last=Avram|first=Abel|date=2012-08-03|accessdate=2013-08-17|publisher=InfoQ|quote='''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.}}</ref>。[[Mozilla]]がRustの開発に関わりはじめたのは2009年で<ref name="proj-faq">{{cite web|url=https://github.com/mozilla/rust/wiki/Doc-project-FAQ|title=Project FAQ|date=2010-09-14|accessdate=2012-01-11}}</ref><ref name="mozilla-research-rust">{{citeweb|author=Mozilla Research|url=https://research.mozilla.org/rust/|title=Rust|accessdate=2018-02-04}}</ref>、Rustは2010年のモジラ・サミットで公に姿を表した<ref name="future-tense">{{cite web|url=http://www.slideshare.net/BrendanEich/future-tense-7782010|title=Future Tense|date=2011-04-29|accessdate=2012-02-06|quote={{lang|en|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.}}}}</ref>。Rust[[ソースコード]]を[[コンパイル]]するRust[[コンパイラ]]は、初期の頃は[[OCaml]]言語で作られたコンパイラ(rustboot)が用いられていたが<ref>{{twitter status2|rustlang|840985601629405185|2017年3月12日|accessdate=2018-02-04}}</ref>、2010年にはRust言語自身でRustコンパイラを作る[[セルフホスティング]]へ移行したコンパイラ(rustc)の開発が始められ<ref name="rust-in-rust">{{cite web|url=http://blog.mozilla.com/graydon/2010/10/02/rust-progress/|title=Rust Progress|last=Hoare|first=Graydon|date=2010-10-02|quote=the second version of the compiler, written in Rust and compiled with the bootstrap compiler|accessdate=2010-10-30|archiveurl=https://web.archive.org/web/20131022063015/https://blog.mozilla.org/graydon/2010/10/02/rust-progress/|archivedate=2013-10-22}}</ref>、翌年には[[ブートストラップ問題]]を解決した最初の完動品が完成した<ref name="rust-compiles-rust">{{cite web|url=https://mail.mozilla.org/pipermail/rust-dev/2011-April/000330.html|title=rust-dev] stage1/rustc builds|last=Hoare|first=Graydon|date=2011-04-20|accessdate=2011-04-20|quote={{lang|en|After that last change fixing the logging scope context bug, looks like stage1/rustc builds. Just shy of midnight :)}}}}</ref>。この時よりRustコンパイラはコンパイル基盤に[[LLVM]]を用いたものとなった<ref>{{citeweb|author=Chris Double|url=https://bluishcoder.co.nz/2011/03/31/a-quick-look-at-the-rust-programming-language.html|title=A Quick Look at the Rust Programming Language|quote=The rustc compiler lives in stage0/rustc. The output of this compiler is LLVM bytecode which must then be compiled using LLVM tools.|date=2011-03-31|accessdate=2018-02-04}}</ref>。 |
|||
=== 0.x版 === |
|||
プレアルファ(0.1版)と呼ばれる最初のバージョンは2012年1月にリリースされた<ref name="rustc-0.1">{{cite web|url=http://www.reddit.com/r/programming/comments/opgxd/mozilla_and_the_rust_community_release_rust_01_a/|title=Mozilla and the Rust community release Rust 0.1 (a strongly-typed systems programming language with a focus on memory safety and concurrency)|author=catamorphism|date=2012-01-20|accessdate=2012-02-06}}</ref>。Mozillaはこれを新しいモノ好みの人やプログラミング言語愛好家のためのアルファ版と位置づけていた。最初の安定版である1.0版がリリースされるまでの0.x版リリースでは、いくつもの大きな破壊的な仕様変更が言語およびライブラリに加えられた。 |
|||
変数名や関数名など識別子は、この言語の開発の初期の頃は、[[ASCII]]文字以外の文字を使うことが禁じられていた。言語についてのある質疑応答の中で、現場の非英語圏のプログラマーのほとんどが識別子には[[ASCII]]文字を使っていると述べられていた。しかしその制限は反論を引き出すことになった<ref name="ascii-lexeme-criticism">{{cite web|url=http://broadcast.oreilly.com/2010/08/vale-java-scala-vala-palava.html#comment-3572710|title=Vale Java? Scala Vala palava|last=Jelliffe|first=Rick|date=2010-11-08|accessdate=2012-03-29|quote={{lang|en|… 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…}}}}</ref>。それにより、2011年2月に言語に変更が行われ、この制限は削除された<ref name="ascii-lexeme-update">{{cite web|url=https://github.com/mozilla/rust/commit/dabccadd3202513ab0bcb424e2c62c90ab23062d|title=Commit dabccadd3202513ab0bcb424e2c62c90ab23062d|date=2011-02-26|accessdate=2012-01-11}}</ref>。 |
|||
[[データ型|型]]判定は、0.4版以前の従来の[[静的型付け]]に加えて、型状態システムをサポートしていた。型状態システムは、特別な<code>check</code>文を使用してプログラム文の前後での型決定をモデル化した。C言語やC++コードでのアサーションの場合と同様に、プログラム実行中ではなくコンパイル時に型不一致を検出する。型状態の概念はRust特有のものではなく、[[NIL (プログラミング言語)|NIL]]で採用されていたものである<ref name="typestate">{{cite journal |last1= Strom |first1= Robert E. |last2 = Yemini |first2= Shaula |url=https://www.cs.cmu.edu/~aldrich/papers/classic/tse12-typestate.pdf|title=Typestate: A Programming Language Concept for Enhancing Software Reliability|year=1986|publisher=IEEE Transactions on Software Engineering|issn=0098-5589|accessdate=2010-11-14}}</ref>。実際にはほとんど使用されていなかったため型状態は削除されたが、ブランディングパターンで同じ機能を実現できる<ref name="branding-patterns">{{cite web|last=Walton |first=Patrick |url=https://pcwalton.github.io/2012/12/26/typestate-is-dead.html |title=Typestate Is Dead, Long Live Typestate! |website=Pcwalton.github.com |date=2012-12-26 |accessdate=2018-09-05}}</ref>。 |
|||
[[オブジェクト指向]]のシステムは、0.2版から0.4版にかけて大きく変わっていった。0.2版で初めて[[クラス (コンピュータ)|クラス]](class)が導入され、0.3版で[[ソフトウェアインタフェース|インターフェース]](interface)を通した[[デストラクタ]]と[[ポリモーフィズム]]が追加され、0.4版で[[継承 (プログラミング)|継承]]を提供する手段として[[トレイト]](trait)が追加された。インターフェースはトレイトに一部の機能が統合されて、異なる不要な機能として削除された。クラスもまた削除され、構造体とトレイトを使用した[[Mixin|ミックスイン]]に置き換えられた。 |
|||
コアの[[メモリモデル (プログラミング)|メモリモデル]]は、0.9版から0.11版の間、2つのビルトインの[[ポインタ (プログラミング)|ポインタ]]型(ヒープメモリ型<code>~</code>とガベージコレクション型<code>@</code>)を機能を単純化するために用意していた。それらは、標準ライブラリの<code>Box</code>型と<code>Gc</code>型で置き換えられ、<code>Gc</code>型は最終的には削除された<ref name="removing-garbage-collection">{{cite web|last=Walton |first=Patrick |url=https://pcwalton.github.io/2013/06/02/removing-garbage-collection-from-the-rust-language.html |title=Removing Garbage Collection From the Rust Language |website=Pcwalton.github.com |date=2013-01-02 |accessdate=2018-09-05}}</ref>。 |
|||
2014年1月、[[Dr. Dobb's Journal]]の編集長アンドリュー・ビンストックは[[D言語]]や[[Go (プログラミング言語)|Go言語]]、[[Nim|Nim言語]]と同様に[[C++]]の競争相手になる機会を得たとコメントした。ビンストックによると、Rustは非常にエレガントな言語として広く見られているが、バージョン間で繰り返し大きく変更されたため普及が遅れているという<ref>{{citeweb|author=Andrew Binstock|url=https://www.drdobbs.com/jvm/the-rise-and-fall-of-languages-in-2013/240165192|title=The Rise And Fall of Languages in 2013|accessdate=2018-09-05}}</ref>。 |
|||
=== 1.x版 === |
|||
2015年5月16日、安定版となるRust 1.0がリリースされた<ref name="rust-blog">{{cite web|author=The Rust Core Team|url=http://blog.rust-lang.org/2015/05/15/Rust-1.0.html|title=Announcing Rust 1.0 - The Rust Programming Language Blog|date=2015-5-15|accessdate=2018-02-04}}</ref>。1.0版の後、安定版およびベータ版が6週間おきに定期リリースされている<ref>{{citeweb|author=Alex Crichton|url=https://github.com/rust-lang/rfcs/blob/master/text/0507-release-channels.md|title=rfcs/0507-release-channels.md at master · rust-lang/rfcs|date=2014-10-27|accessdate=2018-02-04}}</ref>。また[[デイリービルド|ナイトリー]]版が毎日リリースされている<ref>{{citeweb|author=Aaron Turon|author2=Niko Matsakis|url=https://blog.rust-lang.org/2014/10/30/Stability.html|title=Stability as a Deliverable - The Rust Programming Language Blog|date=2014-10-30|accessdate=2018-02-04}}</ref>。新たな機能は[[デイリービルド|ナイトリー]]版で開発が進められ、ベータ版で動作が検証されている<ref name="Scheduling the Trains">{{cite web |title= Scheduling the Trains| url=https://blog.rust-lang.org/2014/12/12/1.0-Timeline.html| accessdate=2017-01-01}}</ref>。 |
|||
2016年8月2日にリリースされた[[Mozilla Firefox|Firefox 48]]にはRustで書き直されたメディアパーサが組み込まれており、Mozillaが開発している[[ウェブブラウザ|ブラウザ]]の[[Firefox]]においてRustで書かれたコードが書き加えられる初例となった<ref name="Media_Parser">{{Cite web|和書|url=https://www.mozilla.jp/firefox/48.0/releasenotes/|title=Firefox リリースノート Firefox 48.0 |
|||
|publisher=[[Mozilla Foundation]]|date=2016-08-02|accessdate=2016-08-03}}</ref><ref name="First_codes_in_the_Firefox">{{Cite web|和書|url=https://dev.mozilla.jp/2016/07/shipping-rust-in-firefox/|title=Firefox に組み込まれた Rust|publisher=[[Mozilla Foundation]]|date=2016-08-02|accessdate=2016-08-03}}</ref>。 |
|||
2016年9月にRustは[[Fedora|Fedora 24]]の標準コンポーネントに加えられ、[[RPM Package Manager|RPM]]の[[パッケージ管理システム]]を用いてのインストール作業が容易化されている<ref name="Fedora">{{cite web|url=https://fedoramagazine.org/rust-meets-fedora/|title=Rust meets Fedora|publisher=fedoramagazine.org|date=2016-09-21|accessdate=2016-10-06}}</ref>。 |
|||
=== 2018年版 === |
|||
2018年12月6日にバージョン1.31がリリースされた<ref name="rust_org_1_31">{{Cite web|url=https://blog.rust-lang.org/2018/12/06/Rust-1.31-and-rust-2018.html|title=Announcing Rust 1.31 and Rust 2018|accessdate=2018-12-17}}</ref>。今回からエディション制が導入され、最新版は"Rust 2018"、従来版は"Rust 2015"と呼ばれることになる。言語機能への破壊的変更は新しいエディションのみに適用されるが、互換性に影響しない機能追加は引き続き両者に適用される。また、2015年版から2018年版へは<code>cargo fix</code>で[[トランスコンパイル]]できる<ref name="rust_org_1_31" />。 |
|||
=== 2021年版 === |
|||
2021年5月11日に、3年ぶりの改訂となる2021年版について公式 Blogへ記載が行われた<ref>{{Cite web|title=The Plan for the Rust 2021 Edition {{!}} Rust Blog|url=https://blog.rust-lang.org/2021/05/11/edition-2021.html|website=blog.rust-lang.org|accessdate=2021-09-19|language=en}}</ref>。当該機能は、2021年10月21日にリリースの1.56より適用される。今回の主要な改訂は、例外処理への対応が強化され、prelude文にTryIntoやTryFrom、FromIteratorなどが追加される。詳細については、公式Blogを参照されたいが、後方互換性を維持しているため、2018年版との間では特に問題なくコンパイルできる。 |
|||
== Rustで実装されたソフトウェア == |
|||
RustコンパイラはRust自身で記述されている<ref name="rust-in-rust"/>。 |
|||
その他のRustを使って開発されているプロジェクト: |
|||
* ウェブブラウザ |
|||
** [[Mozilla Firefox]]<ref>{{citeweb|author=Dave Herman|url=https://hacks.mozilla.org/2016/07/shipping-rust-in-firefox/|title=Shipping Rust in Firefox|accessdate=2018-01-28}}</ref> |
|||
*** [[Servo]] – [[HTMLレンダリングエンジン]]<ref>{{citeweb|author=Serdar Yegulalp|url=https://www.infoworld.com/article/2905688/applications/mozillas-rust-based-servo-browser-engine-inches-forward.html|title=Mozilla's Rust-based Servo browser engine inches forward|accessdate=2018-01-28}}</ref> |
|||
*** Quantum – ウェブエンジン<ref>{{citeweb|author=David Bryant|url=https://medium.com/mozilla-tech/a-quantum-leap-for-the-web-a3b7174b3c12|title=A Quantum Leap for the Web|accessdate=2018-01-28}}</ref> |
|||
** [[Chromium]]<ref>{{cite web |url = https://security.googleblog.com/2023/01/supporting-use-of-rust-in-chromium.html |title = Supporting the Use of Rust in the Chromium Project |last1 = Jansens |first1 = Dana |author2 = Chrome Security Team |date = 2023-01-12 |website = Google Online Security Blog |access-date = 2024-05-29}}</ref><ref> |
|||
{{cite web |url = https://developers-jp.googleblog.com/2023/02/supporting-use-of-rust-in-chromium.html |title = Chromium プロジェクトが Rust の利用をサポート |last1 = Jansens |first1 = Dana |author2 = Chrome Security Team |date = 2023-02-16 |website = Google Developers Japan |access-date = 2024-05-29}}</ref> サードパーティー製クレートを使用。 |
|||
* ビルドツール |
|||
** Cargo – Rustの[[ビルド (ソフトウェア)|ビルドツール]] |
|||
** Habitat – {{仮リンク|チェフソフトウェア|en|Chef (software)}}の開発する[[ソフトウェアデプロイメント]]ツール<ref>{{citeweb|author=Salim Alam|url=https://blog.chef.io/2016/09/23/habitat-at-rustconf/|title=Habitat at RustConf|accessdate=2018-01-28}}</ref> |
|||
* [[オペレーティングシステム|OS]] |
|||
** Magic Pocket – [[Dropbox]]の[[ペタバイト]]を管理する機器の[[ファイルシステム]]<ref>{{citeweb|author=Salim Alam|url=https://www.wired.com/2016/03/epic-story-dropboxs-exodus-amazon-cloud-empire/|title=The Epic Story of Dropbox's Exodus From the Amazon Cloud Empire | WIRED|accessdate=2018-01-28}}</ref> |
|||
** [[Redox (オペレーティングシステム)|Redox]] – [[マイクロカーネル]][[オペレーティングシステム]]<ref>{{citeweb|author=Serdar Yegulalp|url=https://www.infoworld.com/article/3046100/open-source-tools/rusts-redox-os-could-show-linux-a-few-new-tricks.html|title=The Epic Story of Dropbox's Exodus From the Amazon Cloud Empire | WIRED|accessdate=2018-01-28}}</ref> |
|||
** intermezzOS – システムプログラミングの試験的な[[オペレーティングシステム]]<ref>{{citeweb|author=Steve Klabnik|url=https://intermezzos.github.io|title=intermezzOS: a little OS|accessdate=2018-01-28}}</ref> |
|||
** Stratis – [[Fedora]] 28で予定される[[ファイルシステム]] <ref>{{cite web| url=https://www.marksei.com/red-hat-deprecates-btrfs-stratis/|title=Red Hat deprecates BTRFS, is Stratis the new ZFS-like hope? | work = Marksei, Weekly sysadmin pills|accessdate=2018-01-28}}</ref> |
|||
** Railcar – [[オラクル (企業)|Oracle]]の[[仮想化]]マシン<ref name="railcar">{{cite news|title=Building a Container Runtime in Rust|url=https://blogs.oracle.com/developers/building-a-container-runtime-in-rust|accessdate=8 July 2017|date=29 June 2017|quote=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.}}</ref> |
|||
** [[Android (オペレーティングシステム)|Android]] - 2021年からRustを採用している<ref>{{Cite web|和書|url=https://japan.zdnet.com/article/35196972/|title=グーグル、Rust採用で「Android」のメモリーに関わる脆弱性が激減|accessdate=2022-12-06|publisher=ZDNet Japan}}</ref>。 |
|||
** [[Linux]] - バージョン6.1から一部の機能にRustが組み込まれると予定されている<ref>{{Cite web|和書|url=https://japan.zdnet.com/article/35193491/|title=「Linux」、バージョン6.1でRustを導入へ--トーバルズ氏が明言|accessdate=2022-10-18|publisher=ZDNET}}</ref>。 |
|||
** [[KataOS]] - [[RISC-V]]で動作する組み込みシステム向けに[[Google]]が開発したOS<ref>{{Cite web|和書|url=https://japan.cnet.com/article/35194751/|title=グーグル、Rustで書かれたセキュアなOS「KataOS」を発表|accessdate=2022-10-18|publisher=CNET Japan}}</ref>。 |
|||
** [[Microsoft Windows|Windows]] - 2019年から[[Windows 10]]のコンポーネントの一部をRustに置き換えている<ref>{{Cite web|和書|url=https://news.mynavi.jp/techplus/article/20191205-933334/|title=Microsoft、Windows 10の一部をRustへ書き換えてセキュリティ強化狙う |accessdate=2022-12-07|publisher=マイナビ}}</ref>。 |
|||
* その他 |
|||
** Exonum – [[ブロックチェーン]]のオープンソースフレームワーク<ref>{{citeweb|author=Valery Vavilov|url=https://medium.com/@valeryvavilov/as-blockchain-changes-the-world-bitfurys-new-platform-exonum-is-about-to-change-blockchain-cc13963f8501|title=As Blockchain Changes The World, Bitfury’s New Platform Exonum is About to Change Blockchain|accessdate=2018-01-28}}</ref> |
|||
** [[OpenDNS]] – ソリューションの内の2つのコンポーネント<ref>{{cite book|last1=Balbaert|first1=Ivo|title=Rust Essentials|publisher=Packt Publishing|isbn=1785285769|page=6|url=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|accessdate=21 March 2016}}</ref><ref>{{cite web|last1=Frank|first1=Denis|title=Using HyperLogLog to Detect Malware Faster Than Ever|url=https://labs.opendns.com/2013/12/05/hyperloglog-and-malware-detection/|website=OpenDNS Security Labs|accessdate=19 March 2016}}</ref><ref>{{cite web|last1=Denis|first1=Frank|title=ZeroMQ: Helping us Block Malicious Domains in Real Time |url=https://labs.opendns.com/2013/10/04/zeromq-helping-us-block-malicious-domains/|website=OpenDNS Security Labs|accessdate=19 March 2016}}</ref> |
|||
** Piston – [[ゲームエンジン]]<ref>{{cite web |title=Piston A modular game engine written in Rust |url=http://www.piston.rs/ |work=Piston.rs |accessdate=2017-08-01}}</ref> |
|||
** rustls – [[Transport Layer Security|TLS]]のRust実装<ref>{{citeweb|author=Joseph Birr-Pixton|url=https://github.com/ctz/rustls|title=ctz/rustls: A modern TLS library in Rust|accessdate=2018-02-04}}</ref> |
|||
** REmacs – [[Emacs]]のRust実装 <ref>{{cite web|last1=Larabel|first1=Michael|url=https://www.phoronix.com/scan.php?page=news_item&px=Remacs-Rust-Emacs |title=Remacs:Re-Implementing Emacs In Rust|website=phoronix.com|date=2017-01-11|accessdate=2017-01-19}}</ref> |
|||
** Pijul – [[Darcs]]を参考にした[[バージョン管理システム]]<ref>{{cite web|title=Pijul|url=https://pijul.org/|website=pijul.org|accessdate=8 July 2017}}</ref> |
|||
** Xi – [[Google Open Source]]で開発されている[[テキストエディタ]]<ref>{{citeweb|author=Google|url=https://opensource.google.com/projects/xi-editor|title=xi-editor|accessdate=2018-01-28}}</ref> |
|||
** ripgrep – [[grep]]に相当する高速なテキスト検索ツール<ref>{{citeweb|author=Andrew Gallant|url=https://blog.burntsushi.net/ripgrep/|title=ripgrep is faster than {grep, ag, git grep, ucg, pt, sift}|date=2016-09-23|accessdate=2018-01-28}}</ref> |
|||
** rav1e – [[Xiph.Org Foundation]]による[[AOMedia Video 1|AV1]]エンコーダの実装<ref>{{Cite web|title=rav1e: The fastest and safest AV1 encoder.|author=Xiph.Org Foundation|url=https://github.com/xiph/rav1e|accessdate=2018-05-01}}</ref> |
|||
** Polkadot – 異なる[[ブロックチェーン]]間で相互運用性を実現するオープンソースのプロトコル<ref>{{citeweb|author=Parity Technologies|url=https://medium.com/polkadot-network/paritys-polkadot-dev-update-2-fa4134710e|title=Parity’s Polkadot Dev Update #2|accessdate=2018-12-05}}</ref> |
|||
** [[Deno]] – [[JavaScript]]と[[TypeScript]]の[[ランタイムシステム|ランタイム環境]] |
|||
** [[Ruffle]] - 2020年でサポート終了する[[Adobe Flash Player]]の代替として開発中の[[エミュレーター]]。 |
|||
** [[mirakc]] <ref>{{Cite web|title=mirakc: A Mirakurun-compatible PVR backend written in Rust|url=https://github.com/masnagam/mirakc|accessdate=2020-08-10}}</ref> - 日本のテレビ(ISDB)録画システム[[Mirakurun]]クローン |
|||
** Nucleus - [[Dropbox]]の同期エンジン<ref>{{Cite web|和書|url=https://forest.watch.impress.co.jp/docs/news/1255034.html|title=Dropbox、4年をかけてRust言語で再構築された新しい同期エンジン「Nucleus」をリリース|accessdate=2022-12-07|publisher=Impress}}</ref>。 |
|||
== 学習用参考図書など == |
|||
* Jim Blandy, Jason Orendorff:"Programming Rust: Fast, Safe Systems Development", O'Reilly Media, ISBN 978-1491927281,First Ed. (2017年12月21日)。 |
|||
* Jim Blandy, Jason Orendorff, Lenora.F.S.Tindall:"Programming Rust: Fast, Safe Systems Development", O'Reilly Media, ISBN 978-1492052593,Second Ed. (2021年06月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日)。 |
|||
* [https://doc.rust-jp.rs/book-ja/title-page.html Steve Klabnik, Carol Nichols:「The Rust Programming Language 日本語版」] |
|||
* Jim Blandy, Jason Orendorff: 「プログラミングRust」、オライリージャパン 、ISBN 978-4873118550 (2018年8月10日)。 |
|||
*[https://gihyo.jp/book/2019/978-4-297-10559-4 κeen, 河野 達也, 小松 礼人:「実践Rust入門 "言語仕様から開発手法まで" 」、技術評論社(2019年5月8日)]。 |
|||
* Steve Klabnik, Carol Nicholes:「プログラミング言語Rust 公式ガイド」、 KADOKAWA、ISBN 978-4048930703 (2019年6月28日)。 |
|||
*[https://doc.rust-jp.rs/book/second-edition/ Steve Klabnik, Carol Nichols:プログラミング言語 Rust, 2nd Edition] |
|||
*酒井 和哉:「Rustプログラミング入門」、オーム社、ISBN 978-4-274-22435-5(2019年10月13日) |
|||
*[https://www.shuwasystem.co.jp/book/9784798061702.html 初田 直也, 山口 聖弘, 吉川 哲史, 豊田 優貴, 松本 健太郎, 原 将己, 中村 謙弘:「実践Rustプログラミング入門」、秀和システム]、{{ISBN2| 978-4798061702}}(2020年8月22日) |
|||
*山口 聖弘 : 「RustではじめるOpenGL」 、[https://web.archive.org/web/20210801111713/https://www.impressrd.jp/news/detail/70 インプレスR&D] 、ISBN 9784844378556(2020年02月21日)。 |
|||
*小野 輝也 :「Rustで始めるネットワークプログラミング」、 [https://www.amazon.co.jp/Rust%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%B0%8F%E9%87%8E-%E8%BC%9D%E4%B9%9F-ebook/dp/B07SW2GXVF Amazon Services International, Inc.] (2019年6月19日) |
|||
* 高野 祐輝:「並行プログラミング入門 ― Rust、C、アセンブリによる実装からのアプローチ」、オライリージャパン、ISBN 978-4-87311-959-5(2021年08月24日)。 |
|||
英語の読める読者ならば、rustup doc コマンドを用いる事で以下の文献をオフラインで閲覧可能。また、日本の有志によってRust By Exampleなどが翻訳されており(ただし部分訳)、公式サイトなどを参照されたい。 |
|||
<source lang="rust"> |
|||
fn fac_iterator(n: u32) -> u32 { |
|||
(1..n + 1).fold(1, |acc, x| acc * x) |
|||
}</source> |
|||
* The Rust Programming Language |
|||
== 言語の発展 == |
|||
* Rust By Example |
|||
この言語の開発の初期の頃、変数名や関数名など識別子として[[ASCII]]文字以外の文字を使うことは禁じられていた。言語についてのある質疑応答の中で、現場の非英語圏のプログラマーのほとんどが識別子にはASCII文字を使っていると述べられていた。しかしその制限は反論を引き出すことになった<ref name="ascii-lexeme-criticism">{{cite web|url=http://broadcast.oreilly.com/2010/08/vale-java-scala-vala-palava.html#comment-3572710|title=Vale Java? Scala Vala palava|last=Jelliffe|first=Rick|date=2010-11-08|accessdate=2012-03-29|quote={{lang|en|… 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…}}}}</ref>。それで、2011年2月に言語に変更が行われ、この制限は削除された<ref name="ascii-lexeme-update">{{cite web|url=https://github.com/mozilla/rust/commit/dabccadd3202513ab0bcb424e2c62c90ab23062d|title=Commit dabccadd3202513ab0bcb424e2c62c90ab23062d|date=2011-02-26|accessdate=2012-01-11}}</ref>。 |
|||
* Rustlings |
|||
* The Standard Library |
|||
* The Edition Guide |
|||
* The Rustc Book |
|||
* The Cargo Book |
|||
* The Rustdoc Book |
|||
* Extended Error Listing |
|||
* The Reference |
|||
* The Rustonomicon |
|||
* The Unstable Book |
|||
* The <code>rustc</code> Contribution Guide |
|||
* The Embedded Rust Book |
|||
== |
== 出典 == |
||
{{Reflist|30em}} |
{{Reflist|30em}} |
||
== 外部リンク == |
== 外部リンク == |
||
* |
* {{Official website|name=Rust 公式サイト}} |
||
* [https:// |
* [https://crates.io crates.io Rust Package Registry] |
||
* [https://mail.mozilla.org/pipermail/rust-dev/ The Rust-dev Archives (electronic mailing list)] |
* [https://mail.mozilla.org/pipermail/rust-dev/ The Rust-dev Archives (electronic mailing list)] |
||
* [https://github.com/ |
* [https://github.com/rust-lang/rust Primary source code repository and bug tracker] |
||
{{プログラミング言語一覧}} |
{{プログラミング言語一覧}} |
||
{{FOSS}} |
|||
{{Normdaten}} |
|||
{{デフォルトソート:RUST}} |
{{デフォルトソート:RUST}} |
||
[[Category:プログラミング言語]] |
[[Category:プログラミング言語]] |
2024年12月11日 (水) 12:44時点における最新版
Rustのロゴ | |
パラダイム | システムプログラミング、関数型プログラミング、並行計算、ジェネリックプログラミング、命令型プログラミング、オブジェクト指向プログラミング |
---|---|
登場時期 | 2010年7月7日 |
設計者 | グレイドン・ホアレ |
開発者 | Mozilla、グレイドン・ホアレ、Rust Foundation |
最新リリース | 1.83.0 / 2024年11月28日[1] |
型付け | 静的型付け、強い型付け、型推論、構造化データ |
主な処理系 | rustc |
影響を受けた言語 | Alef、C++、C Sharp、Cyclone、Erlang、Haskell、Limbo、Newsqueak、OCaml、Ruby、Scheme、Standard ML、Swift |
ライセンス | Apache-2.0、MIT License |
ウェブサイト | |
拡張子 | rs |
Rust(ラスト)は、性能、メモリ安全性、安全な並行性を目指して設計されたマルチパラダイムのプログラミング言語である。C言語、C++に代わるシステムプログラミング言語を目指しており[2]、構文的にはC++に似ているが[3]、「ボローチェッカー」(borrow checker) で参照の有効性を検証することによってメモリ安全性を保証できる。Rustはガベージコレクションなしでのメモリ安全性を達成しており、必要な場面で参照カウントを使うこともできる[4][5] 。
Rustプロジェクトはオープンソースのコミュニティベース開発で進行しており[6]、言語仕様(検討段階含む)、ソースコード、ドキュメントはオープンソースライセンスで公開されている[7]。2006年の開発初期は、Mozillaの従業員のグレイドン・ホアレ(Graydon Hoare)[8]の個人プロジェクトだったが、2009年にMozillaが開発に関わり始めてMozilla Researchの公式プロジェクトとなった[9][10]。2015年に1.0版がリリースされるまでにいくつもの破壊的な仕様変更があったが、1.0版以降は基本的には後方互換を保って6週間間隔で定期的にリリースされている。
Rustはマルチパラダイムプログラミング言語であり、手続き型プログラミング、オブジェクト指向プログラミング、関数型プログラミングなどの実装手法をサポートしている。基本的な制御構文はC言語に似ているが、その多くが式(expression)であるという点においてはML言語に似ている。コンパイル基盤にLLVMを用いており[11]、実行時速度性能はC言語と同等程度である[12]。強力な型システムとリソース管理の仕組みにより、メモリ安全性が保証されている。
Rustは2016–2022年の間Stack Overflow Developer Surveyで「最も愛されているプログラミング言語」で一位を獲得し続けている[13]。一方で、Rustは学習難易度が高い言語とも考えられており[14]、2017年ロードマップでは学習曲線の改善を目的として挙げていた[15]。
Rustという名前はさび菌に因んで付けられた[16]。この命名の後、当時の開発チームメンバーの多くが自転車を愛好していたことから、自転車のチェーンリングの錆つきを元にしたデザインのロゴが考案された[17]。当然、チェーンリングの錆がさび菌によって生じるわけがなく、「設計者のグレイドン・ホアレが生物学オタクであることから酸化鉄の「錆」ではなく「さび菌」なのだ」と、参考文献[16]の末尾に記されている。
開発体制
[編集]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]。
設計と特徴
[編集]パラダイム
[編集]言語実装手法においてのプログラミングパラダイムは特定の実装手法に限定されない非純粋なマルチパラダイムプログラミング言語である。文法の表面的な記述は手続き型プログラミング、ブロックコードのまとまりの意味論は関数型プログラミング、型システムを用いたオブジェクト構造はオブジェクト指向プログラミングのパラダイム特性を持つ。特定のプログラミングパラダイムのみを使用してソースコードを記述することはなく、要所々々の必要な所で必要なパラダイムを使用してソースコードを記述することになる。
ソースコードをターゲットプラットフォームに最適化したオブジェクトファイルにコンパイルするコンパイル言語のパラダイム特性を持つ。多くのスクリプト言語が持つインタプリタ機能や、SwiftやGoが提供するような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)
}
}
変数
[編集]変数はlet
キーワードで定義され、不変(イミュータブル)である[30]。変数への再代入はコンパイルエラーとなる[31]。
可変変数を扱いたい場合、変数宣言時にmut
キーワードを利用して可変であることを明示しなければならない[32]。この機能は例えば巨大構造体のコピーを避けながら一部を変更するために有効活用できる。
またRustはシャドーイング(同名変数の複数回定義)に対応している[33]。シャドーイングにより一時的な変数の変更や変数型の変更が可能になる[34]。
変数とは別にconst
キーワードで定義される定数を持つ。定数は常に等しい値を持つ(mut
やシャドーイングに対応していない)。
型とポリモーフィズム
[編集]この言語の型システムではHaskell言語に倣い「型クラス」を用いることができる。これはアドホックな多相性を容易にするものであり、可変型宣言により実現されるものである。高カインド多相性[35]など、Haskell言語にある他の特徴はサポートされていない。
型システム
[編集]Rust言語が備える型システムは、impl(実装)、trait(トレイト)、struct(構造体)およびenum(列挙型)を基本として構成される。implが他の言語におけるクラスに近い役割を果たし、継承とポリモーフィズムはtraitによって提供される。traitにはメソッドを定義することができ、traitで宣言されたメソッドはimplによってstructへミックスインされる。structにはフィールドが定義可能で、traitとimplはそれ自身にはフィールドは定義できない。enumには複数種類の型のカテゴリ変数が定義可能で、数値型、文字列型、オブジェクト型などの複数の状態を選択的に持ちうる。菱形継承問題を回避するためにtraitのみが継承が可能である。
変数の型を決定する型システムは静的型付けかつ強い型付けである。静的型付けと動的型付けの区分においての型付けは、コンパイル時に全ての変数に対して型を決定する静的型付けを基本としているが、トレイトをポインタを介して利用することで、ダックタイピングに似た型付けが可能なトレイトオブジェクトが存在する。ほかに、Anyトレイトにて、実行時リフレクションを用いた動的型付けも可能である。強い型付けと弱い型付けの区分においての型付けは、実行時に変数の型を型変換(アップキャスト、ダウンキャスト、クロスキャスト)およびボクシングをすることを許さない強い型付けのみをサポートしている。C言語、Javaは実行時に型変換をすることを許す弱い型付けをサポートしているが、Rust言語では変換先の型が明示されていない状況での型変換は認められていない。なお、型が確定している変数への代入や、シグネチャによりやはり型が確定している関数への引数渡しおよび返値の受け取り等に際しては、型強制のための関数が定義されていればそれを暗黙のうちに呼び出すことができる。[36]
型推論
[編集]Rustコンパイラは変数への代入時(variable = value
)、変数の型を値の型に基づき型推論する。変数の宣言には必ずしも型を決定するための初期値を必要としない。変数の宣言時に初期値が与えられた場合は「変数の型」は「初期値の型」であると型推論がなされるが、初期値が与えられなかった場合は以降のブロックコード中のその変数へ値が初めて代入された時に「左辺の変数の型」は「右辺の代入する値の型」であると型推論がなされる。変数への代入が型不一致により失敗した場合にはコンパイル時にエラーを検出する[37]。
ポリモーフィズムの実現
[編集]ポリモーフィズムを実現するため、構造体のフィールドおよび関数の入出力値は特定のトレイトの実装をするジェネリック型を指定することが出来る。そのような定義の中では、ジェネリック型で型が宣言された変数および入出力値はそのトレイトの特性のみ使用できる。これはジェネリック関数が定義されるとすぐに型判定ができることを意味している。これはC++のダック・タイピングで具体的な型がインスタンス化されるまで判定できないテンプレートとは対照的である。しかし、Rustのジェネリクスの実装はC++のテンプレートの典型的な実装と似ており、インスタンス化ごとにコードの個別のコピーが生成される。これは単相化[38]と呼ばれ、JavaやHaskellで通常使用される型消去方式とは対照的である。単相化の利点は特定のユースケースごとに最適化されたコードであり、欠点は結果のバイナリのコンパイル時間およびサイズが増加することである。Rustのトレイトを用いたポリモーフィズムの実現は、実行時のオーバーヘッドがない「ゼロコスト抽象化」と表現されている[39]。
リソース管理
[編集]システムプログラミング言語には効率良いリソース管理機能が必須である(例: メモリ・ファイル管理)。C言語はプログラマがリソースを直接管理し高い効率を得られる反面、メモリリークのようなバグ混入の危険性を孕んでいる。より高級な言語(例: Java)ではガベージコレクションのような動的リソース管理機構により高い安全性を得られる反面、動的管理のオーバーヘッドが必ず付きまとう。
Rustは所有権を軸としRAII・参照・借用チェッカーなどを言語仕様として組み入れることで、リソース管理検証をコンパイル時・静的におこなう。ゆえに動的管理のオーバーヘッドを避けつつ、安全性が担保されたリソースアクセスが可能になっている(c.f. ゼロコスト抽象化)。
以下はRustのリソース管理を支える個別の概念である。
所有権
[編集]所有権(英: Ownership)はリソース管理の中心を成す重要な概念である。一つのリソースは一つの所有者(変数やブロック)のみに関連付けされるという制約がRust特有のリソース管理機能として存在する。これは、あるリソースの所有権はある所有者(owner)が持っている、のように表現される。同時に、リソースの所有権を複数の変数が持つことは出来ない。
これはC++のスマートポインタの一種であるunique_ptr
の振る舞いに似ている。
参照
[編集]参照(英: Reference)は「他者所有値の一時的な借り受け」を表現する値である[40]。すなわち参照とは、値の所有権を元の所有者に置いたまま作成される、値へのアクセス扉である[41]。参照を介して参照先の値を読み書きできる一方、参照を解放しても(所有権がないので)参照先の値は存在し続ける。参照は常に有効な参照先を指すと保証されている[42][43]。参照を得ることを借用(英: borrow)という[40]。
参照はいくつかの問題を解決するためにRustへ導入された。まず値へのアクセスを所有者のみに限定した場合、所有者変数がブロック/関数の内外を引き回されて冗長になる[44]。値の所有権を有さずにアクセスを可能にする、扉・プロキシ・エイリアスのようなオブジェクトがあればこれは解決する。しかし単にアクセスオブジェクトを渡すとその有効範囲が不明なためダングリング参照を起こしうる。これは参照と参照先の生存期間等を比較することで静的に検出できる(借用チェッカー)。これにより参照は常に有効になり、ヌル参照チェックも不要になる。このような背景で導入されたのがRustの参照である。
参照に関する型・演算子・式が存在する。借用を表す式を借用式 &expr
(英: borrow expression)という[45]。型・演算子は以下である。
参照型(英: reference type)[46] | 借用演算子(英: borrow operator)[47] |
---|---|
共有参照型 &T (英: shared reference type)[48]
|
共有借用演算子 & (英: shared borrow operator)[49]
|
可変参照型 &mut T (英: mutable reference type)[50]
|
可変借用演算子 &mut (英: mutable borrow operator)[51]
|
すなわち、演算子 &
を用いた式 &expr
の評価により型 &T
の値が得られる。&mut
でも同様である。
共有参照型は参照先の読み取りのみが可能で書き換えができないが、値が不変であるため同じ値を指す複数の共有参照が生成できる[52]。参照はCopy
トレイトによりムーブでなくコピーで渡される[53]。可変参照型は両方が可能であるが、値が可変であるため同じ値を指す他の参照が生成できない[54]。ゆえに参照は Copy
トレイトを持たずコピーでなくムーブで渡される[55]。
ボローチェッカー
[編集]既に解放されたリソースを指し続ける参照はバグを引き起こす(例: ダングリングポインタ)。もし静的にこれを検証できれば、オーバーヘッド無しに安全性を担保できる。また検証により不正な参照を避けられるため参照へのヌル代入が不要となり、ヌルポインタチェックを不要にできる。
Rustでは借用チェッカー(英: borrow checker、ボローチェッカー)により所有権の競合および不正利用を静的に検証する。所有権が解放されたリソースを指す参照は無効であり、使用した場合はコンパイルエラーとなる。ボローチェッカーは参照についてもライフタイム(lifetimes)としてリソースの生存期間を検証する。これによりヌルポインタやダングリングポインタ、リソース利用競合を制限したメモリ安全性を実現している。
特異なリソース型
[編集]リソースのメモリ確保は基本的にはスタックメモリを利用しており、ヒープメモリを利用したメモリ確保はBox
やVec
などの特定の型のみで限定的に利用されている。
コンパイル時に型のサイズが決定できない可変長配列を表すような型はヒープメモリを利用するBox
型を使用してリソースを管理する。Box
リソース自体はスタックメモリで管理されるが、Box
リソースが所有権を持つ実体のリソースはヒープメモリで管理される。標準のヒープメモリ確保にはシステムアロケータを利用するが[56]、対象プラットフォームやビルド時の指定により他のメモリ確保APIを利用することもある。ヒープメモリはスタックメモリに比べて速度性能が落ちるため、必要時にのみ限定的に利用されている。
境界チェック
[編集]Rustは実行時に境界チェックをおこなう。これによりバッファオーバーランをはじめとしたメモリアクセスに対する安全性を得ている。この機能はゼロコスト抽象化でなく実行時の命令であるため、安全性と引き換えにいくらかの性能オーバーヘッドが発生している。他のシステムプログラミング言語として代表的なC言語やC++は境界チェックを強制しないため、Rustの特徴の1つとなっている。
ライフタイム
[編集]ライフタイム(英: Lifetime)はジェネリック型の一種で、リソースやそれらへの参照の生存期間を表す。[57]
参照を関数やメソッドとの間で受け渡ししたり、構造体や列挙型など別のデータ型に保存すると、参照の生存期間が参照を定義したスコープだけでは決まらなくなる。この場合、参照や参照先リソースに対してライフタイムの付加が必要となる。ライフタイムは'lifetime
の形式で記述する。ライフタイムを参照型に付加する場合は&
の直後、それ以外の型に対してはジェネリック型として付加する。この他、別のジェネリック型に対してライフタイムを付加することもできる。特に、あるライフタイムに対して別のライフタイムを境界条件として与え、どちらか片方がもう片方よりも長く生存することを要求することができる。[58]
ボローチェッカーはライフタイムを持つ変数に対し、その変数が指す参照先やリソースの生存期間がライフタイムにより要求される生存期間を満たしているかどうかをチェックする。チェックに失敗した場合はコンパイルエラーとする。注意すべき点として、ライフタイムを与えることにより参照先やリソースの生存期間を延長することはできない。それらの生存期間はあくまでそれらを定義および使用するスコープによって決まるため、ライフタイムのチェックでエラーが出た場合は参照先の生存期間を修正する必要がある。
関数やメソッドの定義にあっては、付加すべきライフタイムに、ある特定のパターンが存在することが知られている。そのようなパターンの通りにライフタイムを指定したい場合は、ライフタイムの手動付加を省略し、コンパイラにライフタイムを自動付加させることができる。この機能はライフタイムエリゾン(英: lifetime elision)[59]と呼ばれる。ライフタイムエリゾンのパターン以外のライフタイムが必要な場合はライフタイムエリゾンは使用できず、ライフタイムを明示的に付加しなければならない。
関数の型を定義する際、その引数や返値が参照を含む場合はしばしばライフタイムが必要となるが、そのライフタイムが指し示す生存期間が関数の型だけでは決められず、その型に含まれる関数やクロージャを実際に定義しないと生存期間も決まらないことがある。このような場合、関数の型にて用いるライフタイムを、関数型としては任意の生存期間を持って構わないと定めることができる。そのようなライフタイムは高階トレイト境界(英: higher-rank trait bound、HRTB)[60]として定義する。HRTBを用いて定義した関数型は単一の型ではなく、ライフタイムが取り得る限りの場合の数だけある型の集まりとなり、理論上「関数の集まり」になることに由来している。
移動
[編集]Rustの特徴として、変数をメモリ上で自由に移動することができる。[61] これにより、関数やメソッド呼び出しでの変数受け渡しを値により行うことができる。また、それらの操作や代入等における所有権の移動もこの特徴に依存している。
Box<T>
型(T
は型、以下同様)のようなスマートポインタ、およびVec<T>
型のように可変長データを指すポインタの場合、ポインタが指しているデータは通常は移動しないが、ポインタそのものは移動する。すなわち、ポインタの値を受け渡しする挙動となる。
変数の移動を防止したい場合は、一般にはPin<P>
型(P
はトレイトPointer<T>
を持つ型、典型的にはスマートポインタ)を使用する。この型はBox<T>
型や&mut T
型の取得を禁止しており、これによりPin<P>
型が指すデータの移動を防ぐ。なお、Pin<P>
型からPin<&mut T>
型を得ることは可能で、これを用いてデータの移動を防ぎつつ変更することは可能である。また、Pin<P>
型そのものを値受け渡しなどにより移動することもできる。
Rustにて変数の移動を防ぐ必要がある状況としては、主に以下がある。
- 構造体型にて、自身ないしはそのフィールドへのポインタを持つ。[62]
- 変数のアドレスをRustの外のライブラリなどへ渡す。
ライブラリ
[編集]Rustのライブラリはクレート(crate)という呼称で提供される。多くのクレートはcrates.ioで公開されている。同サイトはバージョン毎のソースコードをアーカイブとして提供している。クレートは必ずしもcrates.ioに登録されている必要はなく、Webサーバやファイルシステムを指すURIで指定することもできる[63]。ライブラリはソースコードプロジェクトで配布されることが一般的だが、コンパイルしたバイナリライブラリファイルで出力することも可能である。[64]スタティックライブラリ(拡張子rlib
)およびダイナミックライブラリ(拡張子はプラットフォームに依存)をサポートしている。いずれの形式にあっても、コンパイルされたオブジェクトコードが含まれる。スタティックライブラリではこれに加えてコンパイラのバックエンドがサポートする中間表現での出力を含めることも可能であり[65]、Link-Time Optimizationにてこれを利用することができる。
コアライブラリ
[編集]コアライブラリはcoreの名称で提供されている[66]。このライブラリは標準ライブラリに依存しない基幹ライブラリであり、一切の上位ライブラリ、システムライブラリ、libcライブラリにリンクしていない。コアライブラリは最小限であり、ヒープ割り当てを認識せず並行性や入出力も提供していない。それらのことはプラットフォームへの調整が必要であり、このライブラリはプラットフォームに依存しない。
標準ライブラリ
[編集]標準ライブラリはstdの名称で提供されている[67]。このライブラリは基礎的な型(Vec<T>やOption<T>)、言語の基本の処理、標準のマクロ、入出力(I/O)、マルチスレッドなどの機能を提供する。標準ライブラリは標準でリンクしてソフトウェアがビルドされるが、より根幹的なソフトウェアやリソースの小さい組み込み環境ではリンクを外してソフトウェアをビルドすることができる。
外部ライブラリ
[編集]Rustは基本的で汎用的な機能を含め標準ライブラリではなく外部ライブラリとして提供している。これはいわゆる「バッテリー同梱 (“Battery Included”)」の反対を行くもので、言語と共に更新することで保守的になりがちな標準ライブラリではなく、言語とは独立して更新することで最善を繰り返し探求しうる外部ライブラリとすることで、それらの機能をより良い品質で提供する考えに基づいていたものである[68]。外部ライブラリの利便性と品質の保証のためにcrates.ioとAPIガイドラインを提供している。
言語開発のコミュニティがそれらについて携わっていないわけではなく、基礎的な外部ライブラリはコミュニティ配下で開発が進められている。
- 基礎的なライブラリ
開発ツール
[編集]Rustの開発ツールは独立したソフトウェアとして提供されているが、Rustの公式なインストール方法に従えば、以下のツール一式が手に入る。
rustc
[編集]rustcはRustで記述されたRustソースコードをコンパイルするコンパイラ(処理系)である。コンパイルの成果物として中間コード、および実行ファイル、静的ライブラリ、動的ライブラリを出力する[74]。rustcはクロスコンパイルを可能とし、Windows、Linux、macOS向けの実行ファイル他、AndroidやiOSで動作するライブラリをホストマシンで出力することができる[75]。
対象プラットフォームは完成度に合わせて3つのTier(ティア)に分かれている[76]。Tier 1はバイナリリリースが提供されており、自動ビルドと自動テストが整備され、それらが安定して成功(パス)することが保証されている。 Tier 2はバイナリリリースが提供されており、自動ビルドと自動テストは整備されているがテストが成功することは保証されていない。Tier 3はソースコードとしては対応しているが、自動ビルドと自動テストの動作が保証されておらず、公式リリースは提供されていない。
Windows、Linux、macOS向けのRustコンパイラはティア1でリリースされている。Android、iOS、WebAssembly向けのRustコンパイラはティア2でリリースされている。
Rust 1.12版より導入されたMIR (Mid-level IR)[11] によって、コンパイルと実行時間の迅速化ならびに型チェックの正確性の実現が図られている。
Cargo
[編集]最新版 |
1.79.0
/ 2024年6月13日[77] |
---|---|
リポジトリ |
github |
プログラミング 言語 | Rust |
種別 | ビルドツール、パッケージ管理システム |
公式サイト |
doc |
CargoはRust製ソフトウェアプロジェクトのCUIのビルドツールである。規定のファイル構成(ディレクトリ、設定ファイル、ソースファイル)のプロジェクトディレクトリで利用される。プロジェクトのビルド(コンパイル)、依存ライブラリのダウンロード、テスト、ドキュメント生成などをサポートする[78]。通常はCargoを中心に開発を行えるように設計されているため、rustcコンパイラを直接呼び出すことは稀である。Cargoの依存ライブラリのダウンロード先はcrates.ioである[79]。 サブコマンドは拡張可能で標準のコマンドの他、README.mdファイルの自動生成コマンド[80]などの拡張コマンドが存在する。この拡張はcargo-xxxと名付けたコマンドを適切にインストールするだけで、cargoにxxxというサブコマンドを追加できる。
rustup
[編集]開発元 | Rust Project Developers |
---|---|
初版 | 2016年4月15日 |
最新版 |
1.24.3
/ 2021年5月31日 |
リポジトリ | https://github.com/rust-lang/rustup/ |
プログラミング 言語 | Rust |
対応OS | Windows, Linux, macOS |
公式サイト | https://www.rustup.rs |
rustupはツールチェーンの管理ソフトウェアである。ツールチェーンのダウンロードとインストール、ソフトウェアバージョンの管理、コンパイルターゲットの切り替えの機能を提供する[81][82]。
機能
[編集]rustupはRustプロジェクトがリリースしているコンパイラ(rustc)、ビルドツール(Cargo)などのツールチェーンをインターネットを経由してホストマシンにダウンロード、インストールおよびマネージメントする機能を提供する。インストール対象のツールチェーンのバージョンは、安定版、ベータ版、ナイトリー版の全てを含んでおり、利用者が必要とするバージョンを指定してダウンロードすることができる。また、ターゲットプラットフォームについても全ての種類を含んでおり、ホストマシンと異なるプラットフォーム(例えば、ホストがmacOSであってもWindowsやAndroid、iOS)のコンパイラをインストールすることができる。この場合、コンパイラはクロスコンパイラとして動作してターゲットプラットフォームに合わせたビルドを実施する。
歴史
[編集]Rust 1.13版以前はシェルスクリプトで実装されたrustup.sh
が公開されていた[83]。これと並行してRust言語で実装された同等機能を提供するrustup.rs
の開発が進められており、Rust 1.14版でrustup.sh
は非推奨となり[84]、Rust 1.14版以降はrustup.rs
が公式リリースとして提供されている[85][86]。
評価
[編集]Rustは2016〜2022年に渡ってStack Overflow Developer Surveyで「最も愛されているプログラミング言語」で一位を獲得し続け[13]、プログラマの好意的な評価は多い。
一方で、Rustは学習難易度が高い言語とも考えられている[87]。多くのRust初学者のプログラマにおいて、自身が正しいと思って書いたソースコードのコンパイルに対してコンパイラ(ボローチェッカー)がエラーを検出する、「ボローチェッカーとの戦い」(fighting with the borrow checker)が発生しがちである[88][89]。小さなアプリケーションの実装について同時期に言語開発されているGo言語と比較した場合、Rust言語よりGo言語の方が開発効率が良いという評価がある[14]。学習難易度の高さは開発チームも認識しており、2017年ロードマップでは学習曲線の改善を目的として挙げていた[15][90]。
この問題を改善するために、2020年現在において、自動化をメインテーマにした開発を続けており、前述にあるcargo、rustup等のツール以外にも、rustfmt、clippy、cargo docなどのツール類をIDE環境のみならずCUI環境でも利用可能な状態へと整備を続けている。また、後方互換性を維持しているため、crates.ioを用いる事でライブラリ類などの生産性の向上にも努めている。
Rustの実行時速度性能は同じくコンパイラにLLVMを利用している場合のC言語と同等程度であり[91][92]、一部の処理ではC言語を上回った速度が確認されている[12]。2018年2月時点で、ウェブサーバアプリケーションの汎用処理では速度性能の良いRust製ライブラリは開発が進んでいない[93]。単純なテキスト処理では速度性能は良い[94]。
その後のベンチマークでは、並行処理やグラフィックス処理においても、JavaやGoを上回っており、コンパイラの出力するコードの優秀性が証明されている。ただし、サポートされていないグラフィックスボード(Cのライブラリをインクルードしなければならない)では、C/C++の実効性能には及んでいない。[要出典]
歴史
[編集]誕生
[編集]2006年、Mozillaで働いていたグレイドン・ホアレ[95]は現代のインターネット環境で高い並行性と高い安全性が求められるシステムプログラミング言語としてC言語やC++に代わりうるプログラミング言語 Rust言語の開発に着手した[2]。MozillaがRustの開発に関わりはじめたのは2009年で[96][9]、Rustは2010年のモジラ・サミットで公に姿を表した[97]。RustソースコードをコンパイルするRustコンパイラは、初期の頃はOCaml言語で作られたコンパイラ(rustboot)が用いられていたが[98]、2010年にはRust言語自身でRustコンパイラを作るセルフホスティングへ移行したコンパイラ(rustc)の開発が始められ[99]、翌年にはブートストラップ問題を解決した最初の完動品が完成した[100]。この時よりRustコンパイラはコンパイル基盤にLLVMを用いたものとなった[101]。
0.x版
[編集]プレアルファ(0.1版)と呼ばれる最初のバージョンは2012年1月にリリースされた[102]。Mozillaはこれを新しいモノ好みの人やプログラミング言語愛好家のためのアルファ版と位置づけていた。最初の安定版である1.0版がリリースされるまでの0.x版リリースでは、いくつもの大きな破壊的な仕様変更が言語およびライブラリに加えられた。
変数名や関数名など識別子は、この言語の開発の初期の頃は、ASCII文字以外の文字を使うことが禁じられていた。言語についてのある質疑応答の中で、現場の非英語圏のプログラマーのほとんどが識別子にはASCII文字を使っていると述べられていた。しかしその制限は反論を引き出すことになった[103]。それにより、2011年2月に言語に変更が行われ、この制限は削除された[104]。
型判定は、0.4版以前の従来の静的型付けに加えて、型状態システムをサポートしていた。型状態システムは、特別なcheck
文を使用してプログラム文の前後での型決定をモデル化した。C言語やC++コードでのアサーションの場合と同様に、プログラム実行中ではなくコンパイル時に型不一致を検出する。型状態の概念はRust特有のものではなく、NILで採用されていたものである[105]。実際にはほとんど使用されていなかったため型状態は削除されたが、ブランディングパターンで同じ機能を実現できる[106]。
オブジェクト指向のシステムは、0.2版から0.4版にかけて大きく変わっていった。0.2版で初めてクラス(class)が導入され、0.3版でインターフェース(interface)を通したデストラクタとポリモーフィズムが追加され、0.4版で継承を提供する手段としてトレイト(trait)が追加された。インターフェースはトレイトに一部の機能が統合されて、異なる不要な機能として削除された。クラスもまた削除され、構造体とトレイトを使用したミックスインに置き換えられた。
コアのメモリモデルは、0.9版から0.11版の間、2つのビルトインのポインタ型(ヒープメモリ型~
とガベージコレクション型@
)を機能を単純化するために用意していた。それらは、標準ライブラリのBox
型とGc
型で置き換えられ、Gc
型は最終的には削除された[107]。
2014年1月、Dr. Dobb's Journalの編集長アンドリュー・ビンストックはD言語やGo言語、Nim言語と同様にC++の競争相手になる機会を得たとコメントした。ビンストックによると、Rustは非常にエレガントな言語として広く見られているが、バージョン間で繰り返し大きく変更されたため普及が遅れているという[108]。
1.x版
[編集]2015年5月16日、安定版となるRust 1.0がリリースされた[109]。1.0版の後、安定版およびベータ版が6週間おきに定期リリースされている[110]。またナイトリー版が毎日リリースされている[111]。新たな機能はナイトリー版で開発が進められ、ベータ版で動作が検証されている[112]。
2016年8月2日にリリースされたFirefox 48にはRustで書き直されたメディアパーサが組み込まれており、Mozillaが開発しているブラウザのFirefoxにおいてRustで書かれたコードが書き加えられる初例となった[113][114]。
2016年9月にRustはFedora 24の標準コンポーネントに加えられ、RPMのパッケージ管理システムを用いてのインストール作業が容易化されている[115]。
2018年版
[編集]2018年12月6日にバージョン1.31がリリースされた[116]。今回からエディション制が導入され、最新版は"Rust 2018"、従来版は"Rust 2015"と呼ばれることになる。言語機能への破壊的変更は新しいエディションのみに適用されるが、互換性に影響しない機能追加は引き続き両者に適用される。また、2015年版から2018年版へはcargo fix
でトランスコンパイルできる[116]。
2021年版
[編集]2021年5月11日に、3年ぶりの改訂となる2021年版について公式 Blogへ記載が行われた[117]。当該機能は、2021年10月21日にリリースの1.56より適用される。今回の主要な改訂は、例外処理への対応が強化され、prelude文にTryIntoやTryFrom、FromIteratorなどが追加される。詳細については、公式Blogを参照されたいが、後方互換性を維持しているため、2018年版との間では特に問題なくコンパイルできる。
Rustで実装されたソフトウェア
[編集]RustコンパイラはRust自身で記述されている[99]。
その他のRustを使って開発されているプロジェクト:
- ウェブブラウザ
- Mozilla Firefox[118]
- Servo – HTMLレンダリングエンジン[119]
- Quantum – ウェブエンジン[120]
- Chromium[121][122] サードパーティー製クレートを使用。
- Mozilla Firefox[118]
- ビルドツール
- Cargo – Rustのビルドツール
- Habitat – チェフソフトウェアの開発するソフトウェアデプロイメントツール[123]
- OS
- Magic Pocket – Dropboxのペタバイトを管理する機器のファイルシステム[124]
- Redox – マイクロカーネルオペレーティングシステム[125]
- intermezzOS – システムプログラミングの試験的なオペレーティングシステム[126]
- Stratis – Fedora 28で予定されるファイルシステム [127]
- Railcar – Oracleの仮想化マシン[128]
- Android - 2021年からRustを採用している[129]。
- Linux - バージョン6.1から一部の機能にRustが組み込まれると予定されている[130]。
- KataOS - RISC-Vで動作する組み込みシステム向けにGoogleが開発したOS[131]。
- Windows - 2019年からWindows 10のコンポーネントの一部をRustに置き換えている[132]。
- その他
- Exonum – ブロックチェーンのオープンソースフレームワーク[133]
- OpenDNS – ソリューションの内の2つのコンポーネント[134][135][136]
- Piston – ゲームエンジン[137]
- rustls – TLSのRust実装[138]
- REmacs – EmacsのRust実装 [139]
- Pijul – Darcsを参考にしたバージョン管理システム[140]
- Xi – Google Open Sourceで開発されているテキストエディタ[141]
- ripgrep – grepに相当する高速なテキスト検索ツール[142]
- rav1e – Xiph.Org FoundationによるAV1エンコーダの実装[143]
- Polkadot – 異なるブロックチェーン間で相互運用性を実現するオープンソースのプロトコル[144]
- Deno – JavaScriptとTypeScriptのランタイム環境
- Ruffle - 2020年でサポート終了するAdobe Flash Playerの代替として開発中のエミュレーター。
- mirakc [145] - 日本のテレビ(ISDB)録画システムMirakurunクローン
- Nucleus - Dropboxの同期エンジン[146]。
学習用参考図書など
[編集]- Jim Blandy, Jason Orendorff:"Programming Rust: Fast, Safe Systems Development", O'Reilly Media, ISBN 978-1491927281,First Ed. (2017年12月21日)。
- Jim Blandy, Jason Orendorff, Lenora.F.S.Tindall:"Programming Rust: Fast, Safe Systems Development", O'Reilly Media, ISBN 978-1492052593,Second Ed. (2021年06月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日)。
- Steve Klabnik, Carol Nichols:「The Rust Programming Language 日本語版」
- 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日)。
- Steve Klabnik, Carol Nichols:プログラミング言語 Rust, 2nd Edition
- 酒井 和哉:「Rustプログラミング入門」、オーム社、ISBN 978-4-274-22435-5(2019年10月13日)
- 初田 直也, 山口 聖弘, 吉川 哲史, 豊田 優貴, 松本 健太郎, 原 将己, 中村 謙弘:「実践Rustプログラミング入門」、秀和システム、ISBN 978-4798061702(2020年8月22日)
- 山口 聖弘 : 「RustではじめるOpenGL」 、インプレスR&D 、ISBN 9784844378556(2020年02月21日)。
- 小野 輝也 :「Rustで始めるネットワークプログラミング」、 Amazon Services International, Inc. (2019年6月19日)
- 高野 祐輝:「並行プログラミング入門 ― Rust、C、アセンブリによる実装からのアプローチ」、オライリージャパン、ISBN 978-4-87311-959-5(2021年08月24日)。
英語の読める読者ならば、rustup doc コマンドを用いる事で以下の文献をオフラインで閲覧可能。また、日本の有志によってRust By Exampleなどが翻訳されており(ただし部分訳)、公式サイトなどを参照されたい。
- The Rust Programming Language
- Rust By Example
- Rustlings
- The Standard Library
- The Edition Guide
- The Rustc Book
- The Cargo Book
- The Rustdoc Book
- Extended Error Listing
- The Reference
- The Rustonomicon
- The Unstable Book
- The
rustc
Contribution Guide - The Embedded Rust Book
出典
[編集]- ^ 出典URL: https://blog.rust-lang.org/2024/11/28/Rust-1.83.0.html, 題名: Announcing Rust 1.83.0, 作品または名前の言語: 英語, 閲覧日: 2024年11月28日, 出版日: 2024年11月28日
- ^ 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.”
- ^ “Rust vs. C++ Comparison”. 20 November 2018時点のオリジナルよりアーカイブ。20 November 2018閲覧。
- ^ “Fearless Security: Memory Safety”. 8 November 2020時点のオリジナルよりアーカイブ。4 November 2020閲覧。
- ^ “Rc<T>, the Reference Counted Smart Pointer”. 11 November 2020時点のオリジナルよりアーカイブ。4 November 2020閲覧。
- ^ Rust Project Developers. “The Rust Community · The Rust Programming Language”. 2018年2月4日閲覧。
- ^ Rust Project Developers. “rust-lang/rust: A safe, concurrent, practical language.”. github. 2018年2月4日閲覧。
- ^ “CやC++に代わると期待--安全な並行性とメモリーの安全性に焦点当てる「Rust」”. ZDNet Japan (2020年2月1日). 2020年2月2日閲覧。
- ^ a b Mozilla Research. “Rust”. 2018年2月4日閲覧。
- ^ “The Rust Language”. Lambda the Ultimate (2010年7月8日). 2010年10月30日閲覧。
- ^ a b Matsakis, Niko (2016年4月19日). “Introducing MIR”. 2016年10月4日閲覧。
- ^ a b “Rust versus C gcc fastest programs”. 2018年8月22日閲覧。
- ^ a b “Stack Overflow Developer Survey 2022”. Stack Overflow. 2022年7月10日閲覧。
- ^ a b Matthias Endler (2017年9月15日). “Go vs Rust? Choose Go.”. 2018年1月28日閲覧。
- ^ a b Aaron Turon. “Rust's 2017 roadmap”. 2018年1月28日閲覧。
- ^ a b “Internet archaeology: the definitive, end-all source for why Rust is named "Rust"”. 2020年5月10日閲覧。
- ^ “Rust logo(type)”. Mozilla Foundation. 2020年5月10日閲覧。
- ^ “The Rust Team · The Rust Programming Language”. Rust Project Developers. 2018年2月4日閲覧。
- ^ “The Rust Programming Language”. github. 2018年2月4日閲覧。
- ^ “Contributors to rust-lang/rust”. github. 28 January, 2018閲覧。
- ^ “The Mozilla Manifesto”. 2012年4月9日閲覧。
- ^ “rust-lang/rfcs: RFCs for changes to Rust”. github. 2018年2月4日閲覧。
- ^ “rust-lang/rfcs: RFCs for changes to Rust”. 2018年1月28日閲覧。
- ^ Aaron Turon. “Refining Rust's RFCs”. 2018年1月28日閲覧。
- ^ “bindgen 0.17.0 - Docs.rs”. Onur Aslan. 2018年2月4日閲覧。 “authors Jyun-Yan You”
- ^ Yamakaky (2016年7月22日). “merge into upstream! · Issue #21 · rust-lang-nursery/rust-bindgen”. github. 2018年2月4日閲覧。
- ^ “rust-lang-nursery/rust-bindgen Automatically generates Rust FFI bindings to C (and some C++) libraries.”. 2018年2月4日閲覧。
- ^ “rust/src/grammar/parser-lalr.y” (2017年5月23日). 28 January, 2018閲覧。
- ^ ““Frequently Asked Questions · The Rust Programming Language - When should I use an implicit return?”. 2018年1月28日閲覧。
- ^ "by default variables are immutable." The Rust Programming Language
- ^ "E0384. An immutable variable was reassigned." Rust Compiler Error Index
- ^ "you can make them mutable by adding
mut
in front of the variable name." The Rust Programming Language - ^ "you can declare a new variable with the same name as a previous variable, and the new variable shadows the previous variable." The Rust Programming Language
- ^ "By using let, we can perform a few transformations on a value but have the variable be immutable after those transformations have been completed. ... The other difference between mut and shadowing is that because we’re effectively creating a new variable when we use the let keyword again, we can change the type of the value but reuse the same name." The Rust Programming Language
- ^ 英: higher-kinded polymorphism
- ^ “Type coercions”. The Rust Reference. 27 March 2024閲覧。
- ^ Walton, Patrick (2010年10月1日). “Rust Features I: Type Inference”. 2011年1月21日閲覧。
- ^ 英: monomorphization
- ^ Aaron Turon (2015年5月11日). “Abstraction without overhead: traits in Rust - The Rust Programming Language Blog”. 2018年2月4日閲覧。
- ^ a b "A reference represents a borrow of some owned value." Primitive Type reference. The Rust Standard Library. 2022-12-24閲覧.
- ^ "A reference ... to access the data stored at that address; that data is owned by some other variable." References and Borrowing. The Rust Programming Language. 2022-12-24閲覧.
- ^ "A reference cannot outlive its referent" References. The Rustonomicon. 2022-12-24閲覧.
- ^ "A lifetime is said to “outlive” another one if its representative scope is as long or longer than the other." Primitive Type reference. The Rust Standard Library. 2022-12-24閲覧.
- ^ "The issue ... we have to return the
String
to the calling function so we can still use ... . Instead, we can provide a reference" References and Borrowing. The Rust Programming Language. 2022-12-24閲覧. - ^ "Syntax BorrowExpression" Operator expressions. The Rust Reference. 2022-12-24閲覧.
- ^ "Primitive Type reference ... References,
&T
and&mut T
." Primitive Type reference. The Rust Standard Library. 2022-12-24閲覧. - ^ "Borrow operators" Operator expressions. The Rust Reference. 2022-12-24閲覧.
- ^ "shared reference type is written
&type
" Pointer types. The Rust Reference. 2022-12-24閲覧. - ^ "The
&
(shared borrow) ... operators" Operator expressions. The Rust Reference. 2022-12-24閲覧. - ^ "A mutable reference type is written
&mut type
" Pointer types. The Rust Reference. 2022-12-24閲覧. - ^ "
&mut
(mutable borrow) operators" Operator expressions. The Rust Reference. 2022-12-24閲覧. - ^ "When a shared reference to a value is created, it prevents direct mutation of the value." Pointer types. The Rust Reference. 2022-12-24閲覧.
- ^ "The following traits are implemented for all
&T
, regardless of the type of its referent:Copy
" Primitive Type reference. The Rust Standard Library. 2022-12-24閲覧. - ^ "if you have a mutable reference to a value, you can have no other references to that value." References and Borrowing. The Rust Programming Language. 2022-12-24閲覧.
- ^ "
&mut T
references get all of the above exceptCopy
andClone
(to prevent creating multiple simultaneous mutable borrows)" Primitive Type reference. The Rust Standard Library. 2022-12-24閲覧. - ^ “jemalloc is removed by default”. 2020年6月12日閲覧。
- ^ “Validating References with Lifetimes”. The Rust Programming Language. 02 January 2024閲覧。
- ^ “Trait and lifetime bounds”. The Rust Reference. 02 January 2024閲覧。
- ^ “Trait and lifetime bounds”. The Rust Reference. 02 January 2024閲覧。
- ^ “Higher-Rank Trait Bounds (HRTBs)”. The Rustonomicon. 02 January 2024閲覧。
- ^ “Module std::pin”. The Rust Standard Library. 02 January 2024閲覧。 “By default, all types in Rust are movable. Rust allows passing all types by-value, ...”
- ^ “Module std::pin, Example: self-referential struct”. The Rust Standard Library. 02 January 2024閲覧。
- ^ Rust Team. “Working with an unpublished minor version”. 2018年1月28日閲覧。
- ^ “Libraries and Metadata”. Rust Compiler Development Guide. 2024年12月11日閲覧。
- ^ Nicholas Nethercote. “Add -Cbitcode-in-rlib. #71323”. GitHub. 2024年12月11日閲覧。
- ^ Rust project developers. “core- Rust”. 2018年1月28日閲覧。
- ^ Rust project developers. “std- Rust”. 2018年1月28日閲覧。
- ^ Brian Anderson (2017年5月5日). “The Rust Libz Blitz - The Rust Programming Language Blog”. 2018年2月4日閲覧。
- ^ The Rust Project Developers. “rand - Cargo: packages for Rust”. 2018年1月28日閲覧。
- ^ The Rust Project Developers. “regex - Cargo: packages for Rust”. 2018年1月28日閲覧。
- ^ Kang Seonghoon. “chrono - Cargo: packages for Rust”. 2018年1月28日閲覧。
- ^ The Rust Project Developers. “libc - Cargo: packages for Rust”. 2018年1月28日閲覧。
- ^ The Rust Project Developers. “log - Cargo: packages for Rust”. 2018年1月28日閲覧。
- ^ Blandy, Jim (2017). Programming Rust. O'Reilly Media, Inc. p. 285. ISBN 1491927283
- ^ Brian Anderson (2016年5月13日). “Taking Rust everywhere with rustup”. 2018年1月28日閲覧。
- ^ “Rust Platform Support · The Rust Programming Language”. 2018年2月4日閲覧。
- ^ “Releases · rust-lang/cargo · GitHub”. Template:Cite webの呼び出しエラー:引数 accessdate は必須です。
- ^ Yehuda Katz (2016年5月5日). “Cargo: predictable dependency management - The Rust Programming Language Blog”. 2018年2月4日閲覧。
- ^ Alex Crichton (2014年11月20日). “Cargo: Rust's community crate host”. 2018年1月28日閲覧。
- ^ livioribeiro (2015年10月15日). “Cargo-readme: generate README.md from doc comments”. 2018年1月28日閲覧。
- ^ “RustUp aka How to install rust the convenient way” (2016年6月2日). 2018年2月4日閲覧。
- ^ Brian Anderson (2016年5月13日). “Taking Rust everywhere with rustup - The Rust Programming Language Blog”. 2018年2月4日閲覧。
- ^ vanjacosic (2016年9月27日). “rust/getting-started.md at 1.13.0 · rust-lang/rust”. 2018年2月4日閲覧。
- ^ “rust-lang-deprecated/rustup.sh: The rustup.sh script for installing Rust from release channels”. 2018年1月28日閲覧。
- ^ vanjacosic (2016年12月17日). “rust/getting-started.md at 1.14.0 · rust-lang/rust”. 2018年2月4日閲覧。
- ^ “rust-lang-nursery/rustup.rs: The Rust toolchain installer”. 2018年1月28日閲覧。
- ^ 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.”
- ^ “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’”
- ^ Ivan Sagalaev (2016年11月2日). “Why Rust's ownership/borrowing is hard”. 2018年2月4日閲覧。
- ^ Aaron Turon. “Rust should have a lower learning curve”. 2018年1月28日閲覧。
- ^ “Miscellany: C++ design goals in the context of Rust”. 2018年1月28日閲覧。
- ^ “Frequently Asked Questions · The Rust Programming Language - How fast is Rust?”. 2018年1月28日閲覧。
- ^ “Web Framework Benchmarks - Round 15 2018-02-14”. Framework Benchmarks Google Group. 2018年3月4日閲覧。
- ^ “Web Framework Benchmarks - Round 15 2018-02-14”. Framework Benchmarks Google Group. 2018年3月4日閲覧。
- ^ 英: Graydon Hoare
- ^ “Project FAQ” (2010年9月14日). 2012年1月11日閲覧。
- ^ “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.”
- ^ rustlangの2017年3月12日のツイート、2018年2月4日閲覧。
- ^ 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”
- ^ 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 :)”
- ^ 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.”
- ^ 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日閲覧。
- ^ 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…”
- ^ “Commit dabccadd3202513ab0bcb424e2c62c90ab23062d” (2011年2月26日). 2012年1月11日閲覧。
- ^ Strom, Robert E.; Yemini, Shaula (1986). Typestate: A Programming Language Concept for Enhancing Software Reliability. IEEE Transactions on Software Engineering. ISSN 0098-5589 2010年11月14日閲覧。.
- ^ Walton, Patrick (2012年12月26日). “Typestate Is Dead, Long Live Typestate!”. Pcwalton.github.com. 2018年9月5日閲覧。
- ^ Walton, Patrick (2013年1月2日). “Removing Garbage Collection From the Rust Language”. Pcwalton.github.com. 2018年9月5日閲覧。
- ^ Andrew Binstock. “The Rise And Fall of Languages in 2013”. 2018年9月5日閲覧。
- ^ The Rust Core Team (2015年5月15日). “Announcing Rust 1.0 - The Rust Programming Language Blog”. 2018年2月4日閲覧。
- ^ Alex Crichton (2014年10月27日). “rfcs/0507-release-channels.md at master · rust-lang/rfcs”. 2018年2月4日閲覧。
- ^ Aaron Turon (2014年10月30日). “Stability as a Deliverable - The Rust Programming Language Blog”. 2018年2月4日閲覧。
- ^ “Scheduling the Trains”. 2017年1月1日閲覧。
- ^ “Firefox リリースノート Firefox 48.0”. Mozilla Foundation (2016年8月2日). 2016年8月3日閲覧。
- ^ “Firefox に組み込まれた Rust”. Mozilla Foundation (2016年8月2日). 2016年8月3日閲覧。
- ^ “Rust meets Fedora”. fedoramagazine.org (2016年9月21日). 2016年10月6日閲覧。
- ^ a b “Announcing Rust 1.31 and Rust 2018”. 2018年12月17日閲覧。
- ^ “The Plan for the Rust 2021 Edition | Rust Blog” (英語). blog.rust-lang.org. 2021年9月19日閲覧。
- ^ Dave Herman. “Shipping Rust in Firefox”. 2018年1月28日閲覧。
- ^ Serdar Yegulalp. “Mozilla's Rust-based Servo browser engine inches forward”. 2018年1月28日閲覧。
- ^ David Bryant. “A Quantum Leap for the Web”. 2018年1月28日閲覧。
- ^ “Supporting the Use of Rust in the Chromium Project”. Google Online Security Blog (2023年1月12日). 2024年5月29日閲覧。
- ^ “Chromium プロジェクトが Rust の利用をサポート”. Google Developers Japan (2023年2月16日). 2024年5月29日閲覧。
- ^ Salim Alam. “Habitat at RustConf”. 2018年1月28日閲覧。
- ^ Salim Alam. “The Epic Story of Dropbox's Exodus From the Amazon Cloud Empire”. 2018年1月28日閲覧。
- ^ Serdar Yegulalp. “The Epic Story of Dropbox's Exodus From the Amazon Cloud Empire”. 2018年1月28日閲覧。
- ^ Steve Klabnik. “intermezzOS: a little OS”. 2018年1月28日閲覧。
- ^ “Red Hat deprecates BTRFS, is Stratis the new ZFS-like hope?”. Marksei, Weekly sysadmin pills. 2018年1月28日閲覧。
- ^ “Building a Container Runtime in Rust”. (29 June 2017) 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."
- ^ “グーグル、Rust採用で「Android」のメモリーに関わる脆弱性が激減”. ZDNet Japan. 2022年12月6日閲覧。
- ^ “「Linux」、バージョン6.1でRustを導入へ--トーバルズ氏が明言”. ZDNET. 2022年10月18日閲覧。
- ^ “グーグル、Rustで書かれたセキュアなOS「KataOS」を発表”. CNET Japan. 2022年10月18日閲覧。
- ^ “Microsoft、Windows 10の一部をRustへ書き換えてセキュリティ強化狙う”. マイナビ. 2022年12月7日閲覧。
- ^ Valery Vavilov. “As Blockchain Changes The World, Bitfury’s New Platform Exonum is About to Change Blockchain”. 2018年1月28日閲覧。
- ^ Balbaert, Ivo. Rust Essentials. Packt Publishing. p. 6. ISBN 1785285769 21 March 2016閲覧。
- ^ “Using HyperLogLog to Detect Malware Faster Than Ever”. OpenDNS Security Labs. 19 March 2016閲覧。
- ^ “ZeroMQ: Helping us Block Malicious Domains in Real Time”. OpenDNS Security Labs. 19 March 2016閲覧。
- ^ “Piston A modular game engine written in Rust”. Piston.rs. 2017年8月1日閲覧。
- ^ Joseph Birr-Pixton. “ctz/rustls: A modern TLS library in Rust”. 2018年2月4日閲覧。
- ^ “Remacs:Re-Implementing Emacs In Rust”. phoronix.com (2017年1月11日). 2017年1月19日閲覧。
- ^ “Pijul”. pijul.org. 8 July 2017閲覧。
- ^ Google. “xi-editor”. 2018年1月28日閲覧。
- ^ Andrew Gallant (2016年9月23日). “ripgrep is faster than {grep, ag, git grep, ucg, pt, sift}”. 2018年1月28日閲覧。
- ^ Xiph.Org Foundation. “rav1e: The fastest and safest AV1 encoder.”. 2018年5月1日閲覧。
- ^ Parity Technologies. “Parity’s Polkadot Dev Update #2”. 2018年12月5日閲覧。
- ^ “mirakc: A Mirakurun-compatible PVR backend written in Rust”. 2020年8月10日閲覧。
- ^ “Dropbox、4年をかけてRust言語で再構築された新しい同期エンジン「Nucleus」をリリース”. Impress. 2022年12月7日閲覧。