実践Rust入門を読んだ

Rustに興味を持っていたところ、著者の一人であるκeen氏*1から献本頂いたのでゴールデンウィークに読みました。全部は読み切れていないですが、紙媒体の発売前に記事を出して応援したかったので今読んでいるところまでの感想を書きます。

Rustに興味を持ったきっかけ

κeen氏とは新卒入社時の同期で、彼はコンパイラとRustの話をよくしていたのでそれをきっかけでRustの存在は認知していましたが、そこまで強い関心は持っていませんでした。

時が経ち、世の中でもRustという言語について言及されることが増えてきた頃にこの本が出版されたので、改めて興味を持ったという感じです。

(2016年にRustのハンズオン会に参加したことがあったのですが、高熱が出てで早退してしまったのでこれは書いたウチに入らないですね。。)

普段書いている言語

普段は業務で書くScalaがメインです。Scalaで広告システムを作っています。あとはたまにスクリプト的にRubyを書くくらいです。C言語は大学の授業で使った程度です。

どんな本なのか?

Scalaを書いている人にはScalaでいうところの「コップ本」に相当すると言うとわかりやすいです。 入門する人、業務等まとまった時間を使って書きたい人が最初に読む本という感じだなと思いました。飽きずに読み進められました!

あとはRustに限らないプログラミング上必要になってくる前提知識が適度に挟まれているのがよかったです。 例えば、標準ライブラリとしてHashMapが用意されていますが、そのハッシュアルゴリズムはSipHashというものが使われています。ハッシュアルゴリズムは簡単なものだとhashdos攻撃という攻撃に対して脆弱になってしまいますが、暗号学的ハッシュ関数を使うことでこの種の攻撃に対して耐性が得られます。(初版 p183) こういった知識がしつこくない程度に入っているのが嬉しいです。

本の構成

目次の一覧は技評のサイトに載っています。

実践Rust入門[言語仕様から開発手法まで]:書籍案内|技術評論社

C言語等何かしらのプログラミング言語を触ったことがあって、とりあえずRustの言語機能的な部分が知りたい人は5章から流し読みを始めるとよさそうです。Rustの所有権の概念についてだけ知りたい人は7章だけで読むとよさそうです。ちなみに僕は1章から順番に8章までと12章を読みました。

1章はRustという言語が流行っているらしいがどんな言語なのかなんとなく知りたい、といった人にとってはありがたいと思いました。初めて聞いたプログラミング言語について調べるときまず適当にググって世の中の情報を集めるとおもうのですが、それがだいたいまとまっている感じです。どんな言語なのかなんとなく知った気になれます。

2-3章ではRustを実行するための環境を構築してVS Code上でコードを書いてみます。僕はPCを横に置いて実際に手をうごかすことはせず、流し読みしました。2章で環境構築をして、3章でバイトニックソートというソートアルゴリズムを実装します。いきなり完全なものを実装するのではなく、Pythonのコードと比較しながら最低限の実装→ジェネリクス→ソート順のカスタマイズ→並列ソートというふうに改善していきます。コードや実行結果が全て書かれているので書いて動かす様子を想像しながら進めました。とりあえず基礎編をひととおり読み進めてからまた戻ってきて見返しながら実際に実装するとよさそうな気がします。性格的な問題もあるかもしれませんが、先が気になるのでひとつひとつ丁寧に確認することはせずにどんどん読み進めめました。

4-5章でデータ型について知ることができます。5章はプログラム上で定義したデータが実行時にメモリ上でどのような扱いがされるのか等書かれているので抑えておいたほうが何か疑問に思ったときに想像がつきやすそうです。

6章が文法系です。特に違和感のあるものはなかったです。初めて見たのはシャドウイングくらいでしょうか。

7章がRustの一番の特徴でもある所有権についてです。さすがにここは初めての概念なので手元で実行しながら復習したほうがよさそうです。所有権による管理が常に強制されるのかと思っていましたが参照カウンタによるリソース管理も用意されているのは便利そうですね。弱い参照も実装されているおかげでオンメモリキャッシュ等も作りやすそうでした。

8,9-11章: トレイトとポリモーフィズム, 実践編です。まだ読んでいません。。

12章はFFI(Foreign Function Interface)についてです。RustからC言語の関数を呼び出したり、C言語からRustの関数を呼び出したりすることができますが、それの実現方法について書かれています。今までプログラミングをしていて他の言語で書かれたコードを呼び出した経験がなく興味があったのと、C言語で実装したものが呼び出せるのであればその他の言語との連携もできるのであろうという想像をしているので方法が気になったので読みました。 RustのコードからするとC言語で実装されている部分は外界なのでRustのプログラミング的な安全性は保証されませんが、unsafeという概念によってRustの言語機能によって守られる部分と守られない部分を明確に扱うことで他言語と連携できることがわかりました。

感想

2年くらいかけて書いたそうなのですが、対象は最新の2018editionについてになっていたり、昨年末に発表されたAmazonのfirecrackerについての言及があったり、常に最新の話題に追従しながら書かれていたんだろうなと思いました。

Scalaで知っていたような概念(タプルとか、トレイトとか)も多少出てきていたので、読んでいてそこまでハードルは感じませんでした。一番大きいのはきっと所有権まわりだと思いますが、まだ書いていないのでそこはこれから学びます。この本をひととおり読んでから手を動かし始めれば何もしらないよりはつまずかないはず、と予想しています。「Scalaでいうところの「コップ本」に相当する」と書きましたが、まだ自分が実際どうだったかはまだわからないものの、数日でひととおり知識としてインプットすることはできたと思うのでRustに入門したい人が周りにいればとりあえず薦めたい一冊です。

ちなみに献本してくれたκeen氏が担当した箇所は自分が読んでいない実践編なので今後ちゃんと読み進めます… m( )m

書籍版

Kindle

*1:kじゃなくてκなのがポイント