6月前半から7月末まで読んでたっぽい。時間かかったのは、睡眠のお供だからというより、たくさん楽しい寄り道をしてたせい。買ったのはずいぶんと前で、積んでる間に版が変わってPDFをDLし直して、そこからさらに1年以上積んである熟成品。
Goは何回か文法ぐらいは一通り勉強してるはずだけど覚えが悪悪で、「え、そんな言語だっけ?」「A Tour of Goに書いてあるやんけ」を定期的に繰り返していて、書かない言語、興味の無い言語はまあ仕方ない。ただ、この本を読んだら、言語処理系としてのGoはだいぶ好きになってきた。書きたくなってきたかは微妙。
どうもシステムプログラミングというのは、やりたくなるかは置いといて、プログラミング言語とOSの機能の間にある自分の好奇心を満たしてくれるジャンルらしい。おそらく、その間にある1トピックである言語処理系が自分の興味のど真ん中で、そのへんも含めて広く主題になってるのが効いている。特にこの本が面白いのは、LinuxだけじゃなくWindowsもmacOSも(その他のUNIXも、さらに別のOSも)ずっとターゲットに入っていることで、へー、なるほどー、うはー、みたいな感じになりつつ、よく分からないこともピンときやすくなっている。
以下、本の内容が発端になって俺が気になった話。本の内容が気になる人は目次を眺めましょう。
Goがlibcを使わずに標準ライブラリの中にシステムコールラッパーを持っているのは、Goへの偏見に合致していて、まあそうでしょう、という感じ。WindowsだけはMSが仕様を公開していないから各種dllを標準ライブラリが読み込んでいる、というのは、なるほどねー。あれ、でもAppleってシステムコールのABIを固定したくないから直接システムコールを呼ばせたくないんじゃなかったっけ?と思って「mac syscalls dylib」でググったら、Appleのドキュメントを再発見できなかったものの、関連するgoのissueを見つけた。(探してたAppleのドキュメントへのリンク Statically linked binaries on Mac OS X もそこにあった。)そのissueの冒頭に
As I understand it, Go currently has its own syscall wrappers for Darwin. This is explicitly against what Apple recommends, precisely because they're not willing to commit to a particular syscall ABI.
とあり、その後の議論はちゃんと読んでないけど、最終的にGoの1.12でlibSystem.dylibが使われるようになってた。
書籍内では数ページ後の、POSIX的にはポータビリティのためにABIじゃなくCの関数に依存したほうがいいけどGoは自前でシステムコール呼ぶことにした、みたいな文脈の註で余談として、macOS用にはシステムコールを直接呼ばなくした変更に触れられてはいた。なんでそんなところの註で……。まあ自分でググって楽しい思いをしたからいいんだけどさ。
もう1つ気になったのはメモリの話で、goroutineは4KBのスタックを使うだけだから軽量ですよ、という話。書籍から離れると、元々はGoは関数の呼び出し規約が引数と返り値についてスタックベースで、それをレジスタベースに変えようとしてるという話があり、それってgoroutine実装にも影響しないのかな?と。メモリの話に限らず、goroutineの実装についてはいくつか読んでみたいなー(と思ってたことを書きながら思い出した)。
まずはこのABI変更のProposalを読むところからですかね。対応するissueには今日の時点ではProposal-AcceptedとProposal-FinalCommentPeriodのラベルがあって、さらにはGo 1.17のリリースノートのドラフトには
Go 1.17 implements a new way of passing function arguments and results using registers instead of the stack.
とあるから、年内ぐらいには出たりするのかな。
最後にもう1つの寄り道。muslというlibc実装の話が、メモリ管理のところのコラムで出てきて、
C言語のランタイムのlibcにはいくつもの実装があります。静的リンク専用でコンパクトさがうりのmuslのmalloc()はとてもシンプルでナイーブな実装になっています。その反面、長時間利用ではフラグメントが起きやすいという欠点があります。
という記述があり、この「静的リンク専用」の意味が分からなくて混乱した。muslって静的リンク専用なの?とりあえず、muslにも動的リンク用の.soはあります。で、この「静的リンク専用」の意味はさておき、この流れでlibcその他についていろいろと発見があって楽しかった。具体的な話は別途。こういう広がり、寄り道がたくさんできて楽しい読書でした。