stackless VM

stackless pythonなどの「stackless」という語はちょっと語弊がある。それを説明するにはC言語のスタックを説明せねばならない……と思ったが、http://practical-scheme.net/docs/stack-j.htmlを参照するだけで充分だった。stacklessというのはCスタックを使わないということである。

静的 vs 動的

Cスタックは利用後に必ず破壊される。スタックの親子関係を静的に決定できる。通常は一次元配列のスタックになり速度面で有利になる。逆にschemeスタックはGCまで破壊されない。スタックの親子関係を動的に決定する必要がある。通常は木構造のスタックになり速度面で不利になる。
C with POSIXではucontext.hを使って動的なスタックを作成することができる。動的スタックとコピーを上手く組み合わせることにより、継続を明示して扱うこともできるだろう。もちろんucontext.hによる動的スタックはかなり重い処理だが、そういった柔軟性を持たないからこそC言語は速度が出せるということでもある。

直接 vs 間接

もう一つの観点としてスタックのシリアライズがある。例えば、前述したucontext.hによる動的スタックは普通シリアライズできない。C言語ではそのビット列がポインタか数値かを判定する手段がないため、丸ごとメモリダンプする以外の方法ではシリアライズできない。
この部分を間接ポインタやタグつきポインタにすることで、ある程度のシリアライズが可能になる。VMなら完全にシリアライズできるように作るのもあまり難しくない。シリアライズできないCスタックを捨てたstackless pythonなら、継続を通信することさえできるようになった。

stackless pythonで重要なのは、Cスタックを使わないという点ではなく、シリアライズできるスタックを使っているという点だ。シリアライズって大事。