Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

はじめに

注: 本書のこの版は、印刷版および電子書籍版として No Starch Press から入手できる The Rust Programming Language と同じ内容です。

Rust の入門書である The Rust Programming Language へようこそ。 Rust プログラミング言語は、より高速で、より信頼性の高いソフトウェアを 書くのに役立ちます。プログラミング言語の設計では、高水準の使いやすさと 低水準の制御性はしばしば相反します。Rust はその対立に挑みます。強力な 技術的能力と優れた開発者体験のバランスを取ることで、Rust は、従来その ような制御に付きものだった面倒さなしに、低水準の詳細(メモリ使用量など) を制御する選択肢を与えてくれます。

Rust は誰のためのものか

Rust は、さまざまな理由から多くの人にとって理想的です。とくに重要な グループをいくつか見てみましょう。

開発者のチーム

Rust は、システムプログラミングの知識レベルがさまざまな大規模な開発 チームが協働するうえで、生産的なツールであることを示しつつあります。 低水準のコードはさまざまな微妙なバグを生みやすく、ほかの多くの言語では、 それらは広範なテストと経験豊富な開発者による入念なコードレビューに よってしか見つけられません。Rust では、コンパイラが門番の役割を果たし、 並行性バグを含む、このような見つけにくいバグを含んだコードのコンパイルを 拒否します。コンパイラと協調して作業することで、チームはバグを追い回す のではなく、プログラムのロジックに時間を集中できます。

Rust はまた、システムプログラミングの世界に現代的な開発者向けツールを もたらします。

  • 同梱の依存関係マネージャー兼ビルドツールである Cargo により、依存関係の追加、 コンパイル、管理を、Rust エコシステム全体で手間なく一貫した形で行えます。
  • rustfmt フォーマットツールにより、開発者間で一貫したコーディングスタイルが 保たれます。
  • Rust Language Server は、コード補完やインラインのエラーメッセージのための 統合開発環境(IDE)連携を支えます。

これらやそのほかの Rust エコシステムのツールを使うことで、開発者は システムレベルのコードを書きながらも高い生産性を維持できます。

学生

Rust は、学生やシステムの概念を学びたい人のための言語でもあります。Rust を使って、多くの人がオペレーティングシステム開発のようなトピックを学んで きました。コミュニティはとても歓迎的で、学生の質問にも喜んで答えて くれます。この本のような取り組みを通じて、Rust チームは、特に プログラミング初心者を含むより多くの人に、システムの概念をより身近な ものにしたいと考えています。

企業

大小何百もの企業が、コマンドラインツール、ウェブサービス、DevOps ツール、 組み込みデバイス、音声や映像の解析とトランスコーディング、暗号通貨、 バイオインフォマティクス、検索エンジン、Internet of Things アプリケーション、 機械学習、さらには Firefox ウェブブラウザの主要部分に至るまで、さまざまな 用途で本番環境に Rust を使用しています。

オープンソース開発者

Rust は、Rust プログラミング言語や、そのコミュニティ、開発者ツール、 ライブラリを作りたい人のためのものでもあります。Rust 言語への貢献も ぜひ歓迎します。

速度と安定性を重視する人

Rust は、言語に速度と安定性を強く求める人のためのものです。ここで言う 速度とは、Rust のコードがどれだけ速く実行できるかと、Rust によって どれだけ速くプログラムを書けるかの両方を意味します。Rust コンパイラの 検査は、機能追加やリファクタリングを経ても安定性を確保します。これは、 そのような検査を持たない言語にありがちな、開発者が変更を恐れがちな 脆いレガシーコードとは対照的です。ゼロコスト抽象化――手書きのコードと 同じ速さで低水準コードにコンパイルされる高水準機能――を目指すことで、 Rust は安全なコードも高速なコードであるようにしようとしています。

Rust 言語は、このほかにも多くのユーザーを支えたいと考えています。ここで 挙げたのは、主要な当事者のほんの一部にすぎません。全体として、Rust の 最大の野心は、安全性 生産性、速度 使いやすさを提供することで、 プログラマが何十年にもわたって受け入れてきたトレードオフをなくすこと です。Rust を試してみて、その選択が自分に合うかどうか確かめてみて ください。

この本は誰のためのものか

この本では、読者が何らかの別のプログラミング言語でコードを書いたことが あることを前提としていますが、それがどの言語かは問いません。さまざまな プログラミング経験を持つ人が幅広く読めるように、この内容を構成しました。 プログラミングとは何か、あるいはどう考えるべきか、といったことには あまり多くの紙幅を割いていません。もしプログラミングがまったく初めて なら、プログラミング入門に特化した本を読むほうがよいでしょう。

この本の使い方

基本的には、この本は最初から最後まで順番に読んでいくことを想定して います。後の章は前の章の概念を土台にしており、前の章では特定の トピックの詳細に立ち入らないことがあっても、後の章でそのトピックを 再び取り上げます。

この本には、概念を扱う章とプロジェクトを扱う章の 2 種類があります。 概念の章では Rust のある側面について学びます。プロジェクトの章では、 それまでに学んだことを適用しながら、小さなプログラムを一緒に作ります。 第2章、第12章、第21章がプロジェクトの章で、それ以外は概念の章です。

第1章 では、Rust のインストール方法、「Hello, world!」プログラムの 書き方、そして Rust のパッケージマネージャー兼ビルドツールである Cargo の使い方を説明します。第2章 は、数当てゲームを作りながら Rust で プログラムを書くことを学ぶ実践的な入門です。ここでは概念を高いレベルで 扱い、後の章でさらに詳しく説明します。すぐに手を動かしたいなら、 第2章がそのための章です。次に進む前に細部まできっちり学びたい学習者で あれば、第2章をいったん飛ばして、ほかのプログラミング言語の機能と似た Rust の機能を扱う 第3章 に直接進むとよいかもしれません。その後、 学んだ詳細をプロジェクトに適用したくなったら、第2章に戻ってくることが できます。

第4章 では、Rust の所有権システムについて学びます。第5章 では、 構造体とメソッドを扱います。第6章 では、列挙型、match 式、 そして if letlet...else の制御フロー構文を扱います。構造体と 列挙型を使って独自の型を作ることになります。

第7章 では、Rust のモジュールシステムと、コードおよびその公開 アプリケーションプログラミングインターフェイス(API)を整理するための プライバシーのルールについて学びます。第8章 では、標準ライブラリが 提供する一般的なコレクションデータ構造、すなわちベクタ、文字列、 ハッシュマップを扱います。第9章 では、Rust のエラー処理の哲学と 手法を掘り下げます。 第10章では、ジェネリクス、トレイト、ライフタイムを掘り下げます。これらによって、 複数の型に適用できるコードを定義する力が得られます。第11章は テストについて全面的に扱います。Rust の安全性保証があっても、 プログラムのロジックが正しいことを確実にするためにはテストが必要です。 第12章では、ファイル内のテキストを検索する grep コマンドラインツールの 機能の一部を、自分たちで実装します。このために、 前の章で扱った多くの概念を使います。

第13章では、クロージャとイテレータを扱います。これらは 関数型プログラミング言語に由来する Rust の機能です。第14章では、Cargo を さらに深く調べ、ライブラリを他の人と共有するための ベストプラクティスについて話します。第15章では、標準ライブラリが提供する スマートポインタと、その機能を可能にしているトレイトについて説明します。

第16章では、並行プログラミングのさまざまなモデルを見ていき、 Rust がどのようにして複数スレッドでのプログラミングを 恐れることなく行えるようにしているかを説明します。第17章では、それをさらに発展させて、 Rust の async / await 構文に加え、タスク、future、stream、 そしてそれらが実現する軽量な並行性モデルを探ります。

第18章では、Rust のイディオムが、みなさんがよく知っているかもしれない オブジェクト指向プログラミングの原則と比べてどうなのかを見ていきます。第19章は、 パターンとパターンマッチングに関するリファレンスであり、これらは Rust プログラム全体で 考えを表現するための強力な方法です。第20章には、unsafe Rust、 マクロ、そしてライフタイム、トレイト、型、関数、クロージャに関するさらなる話題など、 興味深い高度なトピックが盛りだくさんに含まれています。

第21章では、低レベルなマルチスレッド Web サーバーを実装する プロジェクトを完成させます!

最後に、いくつかの付録には、この言語に関する便利な情報が、 よりリファレンスに近い形式で収められています。付録 A では Rust のキーワードを、 付録 B では Rust の演算子と記号を、付録 C では標準ライブラリが提供する 導出可能なトレイトを、付録 D では便利な開発ツールを扱い、 付録 E では Rust の edition について説明します。付録 F では 本書の翻訳版を見つけることができ、付録 G では Rust がどのように作られているのか、 そして nightly Rust とは何かを扱います。

この本の読み方に、間違ったやり方はありません。先に進みたければ、そうしてください! 混乱したときには、前の章に戻らなければならないかもしれません。 ですが、自分に合ったやり方で進めてください。

Rust を学ぶ過程の重要な一部は、コンパイラが表示する エラーメッセージの読み方を学ぶことです。これらは、 動作するコードへとあなたを導いてくれます。そのため、 コンパイルできない例も、それぞれの状況でコンパイラが表示する エラーメッセージと一緒に数多く示します。適当な例を入力して 実行した場合、コンパイルできないことがあると理解しておいてください! 実行しようとしている例が、エラーになることを意図しているかどうかを、 前後の本文を読んで必ず確認してください。ほとんどの場合、 コンパイルできないコードについては、正しい版へと導きます。 また、Ferris は、動作することを意図していないコードを見分ける助けにもなります。

Ferris意味
疑問符を浮かべた Ferrisこのコードはコンパイルできません!
両手を上げる Ferrisこのコードはパニックを起こします!
片方のはさみを上げて肩をすくめる Ferrisこのコードは期待した動作をしません。

ほとんどの場合、コンパイルできないコードについては、正しい版へと導きます。

ソースコード

この本の生成元となっているソースファイルは GitHub にあります。