Programming Rustを読んだ

以下の書籍を読んだので、その感想を書くことにする。 shop.oreilly.com

というわけで、タイトルが紛らわしいが、公式のドキュメントである プログラミング言語Rust ではなく、オライリーの書籍である。また、日本語訳はまだ出ておらず、英語版である。

ちょうどいい広さと深さ

Rustに関しては、日本語だと公式のドキュメント以外に書籍で出ているものは見つからず、パイオニアの方々のブログ記事しかググっても出てこないイメージである(もしかしたらあるのかもしれないけど)。網羅的に知りたい人間なので、チュートリアルの次にがっつり読める書籍を探していたところ、今回読んだProgramming Rustを見つけて即購入した。

Prefaceが

Rust is a language for systems programming.

という一文で始まるように、Rustの適用範囲を明確にした上で、サブタイトルである"Fast, Safe Systems Development"の具体的な内容を明らかにしていくという構成になっている。 章立ては以下。

  1. Why Rust?
  2. A Tour of Rust
  3. Basic Types
  4. Ownership
  5. References
  6. Expressions
  7. Error Handling
  8. Creates and Modules
  9. Structs
  10. Enums and Patterns
  11. Traits and Generics
  12. Operator Overloading
  13. Utility Traits
  14. Closures
  15. Iterators
  16. Collections
  17. Strings and Text
  18. Input and Output
  19. Concurrency
  20. Macros
  21. Unsafe Code

導入と概要 1~2章

1・2章が導入だが、2章はいきなりがっつり読むには割と重い気がした。雰囲気をつかめさえすればいったんは次に進んだ方が良いと思う。それ以降を大雑把に分けるとすれば、3~11章までが基礎的な言語要素に関する内容、12~21章が応用的な内容になるだろうか。

基礎 3~11章

最初の難関はやはり4章と5章の所有権周りかと。公式ドキュメントを読んでからだとそれらの知識が補足できるだろうが、個人的にはもう少しライフタイムの内部構造に関して突っ込んでもらえるとありがたかった。

7章ではOptionとResultが顔を出してくる。PanicがいかにSafe側に倒された設計になっているのか、という話も。8章はクレートとモジュールの話。意外とありがたかったのが、ここでcargo testの話が出てくるところ。うろ覚えだが「別に必然性はないけどここで書いとくね」的なことが書いてあった記憶。そういうエコシステム的な話が出てくるのはここだけだが、そういう話が書いてあるだけでありがたい。

応用 12~21章

13章は読んでほしい。Rustは本来言語組み込みっぽい機能をTraitに任せる傾向があって、しかもそれぞれ、名前を見ただけでは違いがわかりにくいが、ここでまあまあ突っ込んで解説されている。14章もClosureとTraitの関係がわかればいろんなことがつながってくるという意味でその続きである。15章のIteratorも同様。IntoIteratorとIteratorがいつもごっちゃになる自分としては、スッキリした。ちなみにこの仕組みってPythonとめちゃ似てるよね(イテラブルオブジェクトとイテレータの違い)。参考にしたんやろな。そしてあのたくさんあるイテレータの便利メソッドも解説されているので、使ってみようかな、という気にさせられた。

17章は文字列の話だが、文字列のメソッドの解説をしている章ではなく(それもあるが)、どちらかというとUTF-8を採用した背景みたいなものが読み取れる興味深い章である。18章は入出力に関してだが、PathやOsStrとかの話が参考になった。

19章は、著者の書き方からして、この書籍のクライマックス感がある。ここまでの章が伏線で、最も"Fast, Safe Systems Development"と相反する歴史を持つ並列処理を、Rustがどのように捌いているのか、ということが語られている。

残りはクールダウンという趣きだが、マクロの実例がJSONパーサだったので実用的で良いなと思った。これは最終章の実例がGitのwrapper作成という点でも同じである。

見どころ

図解が良い

全体に、これがこの本を読んで最も良かった点だ。Vecとslice・Stringとstrの関係はRustやるやつ全員読め、的な感じである。「ゼロコスト抽象化」をどのように実現するのかという文脈もあいまって、fat pointer/smart pointerの実装が、C++Pythonとの差異で図示されるのはめちゃめちゃわかりやすかった。Derefも関係するしね。ほんま、これだけのために買う価値がある。

日本語がやたら出てくる

このツイートの通りなのだが、Unicodeの説明でもなぜか日本語(うどんとかそばとか)が多いし、なんとなく嬉しい。他国の人が読むとこれらの文字はどう見えるんだろう、などという興味も湧いたりした。

まとめ

RustはC++に対するcounterpartとして産まれたもの(ですよね?)でありながら、fastとsafeの両立のためにC++とは異なるアプローチで設計されていて、初学者は混乱しがちだというイメージがある。この書籍はその詳細に切り込んだ良い本だと思う。また、公式のドキュメント日本語訳も第2版が出ようとしているものの(contributorの方々には本当に頭が下がります)、内容を見る限りこの書籍の有用性は大きく減ることはないと感じている。おすすめ。というかお仕事やらなんやらでRust書けていないので、できるだけ早く再開したい。