#「試して理解 Linuxのしくみ」
Amazonでは "[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識" という名前になっています。
著者の武内さんのハンドルネームから、sat本と呼ばれることも多い書籍です。
武内さんが配布されているCのコードはこちら、私がRustで書き直したコードはこちらにあります。
以下は、ポエムです。
本の感想
私自身は、Linuxやメモリにそれなりには興味を持っていたので、すごく目新しい内容は、それほど多くはありませんでした。けれども、読んで非常によかったと感じています。
「試して理解」と銘打っているとおり、書かれていることを実際に試して、理解を深められるようになっています。なんとなく聞いたことはあったけれど、実際試したことはなかったものを、実際に試すことができたのは本当によかったです。
#なぜRustに移植したのか
- 持論として、「プログラムをただ動かすより、写経でもいいから自分で書いた方が力がつく」というのがある。けれど、ただの写経だとつまらないので、Rustに移してみた
- 「Rustって、システムプログラミングに適しているって触れ込みだけど、実際どうなん? ぶっちゃけ、Cよりやりやすいの?」を体験したかった
##やりやすかったのか?
pros:
- システムコール呼び出し以外の部分について、CよりもRustの方が書きやすいのは(少なくとも私の中では)疑う余地がない
-
nix
というクレートが非常にいい感じのラッパーで、「戻り値が-1じゃないか見て、errno読んで……」とかしなくてもRustのResult型で扱えた(nixのドキュメント) - ちゃちゃっと
struct
を作って、Drop
をimplして、ファイルの閉じ忘れがないようにするとか、そういうのができた(ただし、これはCでは難しいがC++ならできる)
cons:
- ラッパーがなかったり、あんまりいい感じじゃない部分は、自分でがんばって書くことになった
- CのNUL終端文字列は、ヒープを使わずに作るのは大変(ヒープでもよければ
CString::new(...)
でよさそう) -
nix
のioctl
マクロがしんどい。sat本で必要なBLKSSZGET
をioctl
マクロで扱う方法は結局分からず、libc
のioctl
を使った -
nix
やlibc
などのRustのドキュメントと、Cのドキュメントの両方を参照したくなることが結構あって、二度手間だった - 型の扱いが厳格で、とくに
void*
を特別視してくれないのでキャストが面倒だった
##結局どうよ?
Rust万歳、で終わらせたかったのですが、やはり、元がCを前提にしたインタフェースである以上、ラッパーに頼らないと便利じゃないし、ラッパーは完全じゃないし、という話になる気がしました。
それでもやっぱり、Result
でエラー処理できるのは本当に便利だと思うし、ラッパーが気に入らなくても自分でそこまで手間かけずに作れるし、悪くはなさそうな感じです。