19. Gauche Schemeのスタックとヒープのハンドリング
ゲスト: 川合史朗 (@anohana)
川合史朗さんが作っているScheme処理系Gaucheの実装について、特にメモリ管理やクロージャ、継続の実装などに焦点を当てて話をしました。最近のCPUでは単純にJITしても速くならない理由などについても話をしています。
速度 x1.0
(遅く /
速く)
-15秒 /
-5秒 /
+5秒 /
+15秒
この時点にリンク
この時点にリンク
TCFMはサポーターの投げ銭によって収益を上げています。 このコンテンツに課金してもいいよという方はぜひクリエイター支援サイトPatreonから登録してご協力ください。
0:00 | イントロ |
1:06 | Schemeのストレージモデルではすべてが無限エクステント |
4:34 | 関数呼び出しのモデルとアクティベーションレコードのアロケーション |
9:20 | SPARCのレジスタウィンドウ |
12:41 | Alphaの速さの秘密 |
14:11 | 大コケしたIntel Itaniumプロセッサ |
16:55 | GoのGC停止時間の劇的な改善 |
20:14 | ページテーブルのダーティービットをユーザプログラムから使う話 |
23:07 | Goの分割スタック機能 |
25:54 | クロージャを作ったときに使ってない変数を不必要に掴んでしまう問題 |
27:44 | 32ビットハッシュ値を大量に作ると32ビットマシンで偽ポインタがたくさんできてしまう問題 |
33:00 | 決してreturnしないCプログラムにコンパイルするScheme処理系 |
41:23 | タグ付きポインタ |
46:10 | C言語の仕様を満たすためのBoehm GCの機能と、それを使いたくない理由 |
50:30 | 64ビット浮動小数点数をなるべくヒープにアロケートせずに扱いたい |
55:27 | 16ビット"Brain"浮動小数点フォーマット |
56:44 | Gaucheの正規表現エンジン |
1:00:19 | Scheme→C→Schemeという呼び出しをした先で継続を取得すると限定継続になる |
1:04:44 | Schemeスタックからヒープへのコピー |
1:05:50 | 末尾呼び出しはスタックを消費しないように手続きを呼び出す |
1:10:29 | Chez Schemeでは多値ありと多値なしの2つの継続を渡す |
1:13:16 | 最近のCPUの分岐予測の賢さとMeltdown & Spectre |
1:20:08 | Gaucheを単純にJIT化してもCPUの分岐予測が賢いのでそれだけでは速くならない |
1:25:05 | 社会的や経済的理由で速くなる言語 |
1:27:29 | リテラルで書けるオブジェクト |
1:28:32 | 正規表現リテラル |
1:30:55 | マップのリテラル |
1:36:41 | Gaucheのハッシュテーブルとハッシュ衝突攻撃 |
1:39:24 | TCFMの難易度 |
- Gauche Scheme
- ハッカーと画家(川合さんが翻訳した本)
- SISC Scheme
- メモリのローカリティ
- SPARC
- DEC Alpha
- Itanium (IA-64)
- VLIW命令セット
- HamajiさんによるGCフレンドリーなスタック塗りつぶしの話
- Clojure(JVMで動くLisp)
- Chicken Scheme
- Azul Systems(並列Javaマシンを作っていた会社)
- Hans Boehmによる保守的GC安全なデータ構造についての論文 (PDF)
- Cheney on the M.T.A.
- History of T
- タグ付きポインタ
- 16ビット"Brain"浮動小数点フォーマット
- Russ CoxによるThompson NFAの解説
- Anton Ertlらによるmemcpyを使ったJITの手法の論文 (PDF)
- 末尾呼び出し最適化
- セキュアで速いハッシュとしてデザインされたHighwayHash
追記
- CPythonはリファレンスカウンタを使っていますが、Pythonの言語仕様自体では必須とはされていません。