Rust はじめました

スーパーまとめ

 今さらではありますが、Rust の勉強を始めてみました。実際に Rust を勉強した際に参考になったリファレンスなどを書き残しておこうと思います。

 長くなりそうなので以下にまとめておきます。

  • Rust を始めるなら以下の2つが必須
    • プログラミング言語 Rust
      • Rust の基礎について、かなり詳しく書かれている
      • ただし、若干内容が古く例えば impl Trait などはこれを見ても分からないのでやや注意
      • 英語版の方は最新の内容になっている様なので、できれば英語版を読んだ方がよい
    • Rust Language Cheat Sheet
      • プログラミング言語 Rust を読んでも、実際のコードではよく分からない記述が出てくる事がある
      • 何か分からない記述が出てきた時にはこのチートシートから辿れるので助かる
  • 必要に応じてこのあたりも見るとよい
    • Rust by Example
      • 細かいけどコードが出てくる部分の「Reset」が分かりにくい…。Reset を押すとコード全体が見れる模様
    • rust-jp Slack
      • 日本の Rustaceans の Slack。初心者でも色々教えてくれる方がいて助かる
  • Rust はいい言語
    • go やその他言語でもそうだが、crate というライブラリ管理システムがあり、扱いやすい
    • テストも標準でサポートされており、自然な流れで開発ができる
    • 静的型付けでコードを追いやすい(オープンソースプロジェクトだとこれ超大事)
    • 所有権があるためやや複雑な記述が必要になるが、その分、安全性と速度を手に入れており、個人的には見合うコストと思う

何故 Rust を勉強しようと思ったのか

 先日、ILP Summit 2019 という Interledger Protocol に関わる人々が集まるサミットに参加してきました。その中で、ILP の提唱者の一人である Evan Schwartz が interledger.rs という ILP の Rust 実装を紹介し、コントリビュータならんかー!という話がありました。

 よく「1年に1つは新しい言語を勉強すべし」といった話があり自分も最近はそれを意識しているのですが、今年は Rust をやってみるかぁという事で自分も interledger.rs にコントリビュートしたくなったというのが事の始まりです。ここ半年くらい仕事でコードを書けなかったので、そういう意味でもちょうどいいなぁと感じたので、ゴールデンウィークを使ってコントリビュートしてみる事にしました。

勉強法

 上のスーパーまとめでも書きましたが、結論としては勉強法は下記がよいのではないかと思います。

  1. 「The Book(プログラミング言語 Rust)」を全て読む
  2. 分からない記述は Rust Language Cheat SheetRust by Example で調べる

The Book

 誰に聞いてもまずは「The Book(プログラミング言語 Rust)」がよいと言われるので、やはりまずはこれでしょう。最初から最後まで、サンプルコード含めて全て読みました。

 やってみた感想としては、やはりこれは是非やるべきです。理由は、それくらいよくできたドキュメントだからです。ある程度プログラミングをした事がある人であれば全く Rust の事を知らなかったとしても、かなり深いところまで理解できます。特に所有権に関してはメモリの動きを頭の中で想像できなければなりませんが、このドキュメントを読めばだいたい分かる様になると思います。

Rust Language Cheat Sheet

 とは言え、実際のコードを見ていると「なんじゃこりゃ?🤔」といった様な記述が出てくる事があります。そういった場合、Rust Language Cheat Sheet を見るとどういう意味なのかはだいたい分かると思います。

 この辺はちょっと Perl に近いものを感じますね…。結構表現に幅があるというか、色々な書き方ができるのでそれを知っていないと「???」という事になってしまいます。日本語の The Book はやや古く、英語版から少し遅れているというのも理由の1つかもしれません。英語に自信がある方は英語版の方を読んだ方がいいかもしれません。

rust-jp Slack

 日本の Rust 使い(Rustaceans)の Slack があります。初心者用のチャンネルなどもあり、親切な方が色々教えてくれたりします。

 基本的にはいったん自分で調べてみるのがよいとは思いますが、Rust はまだまだ情報も少なく厳しいものがあるというのが正直なところなので、最終的には詳しい人に聞いてみるのも致し方ない気がします。いつか、自分が詳しくなった時にはお返しができるとよいですね。

実際のコードを書く

 いくら The Book で勉強しても、実際に書いてみない事には色々と見えてこない事もあると思います。血肉にするにはそれなりに使ってみなければ難しいですよね。という訳で、実際に GitHub から issue をもらってきて、作業してみました。

 そんなに難しい話ではなくて、HTTP で接続してきたクライアントからのリクエストが一定サイズを超えていたらエラーにするというだけのものです。ただ、ハードルがいくつかありました。

  1. 非同期のライブラリに Futures を利用している
  2. 非同期のネットワークライブラリに Tokio を利用している
  3. HTTP サーバーに hyper を利用している

 つまり Rust 自体に加えて、これも理解できないとコードが書けないという事です。この辺は公式のドキュメントを読んだりしてどうにかしました。まぁ、とは言っても、全てを理解した訳ではないのですが…。

 実際にコードを書いてみて感じた事としては、以下が挙げられます。

  • crate と呼ばれるライブラリ管理システムが扱いやすい
    • crate と呼ばれるライブラリの管理システムがあり、世の中に公開されているものを取ってきたり、自分で作って公開したりする事ができます。使い方もシンプルで簡単だったので、楽だなぁと感じました。
  • テストも標準で簡単に対応できる
    • 個人的にはテストは普通に書きたい人なので、標準的なテストが楽に書けるのは非常に助かります。The Book を読めばやり方は簡単に分かりますので、全く問題ありませんでした。
  • IntelliJ Rust 大好き
    • はじめてのCLion+IntelliJ Rust こちらの記事を参考に使ってみましたが、推論されていても変数の型が見れるので開発がめちゃめちゃ捗ります。加えて、LLDB を利用したデバッグもできるので、何かバグがあった時にも内部で何が起きているのかが非常に分かりやすいです。
    • こんな感じで、推論されている型も表示してくれます。分かりやすくていいですね。
  • やはり静的型付けが好き
    • オープンソースのプロジェクトではやはり特に静的型付けがされている事が重要であると個人的には感じます。オープンソースプロジェクトにコントリビュートする場合、既に存在する巨大なプロジェクトのソースの一部を修正するという非常にハードな作業になりますが、ここで型が分からないとコードが追えずに本当に地獄の様な作業になります。何が起きているのか分からないとどう修正していいのかも分かりません。Rust はそういう意味でコードが追いやすいので、Rust だけの特徴とは言いませんが、これは個人的にはとても助かりました。
  • 確かにやや難しい
    • Rust は変数の所有権という考え方をベースとしてメモリ管理を行っているので、そのためにやや難しい記述をする必要がありますが(難しい記述というよりも色々考えないといけないと言った方がいいかもしれない)、少し慣れれば書けない感じでもないですし、それと引き換えに安全性と速度を得ていると考えれば個人的には十分見合うコストかなと感じています。まぁこの辺は世の中の言語おじさん達の方がよっぽど詳しいと思いますので(汗)これ以上語るのはやめておこうかと思います。

 実際のコードは恥ずかしいのでここには載せませんが(笑)やはり実際に書こうとすると色々つまずく所もあったりしたので、さらに理解が深まり、やってよかったなぁと思います。

終わりに

 最近は go が結構注目されている様に思いますが、書き味は Rust もそこまで大きく変わらない様に感じます。とは言っても、そこまで大規模なコードを書いた訳ではないので、ざっくりそう感じているだけですが。あまり本気で取らないで下さいね(笑)

 一方で、速度はかなり Rust の方が高速の様です。C や C++ と比べても遜色がないですね。以下のサイトを参考にしてみて下さい。

 ただ、非同期系の処理はまだ発展途上の模様で、この辺はいまいちなのかもしれません。まだそこまで使いこなしていないので何ともですが、その様な情報を rust-jp Slack で頂きました。

 という訳でまだまだヒヨッコの Rustacean なのですが、これからも色々と interledger.rs にコントリビュートして Rust 力を上げていきたいと思います。

comments powered by Disqus