GenesisとはSBCLがビルド時に生成するCコードのことだと思えばいい。実際にビルドプロセスを走らせると、
src/runtime
ディレクトリ以下にgenesis
ディレクトリが作成され、Lisp構造体からconfig.h
まで必要な設定が生成される。要するにconfigure
スクリプトである。ビルド時に生成するなら設定とか環境依存の値だけでもいいような気がするが、なぜLispオブジェクトの構造体まで生成するのだろうか?
この辺実はまじめにソース(及びコメント)を読んでいないので推測の域を出ないのではあるが、たとえば世代別GCで使われている
generation
構造体あたりのコメントがなぞを解く鍵になるだろう(大げさ)。要約すると、コメントには以下のような記述がある。注意:これの変更をしたら、Lisp側のコードも変更するように!もしくはそこにあるFIXMEに書かれてるようにしてくれ。っで、FIXMEを見る。
注意:GENERATION(とPAGE)はLisp内で定義されてGenesisでヘッダーに書き出されるべきだ。こことgencgc.c
で二重定義なってやがる。
まぁ、要するにランタイム以外の部分って全部Lispで書かれてるから、メンテナンス性を考えると一箇所で定義した方がいいよねって理由だと思う。これだけだと、「ふ~ん」で終わりそうなので(いや、実際書くほどのことはないのだ)、世代別GCに関係するGenesisを多少紹介。
src/compiler/x86/parms.lisp
にLispオブジェクトが割り当てられるヒープ領域がある。定義はこんな感じ。
#!+win32 (!gencgc-space-setup #x22000000 nil nil #x10000)
#!+linux (!gencgc-space-setup #x01000000 #x09000000)
#!+sunos (!gencgc-space-setup #x20000000 #x48000000)
#!+freebsd (!gencgc-space-setup #x01000000 #x58000000)
#!+openbsd (!gencgc-space-setup #x1b000000 #x40000000)
#!+netbsd (!gencgc-space-setup #x20000000 #x60000000)
#!+darwin (!gencgc-space-setup #x04000000 #x10000000)
!gencgc-space-setup
はsrc/compiler/generic/parms.lisp
に定義がある。第一引数はスモールスペースのアドレス(どこで使われてるかは確認してない)、第二引数が動的領域の開始アドレスである。これはX86の固有設定だが、他のアーキテキチャにも同様の定義があり、固定値を使っている。合計4つになるとも思ってなかったけど、これをきっかけにSBCLのソースコードも怖くない、と思って読み手が増えることを願って。
No comments:
Post a Comment