はじめる

この最初の章では、Rustとツールについて、はじめの一歩を踏み出します。 最初にRustをインストールします。そしてお決まりの「Hello World」をやります。 最後にCargoという、Rustのビルドシステム兼パッケージマネージャについて学びます。

Rustのインストール

Rustを使い始める最初のステップはインストールです。 このセクションでは、コマンドでインターネットからRustをダウンロードしますので、インターネットへの接続が必要です。

コマンドを色々提示しますが、それらは全て $ から始まります。 $ を入力する必要はありません。 $ はただコマンドの先頭を示しているだけです。 これから、Web上でも「 $ で始まるものは一般ユーザで実行し # で始まるものは管理者権限で実行する」というルールに従ったチュートリアルや例をよく見ることになるでしょう。

プラットフォームのサポート

Rustのコンパイラは様々なプラットフォーム上で動き、また、他のプラットフォーム向けにもコンパイルできます。 しかし、全てのプラットフォームが等しくサポートされているわけではありません。 Rustのサポートレベルは3階級に分かれていて、それぞれ違う保証をします。

プラットフォームは「ターゲットトリプル」という文字列によって識別されます。 これは、どの種類のアウトプットを生成すべきかをコンパイラに伝えるためのものです。 下の表は対応するコンポーネントがそのプラットフォームで動作するかを示します。

1級

1級のプラットフォームは「ビルドでき、かつ動くことを保証する」ものとされています。 特に以下の要求それぞれを満たします。

Target std rustc cargo notes
x86_64-pc-windows-msvc 64-bit MSVC (Windows 7+)
i686-pc-windows-gnu 32-bit MinGW (Windows 7+)
x86_64-pc-windows-gnu 64-bit MinGW (Windows 7+)
i686-apple-darwin 32-bit OSX (10.7+, Lion+)
x86_64-apple-darwin 64-bit OSX (10.7+, Lion+)
i686-unknown-linux-gnu 32-bit Linux (2.6.18+)
x86_64-unknown-linux-gnu 64-bit Linux (2.6.18+)

2級

2級のプラットフォームは「ビルドを保証する」ものとされています。 自動テストは走っておらず、ビルドできたとしてもちゃんと動く保証はありません。 しかし、大抵の場合、ほぼ動きますし、パッチはいつでも歓迎しています! 特に、以下が要請されています。

Target std rustc cargo notes
i686-pc-windows-msvc 32-bit MSVC (Windows 7+)

3級

3級のプラットフォームはサポートはされているものの、テストやビルドによる変更の管理は行なっていないものたちです。 コミュニティの貢献度で信頼性が定まるので、ビルドが通るかはまちまちです。 さらに、リリースやインストーラは提供されません。 しかしコミュニティが、非公式な場所にリリースやインストーラを作るためのインフラを持っているかもしれません。

Target std rustc cargo notes
x86_64-unknown-linux-musl 64-bit Linux with MUSL
arm-linux-androideabi ARM Android
i686-linux-android 32-bit x86 Android
aarch64-linux-android ARM64 Android
arm-unknown-linux-gnueabi ARM Linux (2.6.18+)
arm-unknown-linux-gnueabihf ARM Linux (2.6.18+)
aarch64-unknown-linux-gnu ARM64 Linux (2.6.18+)
mips-unknown-linux-gnu MIPS Linux (2.6.18+)
mipsel-unknown-linux-gnu MIPS (LE) Linux (2.6.18+)
powerpc-unknown-linux-gnu PowerPC Linux (2.6.18+)
i386-apple-ios 32-bit x86 iOS
x86_64-apple-ios 64-bit x86 iOS
armv7-apple-ios ARM iOS
armv7s-apple-ios ARM iOS
aarch64-apple-ios ARM64 iOS
i686-unknown-freebsd 32-bit FreeBSD
x86_64-unknown-freebsd 64-bit FreeBSD
x86_64-unknown-openbsd 64-bit OpenBSD
x86_64-unknown-netbsd 64-bit NetBSD
x86_64-unknown-bitrig 64-bit Bitrig
x86_64-unknown-dragonfly 64-bit DragonFlyBSD
x86_64-rumprun-netbsd 64-bit NetBSD Rump Kernel
i686-pc-windows-msvc (XP) Windows XP support
x86_64-pc-windows-msvc (XP) Windows XP support

この表は時間と共に拡張されるかもしれないことに注意してください。 これから存在する全ての3級のプラットフォームは網羅していないのです!

LinuxまたはMacでのインストール

LinuxかMacを使っているなら、ターミナルを開いて、以下のように入力するだけで済みます。

$ curl -sSf https://static.rust-lang.org/rustup.sh | sh

訳注: (Rust 1.14.0 以降)

rustup のインストール方法は変更されました。代わりに以下を入力して下さい。

curl https://sh.rustup.rs -sSf | sh

このコマンドでスクリプトをダウンロードしインストールを始めます。 全てが上手くいったなら、以下のように表示されるはずです。

Welcome to Rust.

This script will download the Rust compiler and its package manager, Cargo, and
install them to /usr/local. You may install elsewhere by running this script
with the --prefix=<path> option.

The installer will run under ‘sudo’ and may ask you for your password. If you do
not want the script to run ‘sudo’ then pass it the --disable-sudo flag.

You may uninstall later by running /usr/local/lib/rustlib/uninstall.sh,
or by running this script again with the --uninstall flag.

Continue? (y/N)

訳注:

Rustへようこそ。

このスクリプトはRustコンパイラとそのパッケージマネージャCargoをダウンロードし、/usr/local
へとインストールします。--prefix=<path> オプションを使うことで他の場所へインストール
出来ます。

インストーラは「sudo」下で走るのでパスワードを尋きます。もし'sudo'を使ってほしくないなら
--disable-sudo フラグを渡します。

You may uninstall later by running /usr/local/lib/rustlib/uninstall.sh,
or by running this script again with the --uninstall flag.

/usr/local/lib/rustlib/uninstall.shを実行するかこのスクリプトに--uninstallフラグを
付けて実行することで後程アンインストール出来ます。

続けますか? (y/N)

(Rust 1.14.0 以降)

全てがうまくいったなら、以下のように表示されるはずです。

Rust is installed now. Great!
Rust はたった今インストールされました。すばらしい!

ここで「はい」の意味で y を押しましょう。そして以後の画面の指示に従ってください。

Windowsでのインストール

Windowsを使っているなら適切な インストーラ をダウンロードしてください。

訳注: (Rust 1.14.0 以降)

Windows にインストールするのは同じくらい簡単です。 rustup-init.exe をダウンロードし実行して下さい。コンソールにてインストールが始まり、成功すれば前述のメッセージが出ているでしょう。

他のインストールオプションや情報については、Rust のウェブサイトの インストール ページにアクセスして下さい。

アンインストール

Rustのアンインストールはインストールと同じくらい簡単です。 LinuxかMacならアンインストールスクリプトを使うだけです。

$ sudo /usr/local/lib/rustlib/uninstall.sh

Windowsのインストーラを使ったなら .msi をもう一度実行すれば、アンインストールのオプションが出てきます。

訳注: (Rust 1.14.0 以降)

Rust のアンインストール方法も変更されています。以下のコマンドを入力して下さい。

rustup self uninstall

トラブルシューティング

既にRustをインストールしているなら、シェルを開いて以下を打ちましょう。

$ rustc --version

バージョン番号、コミットハッシュ、そしてコミット日時が表示されるはずです。

表示されたならRustはちゃんとインストールされています!おめでとう!

Windowsを使っていて、表示されないなら、%PATH%システム変数にRustが入っているか確認してください。 入っていなければもう一度インストーラを実行し、「Change, repair, or remove installation」ページの「Change」を選択し、「Add to PATH」が、ローカルのハードドライブにインストールされていることを確認してください。

もし上手くいかないなら、様々な場所で助けを得られます。 最も簡単なのはmibbitからアクセス出来るirc.mozilla.orgにある#rustチャネルです。 リンクをクリックしたらRustacean達(我々のことをふざけてこう呼ぶのです)につながりますので、チャット通して助けてもらえるでしょう。 他にはユーザフォーラムStack Overflowなどがあります。

訳注: TODO:日本語で会話出来るリソースを探す

インストーラはドキュメントのコピーもローカルにインストールしますので、オフラインで読めます。 UNIXシステムでは /usr/local/share/doc/rust にあります。 WindowsではRustをインストールした所の share/doc ディレクトリにあります。

Hello, world!

Rustをインストールしたので最初のRustのプログラムを書いていきましょう。 新しい言語を学ぶ時に「Hello, world!」と画面に表示する小さなプログラムを書くのが伝統で、このセクションでもそれに従います。

このように小さなプログラムから始める利点は、コンパイラがインストールされていて、正しく動くことを素早く確認できることです。 情報を画面に表示することも非常によくやるので、早い内に練習しておくのが良いです。

留意: 本書はコマンドラインをある程度使えることを仮定しています。Rust本体はコードの編集やツール群、 コードの置き場には特に要求を設けませんので、コマンドラインよりIDEを好むならそうしても構いません。 Rustを念頭に置いて作られたIDE、SolidOakを試してみるといいかもしれません。 コミュニティにより多数のエクステンション(機能拡張)が開発されていますし、Rustチームも様々なエディタ向けにプラグインを用意しています。 このチュートリアルではエディタやIDEの設定は扱いませんので、それぞれに合ったドキュメントを参照してください。

プロジェクトファイルを作る

まず、Rustのコードを書くファイルを用意します。 Rustはコードがどこにあるかは気にしませんが、本書を進めるにあたってホームディレクトリ直下に projects ディレクトリを作って、全てのプロジェクトをそのディレクトリ下に入れることをお勧めます。 ターミナルを開いて以下のコマンドを入力し、今回のプロジェクトのディレクトリを作りましょう。

$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world

留意: WindowsでかつPowerShellを使っていないのなら ~ は上手く動かないかもしれません。 使っているシェルのドキュメントをあたってみてください。

Rustのコードを書いて走らせる

次に、新しいソースファイルを作り、それを main.rs としましょう。 Rustのファイルは常に .rs 拡張子で終わります。ファイル名に1つ以上の単語を使うならアンダースコアで区切りましょう。 例えば、 helloworld.rs ではなく hello_world.rs を使うことになります。

それでは、いま作った main.rs を開いて、以下のコードを打ちましょう。

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

ファイルを保存して、ターミナルのウィンドウに戻ります。LinuxかOSXでは以下のコマンドを入力します。

$ rustc main.rs
$ ./main
Hello, world!

Windowsでは mainmain.exe と読み替えてください。使っているOSに関わらず、 Hello, world! の文字列がターミナルに印字されるのを目にするはずです。 目にしたなら、おめでとうございます!あなたは正式にRustのプログラムを記述しました。これであなたもRustプログラマです!ようこそ。

Rustプログラムの構造

さて、「Hello, world!」プログラムで何が起きていたのか、詳しく見ていきましょう。 パズルの最初のピースがこれです。

fn main() { }
fn main() {

}

これらの行はRustの 関数 を定義します。 main 関数は特別で、全てのRustプログラムの開始点になります。 最初の行は「引数を取らず、返り値も返さない関数 main を宣言します」といっています。 引数があれば、括弧(())の中に入りますし、今回はこの関数から何も値を返さないので、返り値の型を完全に省略できます。

さらに、関数の本体部が波括弧({})で括られていることに留意してください。 Rustは全ての関数の本体部に波括弧を要求します。 関数宣言と同じ行にスペースを1つ空けて開き波括弧を置くのが、良いスタイルとされます。

main() 関数の中では

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

この行が今回の小さなプログラムの全てを担っています。これがテキストを画面に印字するのです。 ここに重要な詳細がいくつもあります。1つ目はインデントが4スペースであり、タブでない点です。

2つ目の重要な部分は println!() の行です。これはRustのメタプログラミング機構、 マクロ の呼び出しです。 もし関数を呼び出しているのなら、 println() のようになります(! がありません)。 Rustのマクロについては、後の章で詳細に議論しますが、今のところ ! を見たら、普通の関数ではなくマクロを呼び出していることを意味する、ということだけ知っておいてください。

次は 文字列の "Hello, world" です。 システムプログラミング言語では文字列は驚くほど複雑なトピックで、これは 静的に確保された 文字列です。 文字列を画面に印字してくれる println! にこれを引数として渡します。簡単ですね!

行はセミコロン(;)で終わります。Rustは 式指向言語 で、ほとんどのものは文ではなく式になります。 ; は式が終わり、次の式が始まることを示します。Rustのコードの大半の行は ; で終わります。

コンパイルと実行は別の手順

「Rustのプログラムを書いて走らせる」で、新しく作ったプログラムをどうやって実行するか示しました。 それぞれを分解して手順毎に見ていきましょう。

Rustのプログラムを走らせる前に、コンパイルする必要があります。 Rustのコンパイラはこのように rustc と入力して、ソースファイルの名前を渡してあげることで使えます。

$ rustc main.rs

CまたはC++の経験をお持ちなら、これが gccclang に似ていることに気付くでしょう。 コンパイルが成功したら、Rustは実行可能バイナリを出力したはずです。 LinuxかOSXなら以下のように ls コマンドで確認できます。

$ ls
main  main.rs

Windowsなら、こうなります。

$ dir
main.exe  main.rs

2つのファイルがあるといっています。 .rs 拡張子を持ったソースコードと実行可能ファイル(Windowsでは main.exe 、それ以外では main )。 あとは main または main.exe ファイルを、このように実行するだけです。

$ ./main  # あるいはWindowsならmain.exe

もし main.rs が「Hello, world!」プログラムなら、これで Hello, world! とターミナルに印字することでしょう。

もしRubyやPython、JavaScriptなどの動的な言語から来たのなら、コンパイルと実行が別の手順になっていることに馴れないかもしれません。 Rustは、プログラムをコンパイルして、それを別の誰かに渡したら、Rustがなくても動く 事前コンパイル 言語です。 それと対照的に、別の誰かに .rb.py.js を渡したら(それぞれ)Ruby、PythonあるいはJavaScriptの実装が必要になりますが、コンパイルにも実行にも1つのコマンドで事足ります。 全ては言語設計上のトレードオフです。

単純なプログラムなら単に rustc でコンパイルすれば十分ですが、プロジェクトが大きくなるにつれて、プロジェクトの全てのオプションを管理したり、コードを他の人やプロジェクトと容易に共有できるようにしたくなるでしょう。 次は現実世界のRustプログラムを書く手助けになる、Cargoというツールを紹介します。

Hello, Cargo!

CargoはRustのビルドシステムであり、パッケージマネージャであり、RustaceanはCargoをRustプロジェクトの管理にも使います。 Cargoは3つのものを管理します。それは、コードのビルド、コードが依存するライブラリのダウンロード、それらのライブラリのビルドです。 あなたのコードが必要とするライブラリを、「依存(dependencies)」と呼びます。 なぜならコードがそれに依存しているからです。

最も簡単なRustのプログラムは依存を持たないので、ここではCargoの1つ目の機能だけを使います。 もっと複雑なRustのコードを書くにつれて、依存を追加したくなるでしょうが、Cargoを使えばそれがとても簡単にできます。

ほとんどのRustのプロジェクトがCargoを使うので、本書でもこれ以降はCargoを使うことを前提とします。 公式のインストーラを使ったなら、CargoはRustに同梱されています。 他の手段でRustをインストールしたなら、ターミナルで以下のコマンドを打てば、Cargoがインストールされているか確認できます。

$ cargo --version

バージョン番号が表示されれば大丈夫です。 もし「 コマンドが見つかりません 」などのエラーが出たなら、Rustをインストールしたシステムのドキュメントを見て、Cargoが別になっているか調べましょう。

Cargoへ変換する

それでは、Hello WorldプログラムをCargoに変換しましょう。 プロジェクトをCargo化するには3つのことをする必要があります。

  1. ソースファイルを正しいディレクトリに置く
  2. 古い実行可能ファイル(Windowsなら main.exe 、他では main)を削除し、新しいものを作る
  3. Cargoの設定ファイルを作る

やっていきましょう!

新しい実行可能ファイルとソースディレクトリを作る

まずターミナルに戻って、 hello_world ディレクトリに移動し、次のコマンドを打ちます。

$ mkdir src
$ mv main.rs src/main.rs
$ rm main  # Windowsなら'del main.exe'になります

Cargoはソースファイルが src ディレクトリにあることを要求するので、まずそうしましょう。 READMEやライセンス情報、他のコードに関係ないものは、プロジェクト(このケースでは hello_world)直下に残したままになります。 このように、Cargoを使うことで、プロジェクトを綺麗に整頓された状態を保てます。 すべてのものには場所があり、すべてが自身の場所に収まります。

では main.rssrc ディレクトリにコピーして、また rustc でコンパイルして作ったファイルを削除します。 これまで通り、Windowsなら mainmain.exe に読み替えてください。

今回の例では実行可能ファイルを作るので、 main.rs の名前を引き続き使います。 もしライブラリを作りたいなら、 lib.rs という名前にすることになります。 この規約はCargoでプロジェクトを正しくコンパイルするのに使われていますが、必要なら変更できます。

設定ファイルを作る

次に hello_world ディレクトリ下にファイルを作ります。それを Cargo.toml とします。

ここで Cargo.tomlC が大文字になっていることを確認しましょう。 そうしないとCargoが設定ファイルだと認識してくれません。

このファイルは TOML (Tom's Obvious, Minimal Language ([訳注] Tomの理解しやすい、極小な言語) ) フォーマットで書かれます。 TOMLはINIに似ていますが、いくつかの素晴しい機能が追加されており、Cargoの設定フォーマットとして使われています。

ファイル内に以下の情報を打ち込みます。

[package]

name = "hello_world"
version = "0.0.1"
authors = [ "あなたの名前 <you@example.com>" ]

最初の行 [package] は下に続く記述がパッケージの設定であることを示します。 さらなる情報をこのファイルに追加する時には、他のセクションを追加することになりますが、今のところパッケージの設定しかしていません。

残りの3行はCargoがプログラムをコンパイルする時に必要な情報です。プログラムの名前、バージョン、そして著者です。

これらの情報を Cargo.toml ファイルに追加し終わったら、保存して設定ファイルの作成は終了です。

Cargoプロジェクトのビルドと実行

Cargo.toml をプロジェクトのルートディレクトリに置いたら、Hello Worldプログラムのビルドと実行の準備が整っているはずです! 以下のコマンドを入力しましょう。

$ cargo build
   Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
$ ./target/debug/hello_world
Hello, world!

ババーン!全てが上手くいったら、もう一度 Hello, world! がターミナルに印字されるはずです。

cargo build でプロジェクトをビルドして ./target/debug/hello_world でそれを実行したのですが、実は次のように cargo run 一発でそれらを実行できます。

$ cargo run
     Running `target/debug/hello_world`
Hello, world!

今度はプロジェクトがビルドされなかったことに注意してください。 Cargoはファイルが変更されていないことが分かるので、バイナリの実行だけを行います。 ソースコードを修正していたら、Cargoは実行する前にプロジェクトを再度ビルドし、あなたはこのようなものを目にしたことでしょう。

$ cargo run
   Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
     Running `target/debug/hello_world`
Hello, world!

Cargoはプロジェクトのファイルのどれかが変更されていないか確認し、最後のビルドから変更されたファイルがあるときにだけプロジェクトを再度ビルドします。

単純なプロジェクトではCargoを使っても、単に rustc を使うのとさほど変わないかもしれません。 しかし、将来において役に立つでしょう。 特にクレートを使い始めた時によく当て嵌ります。 複数のクレートで構成された複雑なプロジェクトでは、Cargoにビルドを任せた方がとても簡単になります。 Cargoを使えば cargo build を実行するだけで正しく動いてくれます。

リリースビルド

プロジェクトがリリースできる状態になったら cargo build --release を使うことで、最適化をかけてプロジェクトをコンパイルできます。 最適化することで、Rustのコードは速くなりますが、コンパイル時間は長くなります。 このような理由から、開発の時用と、ユーザへ配布する最終版プログラムを作る時用の、2つのプロファイルが存在するのです。

このコマンドを走らせると Cargo.lock という新しいファイルも出来ます。 中身はこのようになっています。

[root]
name = "hello_world"
version = "0.0.1"

Cargoは Cargo.lock でアプリケーションの依存を追跡します。 これはHello Worldプロジェクトの Cargo.lock ファイルです。 このプロジェクトは依存を持たないので、ファイルの中身はほとんどありません。 実際には自身でこのファイルに触ることはありません。Cargoに任せてしまいます。

できました!ここまでついて来たならCargoで hello_world をビルドする所までできたはずです。

このプロジェクトはとてもシンプルですが、これからRustを使っていく上で実際に使うことになるツール類を色々使っています。 実際、事実上全てのRustプロジェクトに取り掛かる際に、以下のようなコマンドを使うことになります。

$ git clone someurl.com/foo
$ cd foo
$ cargo build

新たなCargoプロジェクトを作る簡単な方法

新たなプロジェクトを始めるのに先の手順を毎回踏む必要はありません! Cargoを使って、即座に開発を始められる骨組だけのプロジェクトを素早く作ることができます。

Cargoで新たなプロジェクトを始めるには、 cargo new をコマンドラインに入力します。

$ cargo new hello_world --bin

ライブラリではなく実行可能アプリケーションを作りたいので、このコマンドは --bin を渡しています。 実行可能ファイルはよく バイナリ と呼ばれます(なのでUnixシステムでは /usr/bin/ に入っています)。

Cargoは2つのファイルと1つのディレクトリ、 Cargo.tomlmain.rs の入った src ディレクトリを生成します。 上で作ったのと全く同じ、見たことのある構成ですね。

これさえあれば始められます。まず、 Cargo.toml を開きます。このようになっているはずです。

[package]

name = "hello_world"
version = "0.1.0"
authors = ["あなたの名前 <you@example.com>"]

Cargoは引数と git の設定を基に Cargo.toml に適当な値を埋めます。 Cargoが hello_world ディレクトリを git レポジトリとして初期化していることにも気付くでしょう。

src/main.rs の中身はこのようになっているはずです。

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

Cargoが「Hello World!」を生成したのでコードを書き始められます!

留意: Cargoについて詳しく知りたいなら、公式のCargoガイドを見ましょう。全ての機能が網羅してあります。

終わりに

この章はこれ以後の本書、そしてあなたがRustを書いていく上で役に立つ基本を扱いました。 ツールについては基本を習得できたので、これ以降は、Rust言語自体を扱っていきます。

2つの選択肢があります。 Rustを学ぶでプロジェクトを体験するか、シンタックスとセマンティクスでボトムアップに進んでいくかです。 経験豊富なシステムプログラマなら「Rustを学ぶ」を好むでしょうが、動的なバックグラウンドを持つ人なら他方が馴染むでしょう。 人それぞれ学び方は違います!自分に合ったものを選びましょう。