2021/07/31
『Goならわかるシステムプログラミング』

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-AcceptedProposal-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その他についていろいろと発見があって楽しかった。具体的な話は別途。こういう広がり、寄り道がたくさんできて楽しい読書でした。

日付
タイトル

2026/03/14
読んだ本〜2026冬
2026/03/05
聴いてるポッドキャスト
2026/01/30
レンダリング?
2026/01/27
Live
2026/01/26
レンダリング!
2026/01/13
2025年まとめ
2025/09/23
読んだ本〜2025夏
2024/07/24
健康er
2024/02/10
健康
2023/05/19
喪/2
2023/04/24
コンサル
2023/02/01
それはそう
2022/12/17
2022/06/11
動かないもの
2022/06/05
スタイル
2022/04/23
JSX as data
2022/04/08
数学
2021/12/18
Activeな話
2021/09/05
Goのmultiple ABI
2021/07/31
『Goならわかるシステムプログラミング』
2021/07/28
ここにはタイトルが入ります
2021/01/25
これは日記ではない
2021/01/24
修行
2021/01/23
Considered Harmful
2021/01/22
雑感オブSwing
2021/01/21
雑感オブAndroid
2021/01/20
雑感オブiOS
2021/01/19
プログラミング言語その9【Groovy】
2021/01/18
1回休み
2021/01/17
会社を作る
2021/01/16
外国語
2021/01/15
プログラミング言語その8【C】
2021/01/14
プログラミング言語その7【OCaml】
2021/01/13
to be continued
2021/01/12
プログラミング言語その6【Kotlin】
2021/01/11
プログラミング言語その5【Swift】
2021/01/10
プログラミング言語その4【TypeScript】
2021/01/09
プログラミング言語その3【JavaScript】
2021/01/08
Comme d'habitude
2021/01/07
プログラミング言語その2【Java】
2021/01/06
プログラミング以前【Lisp】
2021/01/05
プログラミング言語その1【Objective-C】
2021/01/04
言語処理系入門
2021/01/03
ブログのようなもの
2021/01/02
Next.jsとPHPと私
2021/01/01
新年