どうも、たくチャレ(@takuchalle)です。

「毎年新しい言語を触ってみよう」という目標をひっそりと立てていて、一昨年はGoで社内のツールを作ったり、去年はFlutter(dart)でアプリをリリースしてみたりしました。

今年はRustを勉強してみようと思ったので、本書を読みました。

なぜ Rust か

Rustは「速度、並行性、安全性」を特徴とし、C/C++に置き換わるシステムプログラミング言語を目指しています。

私は普段C/C++を使って仕事していて、多くのC/C++プログラマと同じようにメモリ解放タイミングやバッファオーバーランなどのバグにずっと悩まされています。 Rustはその課題に対して所有権やライフタイムというアプローチでコンパイル時に早期発見できることに興味を持ったことと、ベアメタルでも使えるくらい低レイヤも視野に入ってることが自分の興味にマッチしたことから、Rustが候補に上がりました。

下記の雑誌のRust特集を読んで写経して、感触も良かったのでRustを選びました。

直近Rustで具体的に作りたいアプリやツールが特にあるわけではないので、LeetCodeの課題を書けるくらいRustを習得できることを目標に本書を読みました。将来的にはOSとかCPUのシミュレータとか書いてみたいなぁとは思っています。

書評

目次はこんな感じです。

第1部 基礎編
 第1章 Rust の特徴
 第2章 はじめての Rust プログラム
 第3章 クイックツアー
 第4章 プリミティブ型
 第5章 ユーザ定義型
 第6章 基本構文
 第7章 所有権システム
 第8章 トレイトとポリモーフィズム
第2部 実践編
 第9章 パーサを作る
 第10章 パッケージを作る
 第11章 Webアプリケーション、データベース接続
 第12章 FFI

第10章と第12章は、必要になった時に読めばいいやと思ったので、それ以外を読んだ時点での書評です。

第1章、2章でRustの特徴やインストール方法などの解説があります。Rustの導入事例を紹介していて、具体的な課題に対してRustを使ってどう解決したのか分かるので良かったですね。あと、Tier2だけどGoogle Fuchsiaも動作保証ターゲットになってることに驚きました。

本書の構成としては、Rustの文法などの説明に入る前に、いきなりRPN計算機(第2章)やバイトニックソート(第3章)を実装する話になるので、他の言語を勉強したことない初学者は面食らうかもしれません。

逆に他の言語の経験がある人はすんなり入れるのではないでしょうか。特にバイトニックソートはPythonのコードを参考にしつつ、最低限の実装から始まり、ジェネリクス対応、クロージャによるソート順のカスタマイズ、並列ソート対応と拡張していく流れなので、Rustを俯瞰しつつ、自身の知っている言語と比較しやすいのではないでしょうか。

第4章と第5章はRustの型についてです。宣言したデータがスタック領域に確保されるのか、ヒープ領域に確保されるのか図を交えて解説してくれるので、非常に分かりやすかったです。性能やメモリマップに影響するので丁寧に説明されていて良いです。

第6章はRustの文法についてですが、文法的にはトリッキーなものはなかったけど、型強制が暗黙的に行われるのでハマりそうだなと感じました。ifmatchが文ではなく式なので、値を返すことを意識したらすっきり書けそう。

第7章はRustの特徴である所有権システムやライフタイムの紹介です。Vecのサブセットを実際に作っていくことで所有権システムを学んでいきます。ここでも図を用いて所有権の状態やメモリの状態を解説してくれるので非常に分かりやすいです。ライフタイムや借用規則の概念は難しいので、今後手を動かしながら理解を深めていこうと思います。

第9章ではここまで学んだことを用いて、より実践的な内容になっていています。再帰降下法を用いてパーサを作っていき、最終的にはインタプリタやコンパイラも作る意欲的な内容になっています。CLIの作り方、テストの書き方やエラー処理方法も学べます。一方で、後半の解説は駆け足だなという印象を受けました。

第11章はざっくりしか読んでないのですが、非同期処理について学べます。async/.awaitバージョン1.39で安定版になりましたが、本書はまだ安定版が出る前に書かれているので注意してください。

本書を読んでLeetCodeの課題が解けるくらいにはなりました。まだ効率的に書けると自信を持って言えるレベルではないですが、コンパイルエラーには落ち着いて対処できるようにはなりました。オンラインドキュメントも読めるようになったので、ガンガン経験を積んでいくつもりです。