'sqr'atch-note

ちりはつもれど ちりぬるを

『Goならわかるシステムプログラミング』読んだ

  • 2020年から低レイヤー(OS・カーネル)を学んでいて、ちょうどその頃はGolangに手を出したのもあって、一石二鳥な本だなと思って第1版を買ったものの、そのときはインターフェイスの理解が浅すぎたこともあり、io.Reader, io.Writerの章が殆ど分からず挫折して積読してしまっていた。今年9月からGolangの学習を再開してインターフェイスは前よりも分かったと思うので、積んであった本書をようやく読み直した。3年も寝かせている間に第2版が出たので、そちらを書い直して読んだ。
  • 本書は、Golangを用いたシステムプログラミング入門の本。
    • 文法の話は書かれていないが、Golangに限らずその他の言語に慣れていれば読み進めるのに支障はないと思う。システムプログラミングに興味がなくてもプログラマーであれば、OSに関する知識は持っていて損はないので、そういう意味ではプログラマー全員に向け?
    • 本書ではシステムプログラミングの意味として「OSの提供する機能を使ってプログラミングすることをシステムプログラミングと定義」(p.1)している。
    • じゃあ、OSが提供する機能とはなにかというと、プロセスの管理(生成、スケジューリング)、メモリ、CPU、ファイルシステム、ネットワーク通信といったものがあり、本書はHTTPサーバの実装を通じてTCP/UDPのネットワーク通信、そしてファイルシステム、プロセスの操作とプロセス間通信、メモリ管理を取り扱う。
    • ただし、それらを扱うのは5章以降であり、まずは2~4章でそれらOS機能を取り扱うためGolangに用意された抽象化レイヤーであるio.Writer、io.Reader、チャネルを解説している。本書を頭から読んでいくと、序盤が非常に抽象的で難しく感じると思うので、2~4章はまずはざっくり流し読みして、5章以降を読んでいろいろ試してから、2~4章を読み返すという読み方が良いかもしれない。
    • 本書には、加えて、Golangの特徴でもある並列処理の機能goroutineの解説も2章を割いてある。
  • 全19章もあって結構ボリュームがあり、5章以降の実際にOS機能をGolangで使ってみる部分がシステムプログラミングを題材とする本書のメインパートだと思うけど、個人的にはio.Writer, io.Readerとチャネルを解説する2~4章がけっこう重要な箇所だと思ってて、残りの章はそれら3機能を使った実践編みたいなイメージ。とはいえ、io.Writer, io.Readerインターフェイスとチャネルは抽象的な概念な感じがあって理解しづらい気がするので、実践編をやることで手を動かして理解が進むと思う。
    • io.Writer, io.Readerインターフェイスを使うことで、相手がプロセス、ネットワーク、ファイルシステムであったとしても、読み書きという処理で扱えるよう抽象化されてる。これは、Linuxがデバイスの操作、プロセス間通信、データ読み書きをすべてファイルへの読み書きとして抽象化しているというのとほぼ同じことなのかなと。
    • 正直、io.Writer/Readerが理解できたか?というと自信がないが、ひとまず読み書きをしたいとなったら、io.Writer/Readerインターフェイスを満たすものを準備して、Write()/Read()メソッドを呼び出せば良いという感じで一旦は理解した。
  • 本書の冒頭でも書いてあるが、システムプログラミングと言うと、システムコールを使ってプログラミングしていくというのがイメージが一般的。となると、特定のOSに縛られることになるけど、本書はクロスコンパイル可能なGolangを使ってLinuxWindowsのOSが提供する機能を統一的に扱っており(これがio.Reader/Writerインターフェイスの有り難さだと思う)、OSの機能を使うためのより汎用的な知識が身につけられるように思う。
    • システムコールを直接扱ってプログラミングする本は、Linuxに限って言うと『ふつうのLinuxプログラミング』があって、これは非常に面白いので、実際にシステムコールを使ったプログラミングをやってみたいと思ったら読んでみると良いかもしれない。