PPLサマースクール2021「JavaScript処理系とChromeブラウザの実装技術」というイベントに参加することになった。何か予習したいと思って、プログラムを見るとGCの話がけっこうあるので少し勉強した。
GCの話って概要だけ聞いてもあまり面白そうに聞こえないんだよな。「ポインタをたどっていって生きているオブジェクトにマークする、マークのついていないやつは死んでいるから片付ける」と言われてもまあそんなもんかなという感じ。
しかし実装を追ってみるとけっこう面白い。自分はふだんPythonを書いているので、Python (cpython) のGCコードを読んでいる (obmalloc.c) 。『ガベージコレクションのアルゴリズムと実装』に解説があるしソースコードのコメントもかなり詳しいので読みやすい。
Pythonのオブジェクトはintだろうがfloatだろうがヒープに確保される。intを作るたびにmallocを呼んでいては大変なのでそういうことはしない。Pythonのアロケーター (pymalloc) は256Kiバイト領域(アリーナ)単位でメモリを確保しておいて、256バイト以下のオブジェクトについてはその中のどこかに配置される。
こうやってpymallocは基本的に自前でオブジェクトのアロケーションをして、必要なときだけmallocを呼ぶようになっている。リソースを階層化しておいて必要な時だけ下の階層を呼ぶというのは他の分野でもよくあるので面白い。
あとは空き領域の管理には連結リストが使われていたりするのだが (struct arena_object) 、これも面白かった。アプリケーションプログラミングで連結リストを使うことはめったにないがこういうときには便利なんだなーと思ったり。
けっきょくGCというよりはオブジェクトのアロケーションの話になってしまったがこんなところで。