Rのつく財団入り口

ITエンジニア関連の様々な話題を書いているはずのブログです。

【感想】『手を動かして考えればよくわかる高効率言語 Rust 書きかた・作りかた』:クジラ本でRustの世界へ

【感想】『手を動かして考えればよくわかる高効率言語 Rust 書きかた・作りかた』:クジラ本でRustの世界へ

今年2022年1/21に出た、ほとんど最新のRust言語本の読書記録です。

Chapter1 PythonからRustへ準備体操

 まずはストレッチ、FizzBuzz問題や九九の表、フィボナッチ数列など小粒なテーマで入門していきます。各セクションでお題のPythonのコードとRustのコードを両方示しながら進み、とても分かりやすいです。これなら挫折せずに進められそうと感じられます。

Chapter2 Rustで簡単ツール作成編

 ビルド+ライブラリ管理を賄う神ツールのCargoにも入門し、様々なツールを作っていきます。こちらも必ずPythonとRustのコードが並べてあって両方の学びになります。
 お題もさまざまで面白いです。最初の迷路の自動作成なんかは言われてよく見ると2次元座標に記号を配置してテキスト処理で出力しているだけなのにちゃんと迷路になっています。あーこうやるとできるのか!感があります。昔のパソコンゲームのダンジョン作成みたーい(RPG脳)

Chapter3 – 文法編 – 所有権システムとデータ型について

 このあたりから本格的になってきてテキストの解説も増えてきます。Rust習得の鬼門と言われる所有権周りが、ワイングラスに例えて解説されていてここがとても分かりやすいです。
 文字列型の操作はどのプログラミング言語でも基本ですが、本書でもかなり詳しく解説してあってありがたいです。String型とは別に&strがあったり、このへんRustは独特ですね。文字列操作のユーティリティクラス...じゃなくて関数を集めたモジュールみたいなのを作りたくなってきたけど実際に使っている方々はどうやっているのでしょうか。

Chapter4 – 文法編 – メソッド・ジェネリクス・トレイトについて

 引き続き文法編。トレイト(trait)周りはJavaを始めとするオブジェクト指向言語のインターフェースや抽象クラスと似ているので、ここはだいたい分かりました。恐らく多くの読者の方が同様ではないでしょうか。
 自分的にはこんなめんどくさい書き方してどういう時に使うんだ?と思いつつ情報処理試験でだけ学んで現場では結局使うシーンもなかった「逆ポーランド記法」が本書では登場して目を引きました。
 逆ポーランド記法の電卓アプリも作成していきます。これを見ると逆ポーランド記法プログラミング言語と親和性と高いのが分かります。理屈が分かるとかなり短いコード量で電卓が実現できてしまい、今になって感心しました。

Chapter5 画像/音声/ネットワーク

 このあたりから応用的な使い方になってきます。
 まずは画像用クレートimageを使った画像処理。これもやり方を知るとけっこう簡単にできてしまいます。
 音楽用のクレートHoundを使って波形の音を出したりドレミの音を出したりして、オーディオエディタのAudacityで結果を見たりします。往年のDTM制作やボカロ楽曲制作みたいなノリになってきて面白い。

 後半のWebアプリ開発ではWebアプリケーションフレームワークで代表的なActix Webの他にもうひとつ、tideも題材にして簡単な使い方が載っています。

 音楽なんかは特にRustと縁が遠そうだったのですが、Rust言語でこんな遊びもとい使い方もできてしまうんだなあと分かる章でした。このへんになっても比較的短いコードで実現できるテーマが選んであり、秀悦ですね。

Chapter6 応用編 メモリ管理と他言語連携

  • 実は自分でも自作できるマクロの作り方。
  • 単方向リストやメモリ参照カウンタなど、Rustの基本原則である所有権の制限を一部超えられるようなデータ構造も実は作成可能!
  • 「パーサージェネレーター」を活用すると、入力文字列を文法に従って処理してほぼ自作言語と同じようなこともできる。関数の引数に与える文字列にその言語仕様のコードを与えて結果を得る、四則演算アプリの例。
  • 他の言語とやりとりできるFFIの例として、C言語の関数をRustから呼ぶ、逆にRustの関数をCから呼ぶ方法の例。
  • WebAssemblyを使ってビルド、HTML+JavaScriptの画面からRustの関数を呼んでJS関数より高速に処理
  • 非同期処理。クレートのtokioが有名。
  • 暗号化用途にもクレートがある。
  • クレートを使って暗号化・復号化 同じファイルにテストコードも書けて便利。
  • この暗号・復号の関数をWebAssemblyを使ってHTML+JSの画面から呼び出し、Web画面で確認可能に。

などなど、応用的なところ。この応用編になると一読では理解しきれない難しいコードもありましたが、ほとんどオリジナル言語作成みたいな動きまでできるのが凄い。いやはや奥が深いです。
 暗号化回りもライブラリなしで基本機能の中で既に備えているGo言語ほどではないですが、Rustでもいろんなクレートで大抵のことはできそうというのが分かります。

まとめ:小さな単位で挫折せずに気長に進められるRust入門書

 電子版でコツコツ読み終わった後に一度本屋で物理本を見たところ、意外とボリュームがあっておっこんなぶ厚い本最後まで読んでたのか...と逆にびっくりしたりしました。
 中は全6章、さらに各章の中が7~10個のセクションに分かれていてそれぞれテーマが別になっており、少しづつ読み進められます。図も豊富で、難解な学術書ではなくライト寄りな姿勢で入門者に分かりやすく解説されています。
 お題がある→Pythonならこう書く→Rustだとこうなる という流れが多いので、Pythonを知ってるけど普段あまり使ってない人(僕とかw)には「これPythonでどう書くんだっけ?」も復習できてしまう、逆コンパイラ的な発想ですが1冊で2言語学べてしまうオトクな本ではないかと思いました。

 またテーマの選び方も秀悦で、比較的短いコードで実現できて遊べるいろんな小粒のテーマが詰まっています。Rustに限定せずプログラミング教育の題材にも使えるのではと思いました。かなり読みやすいのでRust言語は難しそうだなあと尻込みしている方にもおススメです。

入門本として定番の歯車本『実践Rustプログラミング入門』の作者さんのブログでも高評価でした。

blog-dry.com