29
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

「試して理解 Linuxのしくみ」のコードをRustに移植してみた話

「試して理解 Linuxのしくみ」

Amazonでは "[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識" という名前になっています。
著者の武内さんのハンドルネームから、sat本と呼ばれることも多い書籍です。

武内さんが配布されているCのコードはこちら、私がRustで書き直したコードはこちらにあります。

以下は、ポエムです。

本の感想

私自身は、Linuxやメモリにそれなりには興味を持っていたので、すごく目新しい内容は、それほど多くはありませんでした。けれども、読んで非常によかったと感じています。
「試して理解」と銘打っているとおり、書かれていることを実際に試して、理解を深められるようになっています。なんとなく聞いたことはあったけれど、実際試したことはなかったものを、実際に試すことができたのは本当によかったです。

なぜRustに移植したのか

  1. 持論として、「プログラムをただ動かすより、写経でもいいから自分で書いた方が力がつく」というのがある。けれど、ただの写経だとつまらないので、Rustに移してみた
  2. 「Rustって、システムプログラミングに適しているって触れ込みだけど、実際どうなん? ぶっちゃけ、Cよりやりやすいの?」を体験したかった

やりやすかったのか?

pros:

  • システムコール呼び出し以外の部分について、CよりもRustの方が書きやすいのは(少なくとも私の中では)疑う余地がない
  • nix というクレートが非常にいい感じのラッパーで、「戻り値が-1じゃないか見て、errno読んで……」とかしなくてもRustのResult型で扱えた(nixのドキュメント)
  • ちゃちゃっとstructを作って、Dropをimplして、ファイルの閉じ忘れがないようにするとか、そういうのができた(ただし、これはCでは難しいがC++ならできる)

cons:

  • ラッパーがなかったり、あんまりいい感じじゃない部分は、自分でがんばって書くことになった
  • CのNUL終端文字列は、ヒープを使わずに作るのは大変(ヒープでもよければCString::new(...)でよさそう)
  • nixioctlマクロがしんどい。sat本で必要なBLKSSZGETioctlマクロで扱う方法は結局分からず、libcioctlを使った
  • nixlibcなどのRustのドキュメントと、Cのドキュメントの両方を参照したくなることが結構あって、二度手間だった
  • 型の扱いが厳格で、とくにvoid*を特別視してくれないのでキャストが面倒だった

結局どうよ?

Rust万歳、で終わらせたかったのですが、やはり、元がCを前提にしたインタフェースである以上、ラッパーに頼らないと便利じゃないし、ラッパーは完全じゃないし、という話になる気がしました。
それでもやっぱり、Resultでエラー処理できるのは本当に便利だと思うし、ラッパーが気に入らなくても自分でそこまで手間かけずに作れるし、悪くはなさそうな感じです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
29
Help us understand the problem. What are the problem?