注意: 最新版のドキュメントをご覧ください。この第1版ドキュメントは古くなっており、最新情報が反映されていません。リンク先のドキュメントが現在の Rust の最新のドキュメントです。
この最初の章では、Rustとツールについて、はじめの一歩を踏み出します。 最初にRustをインストールします。そしてお決まりの「Hello World」をやります。 最後にCargoという、Rustのビルドシステム兼パッケージマネージャについて学びます。
Rustを使い始める最初のステップはインストールです。 このセクションでは、コマンドでインターネットからRustをダウンロードしますので、インターネットへの接続が必要です。
コマンドを色々提示しますが、それらは全て $
から始まります。 $
を入力する必要はありません。
$
はただコマンドの先頭を示しているだけです。
これから、Web上でも「 $
で始まるものは一般ユーザで実行し #
で始まるものは管理者権限で実行する」というルールに従ったチュートリアルや例をよく見ることになるでしょう。
Rustのコンパイラは様々なプラットフォーム上で動き、また、他のプラットフォーム向けにもコンパイルできます。 しかし、全てのプラットフォームが等しくサポートされているわけではありません。 Rustのサポートレベルは3階級に分かれていて、それぞれ違う保証をします。
プラットフォームは「ターゲットトリプル」という文字列によって識別されます。 これは、どの種類のアウトプットを生成すべきかをコンパイラに伝えるためのものです。 下の表は対応するコンポーネントがそのプラットフォームで動作するかを示します。
1級のプラットフォームは「ビルドでき、かつ動くことを保証する」ものとされています。 特に以下の要求それぞれを満たします。
rust-lang/rust
レポジトリのmasterブランチへの変更はテストが通ってからされるTarget | std | rustc | cargo | notes |
---|---|---|---|---|
i686-pc-windows-msvc |
✓ | ✓ | ✓ | 32-bit MSVC (Windows 7+) |
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級のプラットフォームは「ビルドを保証する」ものとされています。 自動テストは走っておらず、ビルドできたとしてもちゃんと動く保証はありません。 しかし、大抵の場合、ほぼ動きますし、パッチはいつでも歓迎しています! 特に、以下が要請されています。
rust-lang/rust
レポジトリのmasterブランチへの変更は ビルドが 通ってからされる。
これは、標準ライブラリしかコンパイルできないものもあれば、完全なブートストラップまでできるものもある、ということを意味しますので注意してください。Target | std | rustc | cargo | notes |
---|---|---|---|---|
x86_64-unknown-linux-musl |
✓ | 64-bit Linux with MUSL | ||
arm-linux-androideabi |
✓ | ARM 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+) |
3級のプラットフォームはサポートはされているものの、テストやビルドによる変更の管理は行なっていないものたちです。 コミュニティの貢献度で信頼性が定まるので、ビルドが通るかはまちまちです。 さらに、リリースやインストーラは提供されません。 しかしコミュニティが、非公式な場所にリリースやインストーラを作るためのインフラを持っているかもしれません。
Target | std | rustc | cargo | notes |
---|---|---|---|---|
i686-linux-android |
✓ | 32-bit x86 Android | ||
aarch64-linux-android |
✓ | ARM64 Android | ||
powerpc-unknown-linux-gnu |
✓ | PowerPC Linux (2.6.18+) | ||
powerpc64-unknown-linux-gnu |
✓ | PPC64 Linux (2.6.18+) | ||
powerpc64le-unknown-linux-gnu |
✓ | PPC64LE Linux (2.6.18+) | ||
armv7-unknown-linux-gnueabihf |
✓ | ARMv7 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 | ||
x86_64-sun-solaris |
✓ | ✓ | 64-bit Solaris/SunOS | |
i686-pc-windows-msvc (XP) |
✓ | Windows XP support | ||
x86_64-pc-windows-msvc (XP) |
✓ | Windows XP support |
この表は時間と共に拡張されるかもしれないことに注意してください。 これから存在する全ての3級のプラットフォームは網羅していないのです!
LinuxかMacを使っているなら、ターミナルを開いて、以下のように入力するだけで済みます。
$ curl -sSf https://static.rust-lang.org/rustup.sh | sh
訳注: (Rust 1.14.0 以降)
rustup のインストール方法は変更されました。代わりに以下を入力して下さい。
curl https://sh.rustup.rs -sSf | sh
このコマンドでスクリプトをダウンロードしインストールを始めます。 全てが上手くいったなら、以下のように表示されるはずです。
Rust is ready to roll.
訳注:
Rustを使う準備ができました。
(Rust 1.14.0 以降)
全てがうまくいったなら、以下のように表示されるはずです。
Rust is installed now. Great!
Rust はたった今インストールされました。すばらしい!
ここで「はい」の意味で y
を押しましょう。そして以後の画面の指示に従ってください。
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」が、ローカルのハードドライブにインストールされていることを確認してください。
Rustにはプログラムをリンクする機能がありませんので、別途、リンカもインストールしないといけないでしょう。 インストール方法は、お使いのシステムによって異なります。 詳細については、そのシステムのドキュメントを参照してください。
もし上手くいかないなら、様々な場所で助けを得られます。 最も簡単なのは、irc.mozilla.orgの#rust-beginnersチャネルですし、一般的な話題なら、irc.mozilla.orgの#rustチャネルもあります。 どちらもMibbitからアクセスできます。 リンクをクリックしたらRustacean達(我々のことをふざけてこう呼ぶのです)につながりますので、チャット通して助けてもらえるでしょう。 他には、ユーザフォーラムやStack Overflowなどがあります。
訳注: Rustについて、日本語で会話したり、質問したりできる場所もあります。
インストーラはドキュメントのコピーもローカルにインストールしますので、オフラインで読めます。
UNIXシステムでは /usr/local/share/doc/rust
にあります。
WindowsではRustをインストールした所の share/doc
ディレクトリにあります。
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を使っていないのなら
~
は上手く動かないかもしれません。 使っているシェルのドキュメントをあたってみてください。
次に、新しいソースファイルを作り、それを 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では main
を main.exe
と読み替えてください。使っているOSに関わらず、 Hello, world!
の文字列がターミナルに印字されるのを目にするはずです。
目にしたなら、おめでとうございます!あなたは正式にRustのプログラムを記述しました。これであなたもRustプログラマです!ようこそ。
さて、「Hello, world!」プログラムで何が起きていたのか、詳しく見ていきましょう。 パズルの最初のピースがこれです。
fn main() { }fn main() { }
これらの行はRustの 関数 を定義します。
main
関数は特別で、全てのRustプログラムの開始点になります。
最初の行は「引数を取らず、返り値も返さない関数 main
を宣言します」といっています。
引数があれば、括弧((
と )
)の中に入りますし、今回はこの関数から何も値を返さないので、返り値の型を完全に省略できます。
さらに、関数の本体部が波括弧({
と }
)で括られていることに留意してください。
Rustは全ての関数の本体部に波括弧を要求します。
関数宣言と同じ行にスペースを1つ空けて開き波括弧を置くのが、良いスタイルとされます。
main()
関数の中では
println!("Hello, world!");
この行が今回の小さなプログラムの全てを担っています。これがテキストを画面に印字するのです。 ここに重要な詳細がいくつもあります。1つ目はインデントが4スペースであり、タブでない点です。
2つ目の重要な部分は println!()
の行です。これはRustのメタプログラミング機構、 マクロ の呼び出しです。
もし関数を呼び出しているのなら、 println()
のようになります(! がありません)。
Rustのマクロについては、後の章で詳細に議論しますが、今のところ !
を見たら、普通の関数ではなくマクロを呼び出していることを意味する、ということだけ知っておいてください。
次は 文字列の "Hello, world"
です。
システムプログラミング言語では文字列は驚くほど複雑なトピックで、これは 静的に確保された 文字列です。
文字列を画面に印字してくれる println!
にこれを引数として渡します。簡単ですね!
行はセミコロン(;
)で終わります。Rustは 式指向言語 で、ほとんどのものは文ではなく式になります。
;
は式が終わり、次の式が始まることを示します。Rustのコードの大半の行は ;
で終わります。
「Rustのプログラムを書いて走らせる」で、新しく作ったプログラムをどうやって実行するか示しました。 それぞれを分解して手順毎に見ていきましょう。
Rustのプログラムを走らせる前に、コンパイルする必要があります。
Rustのコンパイラはこのように rustc
と入力して、ソースファイルの名前を渡してあげることで使えます。
$ rustc main.rs
CまたはC++の経験をお持ちなら、これが gcc
や clang
に似ていることに気付くでしょう。
コンパイルが成功したら、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というツールを紹介します。
CargoはRustのビルドシステムであり、パッケージマネージャであり、RustaceanはCargoをRustプロジェクトの管理にも使います。 Cargoは3つのものを管理します。それは、コードのビルド、コードが依存するライブラリのダウンロード、それらのライブラリのビルドです。 あなたのコードが必要とするライブラリを、「依存(dependencies)」と呼びます。 なぜならコードがそれに依存しているからです。
最も簡単なRustのプログラムは依存を持たないので、ここではCargoの1つ目の機能だけを使います。 もっと複雑なRustのコードを書くにつれて、依存を追加したくなるでしょうが、Cargoを使えばそれがとても簡単にできます。
ほとんどのRustのプロジェクトがCargoを使うので、本書でもこれ以降はCargoを使うことを前提とします。 公式のインストーラを使ったなら、CargoはRustに同梱されています。 他の手段でRustをインストールしたなら、ターミナルで以下のコマンドを打てば、Cargoがインストールされているか確認できます。
$ cargo --version
バージョン番号が表示されれば大丈夫です。
もし「 コマンドが見つかりません
」などのエラーが出たなら、Rustをインストールしたシステムのドキュメントを見て、Cargoが別になっているか調べましょう。
それでは、Hello WorldプログラムをCargoに変換しましょう。 プロジェクトをCargo化するには3つのことをする必要があります。
main.exe
、他では main
)を削除し、新しいものを作るやっていきましょう!
まずターミナルに戻って、 hello_world ディレクトリに移動し、次のコマンドを打ちます。
$ mkdir src
$ mv main.rs src/main.rs
$ rm main # Windowsなら'del main.exe'になります
Cargoはソースファイルが src ディレクトリにあることを要求するので、まずそうしましょう。 READMEやライセンス情報、他のコードに関係ないものは、プロジェクト(このケースでは hello_world)直下に残したままになります。 このように、Cargoを使うことで、プロジェクトを綺麗に整頓された状態を保てます。 すべてのものには場所があり、すべてが自身の場所に収まります。
では main.rs を src ディレクトリへ移動して、また rustc
でコンパイルして作ったファイルを削除します。
これまで通り、Windowsなら main
を main.exe
に読み替えてください。
今回の例では実行可能ファイルを作るので、 main.rs
の名前を引き続き使います。
もしライブラリを作りたいなら、 lib.rs
という名前にすることになります。
この規約はCargoでプロジェクトを正しくコンパイルするのに使われていますが、必要なら変更できます。
次に hello_world ディレクトリ下にファイルを作ります。それを Cargo.toml
とします。
ここで Cargo.toml
の C
が大文字になっていることを確認しましょう。
そうしないと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.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
とは?cargo build
を実行すると 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 new
をコマンドラインに入力します。
$ cargo new hello_world --bin
ライブラリではなく実行可能アプリケーションを作りたいので、このコマンドは --bin
を渡しています。
実行可能ファイルはよく バイナリ と呼ばれます(なのでUnixシステムでは /usr/bin/
に入っています)。
Cargoは2つのファイルと1つのディレクトリ、 Cargo.toml
と main.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!"); }
Cargoが「Hello World!」を生成したのでコードを書き始められます!
留意: Cargoについて詳しく知りたいなら、公式のCargoガイドを見ましょう。全ての機能が網羅してあります。
この章はこれ以後の本書、そしてあなたがRustを書いていく上で役に立つ基本を扱いました。 ツールについては基本を習得できたので、これ以降は、Rust言語自体を扱っていきます。
2つの選択肢があります。 チュートリアル:数当てゲームでプロジェクトを体験するか、シンタックスとセマンティクスでボトムアップに進んでいくかです。 経験豊富なシステムプログラマなら「チュートリアル:数当てゲーム」を好むでしょうが、動的なバックグラウンドを持つ人なら他方が馴染むでしょう。 人それぞれ学び方は違います!自分に合ったものを選びましょう。