ウォームアップ: 環境セットアップ
警告: 本書のコンテナは現在機能していません。後日修正し、CI に追加する予定です。ローカルインストールなど、別の方法でツールチェーンをセットアップしてください。
通常の章末チャレンジの代わりに、ウォームアップを行いましょう: Rust ツールチェーンのセットアップです。 Rust プログラムを書き、コンパイルするために必要なものです。 これをあなたのブートストラップシーケンスだと考えてください!
本書は Linux ホスト上で開発されています。 各章を通じて、再入力(またはコピー/ペースト、右側のボタンに注目してください)して実行できるコマンドが登場します。 次のようなコードブロックリスティング形式です:
whoami
これらのコマンドは、一般的な Linux ディストリビューションを使用していることを前提としています。 一緒に進めるには、2 つの選択肢があります:
-
Linux ネイティブ: ホスト上に、紹介される各ツールを現在の公式ドキュメント(ここではすべてのインストール手順を重複して説明することはしません)またはディストリビューションのパッケージマネージャーを使用してインストールします。ほとんどのツールはセットアップが簡単で、多くの場合 1 つか 2 つのコマンドで済みます。
-
Docker コンテナ: Linux 以外のプラットフォームを使用している場合は、Docker1(広く使われているコンテナ化ツール)をインストールし、本書で提供されている Dockerfile2 を使って自己完結型の開発環境を構築します。
注: コンテナの現在の状態
本書のコンテナサポートは現在作業中です。 将来的には、コンテナは自動的にテストされ、その利用方法に関する詳細な手順が付録に追加される予定です。
現在は、本書のリポジトリ内にシンプルな Dockerfile を提供しています2。
どちらの方法を選ぶにしても、ツールチェーンが動作していることを確認する必要があります。
ツールチェーンを試す
rustup は Rust ツールチェーンの公式インストーラー兼アップデートマネージャーです。
ほかにも、Rust の以下をまとめて提供します:
- コンパイラ (
rustc) - パッケージマネージャー (
cargo) - 標準ライブラリ (
std)
rustup は、stable、beta、nightly という 3 つの「チャネル」からツールチェーンコンポーネントを選択できます。
違いについては第 3 章で扱います。
また、他のプラットフォーム向けにクロスコンパイルするためのコンポーネントを追加することもできます。
第 8 章では、エミュレートされた ARM Cortex-M マイクロコントローラー向けにコンパイルします。
コンテナを使用しない場合は、こちらの手順に従って rustup をインストールできます:
インストールを確認するには、次のコマンドを実行します:
rustup --version
Rust プログラムをコンパイルして実行できることを確認しましょう。
hello_world という名前の新しいプロジェクトを作成するには:
cargo new --bin hello_world
tree hello_world を実行すると、次のディレクトリレイアウトが表示されるはずです:
hello_world/
├── Cargo.toml
└── src
└── main.rs
1 directory, 2 files
Cargo.toml はビルド設定ファイルです。
このプログラムをコンパイルするために編集する必要はありません。
唯一のソースファイルである main.rs の内容を見てみましょう:
cd hello_world
cat src/main.rs
従来の “Hello, world!” プログラムがあらかじめ用意されています:
fn main() {
println!("Hello, world!");
}
コンパイルして実行するには、hello_world ディレクトリ内から次を使用します:
cargo run
コンソールに挨拶が表示されれば、動作するツールチェーンを入手できています!
好みの IDE に rust-analyzer を追加する
rust-analyzer3 は、Rust 向けの Language Server Protocol4 の実装です。
複数のエディタや統合開発環境(IDE)と統合され、次のような便利な機能をサポートします:
- 構文/警告/エラーのハイライト
- コード補完
- 定義への “Goto” 機能
- シンボル名の変更
このようなワークフロー支援機能は、生産性を高めることができます。
言語の初心者にとっても、大規模なコードベースで作業するプロフェッショナルにとっても有用です。
必須ではありませんが、rust-analyzer または同等のもの(いくつかの商用 IDE は同様の Rust サポートを提供しています)をインストールすることを強く推奨します。
rust-analyzer を始めるには、そのマニュアルを参照してください:
任意の Docker ルート
Docker1 は広く使われているコンテナ化ツールです。 コンテナを使うと、環境全体を再現可能かつ信頼性の高い方法で構築・設定できます:
-
産業界では、コンテナはネットワーク接続されたアプリケーションとその依存関係をまとめてパッケージ化し、クラウドインフラストラクチャへデプロイできる状態にします。
-
学術界では、コンテナはプロトタイプや解析をまとめ、研究結果を独立して再現できるようにします。
-
オープンソースソフトウェアでは、コンテナはプロジェクトのビルドを自動化し、現在および将来のコントリビューターにとって参加の障壁を下げます。
私たちの動機は、オープンソースのユースケースに最も近いものです。 特定のプロジェクトをビルドするためのコンテナをセットアップするのではなく、Rust プロジェクトの開発向けに事前セットアップされたコンテナを使用します。
でも、学びたいのは Rust であって Docker ではありません!
現代のソフトウェア開発には、複数のツールやプロセスが関わります。 Docker は、特定のプログラミング言語が解決する問題とは直交する問題を解決します。
本書の文脈では、サンプルを実行し、ハンズオンチャレンジを完了するための、信頼できるサポートされた環境を提供してくれます。 「自分のマシンでは動いた」問題はありません。Windows、Linux、MacOS のいずれを実行していても、同じ手間のかからない体験が得られます。
少なくとも、既存の Docker コンテナをビルドして実行する方法を知っておく価値はあります。
それが本書で扱う Docker の範囲です。
高度な docker の使い方や Dockerfiles の書き方は扱いません。
また、以下の短い説明を除き、Docker の内部についても扱いません。
Docker は実際にはどのように動作するのでしょうか、一言で言うと?
従来の仮想マシン(VM)は、複製によって分離を提供します。つまり、システムのカーネルの上で、[Type 25] ハイパーバイザーの上で、OS カーネル全体を実行します。 これはかなり遅くなります。ホストとゲストという 2 つの OS カーネルに加え、接着剤となるソフトウェアを実行することになるためです。
対照的に、Linux ホスト上の Linux Docker コンテナは、ホストカーネルの特別な機能(“control groups”6 と “namespaces”7)を活用して、あたかも別のファイルシステム上に存在するかのようにコンテナを分離します。 カーネルの複製はありません。
VM と比較すると、分離されたアプリケーションをより高速に実行でき(スループット)、かつ/または単一の物理マシン上により多く収めることができます(密度)。
本書の Docker コンテナを始める
Docker のプラットフォーム固有のインストール手順はこちらにあります:
本書の Dockerfile はこちらにあります:
お好みの IDE には、コンテナーへの接続や管理を行うためのプラグインが用意されている場合があります。 たとえば、VSCode には公式の拡張機能があります:
チェックポイント
先に進む前に、上記の “Hello, world!” プログラムのコンパイルと実行に成功していることを確認してください。 ネイティブ環境でもコンテナー内でも構いません。
次の章では、より興味深いプログラムを書いていきます。読み進めながら作業するには、動作するツールチェーンが必要になります。
-
Docker の概要 Docker (2022年閲覧)。 ↩ ↩2
-
https://github.com/tnballo/high-assurance-rust/blob/main/Dockerfile ↩ ↩2
-
rust-analyzer. rust-analyzer (2022年閲覧)。 ↩ -
Language Server Protocol. Microsoft (2022年閲覧)。 ↩ -
ハイパーバイザー: 分類。Wikipedia (2022年閲覧)。 ↩
-
Linux コンテナーについて知っておくべきすべてのこと、パート I: Linux Control Groups とプロセス分離。Petros Koutoupis (2018)。 ↩
-
Linux コンテナーについて知っておくべきすべてのこと、パート II: Linux Containers (LXC) を扱う。Petros Koutoupis (2018)。 ↩