Programming Rustを読んだ
以下の書籍を読んだので、その感想を書くことにする。 shop.oreilly.com
やっとProgramming Rustを最後まで読み切った〜!雑に読めばすぐだがちゃんと読むと大変だったぞ!!!
— イロノワ (@ironoir) 2018年4月19日
というわけで、タイトルが紛らわしいが、公式のドキュメントである プログラミング言語Rust ではなく、オライリーの書籍である。また、日本語訳はまだ出ておらず、英語版である。
ちょうどいい広さと深さ
Rustに関しては、日本語だと公式のドキュメント以外に書籍で出ているものは見つからず、パイオニアの方々のブログ記事しかググっても出てこないイメージである(もしかしたらあるのかもしれないけど)。網羅的に知りたい人間なので、チュートリアルの次にがっつり読める書籍を探していたところ、今回読んだProgramming Rustを見つけて即購入した。
Prefaceが
Rust is a language for systems programming.
という一文で始まるように、Rustの適用範囲を明確にした上で、サブタイトルである"Fast, Safe Systems Development"の具体的な内容を明らかにしていくという構成になっている。 章立ては以下。
- Why Rust?
- A Tour of Rust
- Basic Types
- Ownership
- References
- Expressions
- Error Handling
- Creates and Modules
- Structs
- Enums and Patterns
- Traits and Generics
- Operator Overloading
- Utility Traits
- Closures
- Iterators
- Collections
- Strings and Text
- Input and Output
- Concurrency
- Macros
- 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も関係するしね。ほんま、これだけのために買う価値がある。
日本語がやたら出てくる
Programming Rustでトレイトの使い分けがわかってきた気がするけど、問題は突然「Great Teacher Onizuka」とか例に出てきて全然落ち着かんこと。Unicodeのとこでも日本語まあまあ出てくるので絶対著者日本好きやんってなってる
— イロノワ (@ironoir) 2018年1月21日
このツイートの通りなのだが、Unicodeの説明でもなぜか日本語(うどんとかそばとか)が多いし、なんとなく嬉しい。他国の人が読むとこれらの文字はどう見えるんだろう、などという興味も湧いたりした。
まとめ
RustはC++に対するcounterpartとして産まれたもの(ですよね?)でありながら、fastとsafeの両立のためにC++とは異なるアプローチで設計されていて、初学者は混乱しがちだというイメージがある。この書籍はその詳細に切り込んだ良い本だと思う。また、公式のドキュメント日本語訳も第2版が出ようとしているものの(contributorの方々には本当に頭が下がります)、内容を見る限りこの書籍の有用性は大きく減ることはないと感じている。おすすめ。というかお仕事やらなんやらでRust書けていないので、できるだけ早く再開したい。