2018/07/04

Rustの特徴とHello, world!

特徴

もともとRustのコンパイラはOcamlで書かれていた。
C++での移譲(ムーブセマンティクス)での問題、変数の参照やポインタでの問題を解決。
Rustでは、代入演算子を明示的にコピー可能と指定しない限り、移譲で行われるようになり、移譲された変数へのアクセスは、コンパイル時に防がれるようになった。
また借用という概念を用いて、すでに解放された変数へのアクセスが起きないようにした。

Rustの特徴として、ゼロコスト抽象化というものがあります。抽象化とは、メモリの番地に名前をつけて変数として扱えるようにすることや、複数のプログラムモジュールから共通する機能を抜き出して一つのモジュールにまとめること、同じ呼び出し規約で複数の異なるプログラムを呼び出せることなどのソフトウェアの設計・開発やプログラミングの概念で、Rustは抽象化を機能させるために安全性とスピードに焦点を合わせ、コストをできる限り小さくするよう設計されているそうです。
最初は厳しいボローチェッカー先生にビシバシしごかれる。それほど安全性を重視している。
と概念ばかり先に読むと、難しく感じてしまうので、とりあえず使ってみましょう。インストールは公式ドキュメントに沿って、自分のパソコン・OSにあったやり方でインストールしましょう。私はLinuxを使用しているので、以下のコマンドでインストールできました。
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
そして環境変数を設定します。私の場合は.profileに以下を追記しました。
export PATH="$HOME/.cargo/bin:$PATH"

Hello, world!

さて、無事インストールできたらさっそく恒例のHello world!を試してみましょう。
$ mkdir myproject
$ cd myproject
myprojectディレクトリにとりあえずmain.rsという名前でファイルを作成し、以下の内容を記述します。
fn main() {
    println!("Hello world!");
}

fnは、functionの略。Rustで関数はこのように書きます。そして、必ず必要なmain関数。私は最初println!を見た時「プリントイン!」と思っていましたが「アイ」ではなく「エル」でした。「プリントライン」だそうです。ビックリマーク「!」がついていますが、Rustではマクロを表しています。またRustでは文字列型の場合はダブルクオートを使います。シングルクオートはcharつまり文字型となります。

そして以下のコマンドでコンパイルされ、実行可能なmainが作成されます。


myproject/$ rustc main.rs
myproject/$ ls
main  main.rs
あとは以下のようにして実行します。
myproject/$ ./main
Hello world!
上記のような簡単なものだとrustcでもよいですが、RustにはCargoというパッケージ管理のためのものが用意されています。Cargoは、コードのビルド・ライブラリのダウンロードとビルドという3つを管理します。また構文やエラーなどのチェックができたり、テストができたりしますので、Cargoを使ったほうが何かと便利です。
$ mkdir myproject
$ cd myproject
myproject/$ cargo new hello
     Created binary (application) `hello` project
myproject/$ ls
hello
myproject/$ cd hello
myproject/hello/$ ls
Cargo.toml  src
myproject/hello/$ cargo run
   Compiling hello v0.1.0 (file:///path/to/myproject/hello)
    Finished dev [unoptimized + debuginfo] target(s) in 5.75 secs
     Running `target/debug/hello`
Hello, world!
以前まで、cargo new hello --binというコマンドで、main.rsが作成され、cargo new helloで、lib.rsが作成されていましたが、現在はcargo new hellocargo new hello --libになりました。
実は、作成されたmain.rsはデフォルトでHello, world!プログラムが記述されています。また同時に作成されるCargo.tomlには、コンパイル時に必須となる情報(name, version, authors)や依存(dependencies)を記述することになりますが、gitをすでにお使いの方は、そちらをもとに作成されるので、authersにはgitの設定の名前とメールアドレスが自動で記述されます。

ローカルでBookを読む

Rustはインストールの際に、実は公式ドキュメントである「The Rust Programming Language」略称TRPLが一緒についてきます。ですので、勉強しようと思っている方や勉強中の方にとっては大変ありがたいことです。表示方法は簡単です。以下のコマンドで表示されます。
$ rustup doc --book
BookはTRPLです。2019年には日本語に翻訳された書籍が出版されました。詳しくはこちらの記事をご覧ください。また
$ rustup doc --std
とすることで、各型や標準モジュールなどの説明を見ることができます。それぞれの項目に[src]と書かれたところがあるのですが、こちらをクリックすると実際のソースコードを見ることができます。

Playground

Rustは、Playgroundというweb上でコードを試すことができる場所があります。これは以外と便利で、例えば勉強を始めたばかりの初心者の場合、分からないコードなどをPlaygroundで書き、RustコミュニティのIRCチャンネルで質問を投げかけたり、返答を受けたりすることができます。ただし、英語で会話することになりますので、私のように英語で上手に伝えることができない場合は、少し悶々とする場合がありますが、皆さん優しいので根気よく答えてくれます。英語ペラペラになりたいものです。質問を投げかけたい場合、時間帯を気にしたほうがよいと思います。時差があるので、時間によっては皆さん眠ってます。