ハウテレビジョンブログ

『外資就活ドットコム』『Liiga』『Mond』を開発している株式会社ハウテレビジョンのブログです。

Rustに入門した理由、チュートリアルの過程と感想

弊社ハウテレビジョンでは、週の1日をR&D dayとして、業務と直接関係しない技術を学んでみたり、今まであまり触れてこなかった領域を調べたりしています。

今回は複数人で集まってRustのチュートリアルを読み進め、実際に簡単なコードを組み、動かしてみました。
結果として、今から入門するのに向いた言語で、特に今まであまり多くの言語を触ったことのない方にお勧めできる、ということが分かりました。

f:id:itamisky:20170412104405p:plain

なぜRust?

Rustでは、通常のWebアプリケーション開発ではあまり気にすることのない、低レベルな処理を学べます。
また、いわゆる関数型言語の特徴を取り入れているためそのパラダイムを学んだり、静的型付けに慣れることができます。

C++やHaskellといった言語を触ったことのある人にはお馴染みですが、RubyやPythonしか触ったことがないというメンバーもいますので、これを気にまとめて学んでしまおうという寸法です。

利点をまとめると以下になります。

  • メモリの状態を意識できるようになる
  • 静的型付けに親しめる
  • 様々なパラダイムに触れることができる(特に関数型)
  • WebAssemblyで使えるかもしれない
  • 最近の話題についていける

このように多くの利点がある便利な言語ですので、Rustを選択しました。

以下では実際にチュートリアル(+ 一部リファレンス)を読んだ過程と、入門をおすすめする理由を記載してゆきます。

やったこと

Rustの公式チュートリアルを読み進め、実際にサンプルを動かしたり、改変したりしました。
公式ドキュメント https://doc.rust-lang.org/book/ を読んで進めてゆきました。

導入

まず、Rustの言語思想が述べられています。
「安全性」「速度」「並列性」をガベージコレクタ無しで実現するとのことで、肝になるメモリ管理をどうするのか、幾つか推測が話されました。

なお、組み込み環境が利用目的に入っているためか、対応プラットフォーム一覧がとても充実しています。
https://forge.rust-lang.org/platform-support.html

環境構築は、全員Macユーザーなので、brew install rust で簡単に導入ができました。

Hello World!

単純なプログラムですが、なかなか重要な情報が詰まっていました。
println!は関数ではなくマクロだということや、インデント・スペースの規約がさらりと述べられていたりします。

コンパイラの説明も、Rubyなどの動的言語しか触ったことがない人のため懇切丁寧に書かれており、入門に向いています。

続いて、ビルドツールであるCargoの説明が入ります。
cargo runcargo new といった便利なコマンドが紹介されました。
公式で用意されており、rails new の便利さに慣れてしまった我々も安心の親切設計です。

なお、作成されたtarget ディレクトリの中を覗いてみましたが、ディレクトリ名を見ただけでそれがどのようなものか分かる、綺麗な構造になっていました。
「依存関係にあるライブラリはここに入る」
「debugとreleaseビルドがある」
「インクリメンタルビルドをする」
などの後々説明が入る特徴もディレクトリ名を見るだけでおおよそ推測でき、ツールへの安心感が芽生えました。

数あてゲームのチュートリアル

ライブラリの読み込みや変数束縛やimmutabilityなどの説明が入り、いよいよコーディングに入ります。
紹介されているのはおおよそ他の言語でおなじみな機能ですが、懇切丁寧に説明されているので初見でも理解が進みます。

一部、パターンマッチや所有権の話も出てきますので、関数型やC++に触ったことが無いと少し理解が大変でした。

所有権はサンプルコードを書き換えて、内部の仕組みを推測しながら進めました。
「コピー渡しなのか、参照渡しなのか」の判別は少し疑問が残りましたが、後ほどCopy traitや所有権の詳細ページで出てきて氷解しますので、とりあえず先に進むことをおすすめします。

基本的な所を見てゆき、読み終わった後は簡単なプログラム(FizzBuzzなど)を各自作成しました。

面白かった点
色々いじってみた中で、以下のコードが生まれました。
後々ドキュメントを読み進めてゆくと出てくるのかと思いますが、挙動が面白かったです。

// plus_twoとして、plus_oneと同じ型の関数を用意する

let mut f: fn(i32) -> i32 = plus_one;
f = plus_two;  // ok!

let mut f = plus_one;
f = plus_two;  // error!

実際に動かすとコンパイルエラーが出るので、そのメッセージを見ると原因が分かります。
是非試してみてください。

チュートリアルの後

ここからは、各機能の詳細ページです。
「4.1 Variable Bindings」〜「4.8 Ownership」まで読み進めました。
特にOwnershipのページは今までの謎が解ける感覚がありますので、Rustの入門としては外せないページでした。
メモリ管理関連のページは3つに分かれており、残り2つも読むことが強く推奨されています。

是非次回は続きから読み進めたいところです。

言語周辺で良いと思ったところ

チュートリアルを終えて、言語の周辺で良いと思った点をまとめます。

  • ドキュメントが面白い & 懇切丁寧
    • 「その説明、いる?」というレベルの丁寧さ
    • ちょくちょく茶番が入る
  • インストールが楽
  • 便利なビルドツールが用意されている
    • ディレクトリ構造が分かりやすい
    • 新規プロジェクト用のコマンドが用意されている

言語の強力さ」「開始のお手軽さ」「ドキュメントの丁寧さ」を兼ね揃えており、これから学習するのに向いている言語だと感じました。

進め方についての感想

新しい言語を使うのに際し、リファレンス的にドキュメントを参照して学習を進めることもありますが、今回はドキュメントに沿って進めたため以下のような感想が挙がりました。

“新しい言語を学習する際に、チュートリアルを丁寧になぞるという事をあまりしないので、よい経験になった。複数人で読み合わせすることにより、理解があいまいな箇所、解説の意味・意図を勘違いしてしまうことを防げたと思う。” (20代 / 男性)

一方で、全員で同じドキュメントを読み進めたのみでしたので、以下の改善案も挙がっています。

“皆で同じことをやるのも良いが、アウトプットが似たり寄ったりになってしまうので、次はもくもくタイムと簡単な発表の時間を設けても良いかもしれない。” (20代 / 男性)

そのため、ある程度の時間を確保し、自習や好きなものを作ってみる時間を取るのが良さそうです。
時間を見積もるのは難しいですが、お題を先に決めておいて、それをどのように実装したか、発表とレビューを行うのも良いと思いました。

同じようにドキュメントを読まれる際は、是非参考にしていただければと思います。

まとめ

今回はRustのチュートリアルを利用し、入門してみました。

今までRailsやJSだけ書いてきた、という方にもお勧めな入門しやすい言語だと思います。
他の言語を学んでみたい場合のご参考になれば幸いです。

おまけ
ハウテレビジョンでは、プログラミング言語の好きな仲間を募集しています。
Webエンジニア
エンジニアインターンシップ