実行環境をdumpするよ。hibernateするよ。unexecするよ。

言語レベルでの実行状態のダンプやら、GCCのPCH、ILogScript評価関数書き直しとか。の話。


何ヶ月か前、ちょろっと、「実行状態をダンプして中断できる機能」を、言語レベルで実装したらどうか、っていうのを考えてた。
インタプリタ言語だったら、値のほとんどはルートから辿れるハッシュテーブルに入ってるわけでそれをまるごと全部ファイルに書き込めば、あとで読み込むだけで、実行途中のプログラムが再開できるんじゃないかなー、とか、そういった感じだ。
実際にある実装でいうと、EmacsLispのunexecやら、Smalltalkのイメージ保存なんかみたいな機能。


けど、普通のプログラムっていうのは、ファイル開いてたり、ウィンドウ開いてたり、ソケット開いてたりするわけで、なかなか実行途中の状態をまるごとファイルに保存、っていうわけにはいかない。で、僕の中での結論としては、「不可能じゃないけど、ライブラリ作者に多大な負担をかけるうえに、言語自身にも制限がいろいろ付きそうで微妙だな…」って感じだったと思う。


で、そういう話でした、っていうところなんだけど、GCCのPCH(プリコンパイルヘッダね)が、ほぼこれに近いことをやってるっぽいのである。


GCCにはGTYというマクロというか、印があって、それを設定した構造体を含むCソースをgengtypeというプログラムに入れると、GC用のルーチンが生成される、という話は何回か書いてきたとおり。で、この、gengtypeというプログラム、GC用のルーチンだけではなくて、その構造体のダンプ用のルーチンも生成してるようなのだ。


(んんー。何書いてるかわからんな。よーするに、gengtypeは、「グローバル変数から辿れる変数を全てマークする」というルーチンと、「グローバル変数から辿れる変数を全てダンプ(or ロード)する」というふたつのルーチンを生成するわけだ。)


んで、GCCのPCHというのは、この機能を使ってコンパイル途中の「何か実行状態」を、ダンプしただけのものに過ぎなかったのである…多分。


これは、ちょっと「Cのヘッダの中間表現」をダンプするだけにしてはやりすぎのような気もする。こういうことになってるから、PCHファイルのサイズが馬鹿でかくなって、結局ディスクI/Oで遅くなってしまうのではないかな、と思ったりするのだけど、それは別にいいや。せっかく、こんなに汎用的に作ってあるんだから、ILogScriptでもそれを使ってみようかな、と、思ったのである。
コンパイラというのは、ウィンドウも無いし、ネットワークにも繋がないだろう。ファイルを開いてる、といっても、ソースコードぐらいだろう。で、うまくやったらILogScriptにHibernateな機能が実装できるんじゃないか。わからんけど。


とりあえず思い付いただけです。あんなことやこんなことに役立つんではないか。と、思ったりもするけど、どうなるかわからん。やるとしたら、評価器もっかい全部見直しです。というか、ファイルにダンプするんだったら、バイトコードに変換したほうがお得なので、バイトコードコンパイラを書くかもしれない。書かないかもしれない。