Next: , Previous: Building Emacs, Up: GNU Emacs Internals


B.2 ピュアメモリ

Emacs Lispでは、ユーザーが作成したLispオブジェクト向けに 2種類のメモリ、普通メモリ(normal storage)と ピュアメモリ(pure storage)を使います。 普通メモリは、Emacsセッション中に新たに作成されるすべてのデータを置く場所です。 普通メモリに関する情報は以下の節を参照してください。 ピュアメモリは、あらかじめロードした標準Lispファイル群の特定のデータ、 つまり、Emacsの実行中にけっして変化しないデータを収めるために使います。

ピュアメモリは、temacsがあらかじめロードする標準Lispライブラリを ロードしている最中にのみ割り当てられます。 ファイルemacsでは読み出し専用 (これができるオペレーティングシステムでは)と印が付けられ、 当該マシンで同時に実行されているすべてのEmacsのジョブで メモリ領域を共有できるようにします。 ピュアメモリは拡張できません。 Emacsをコンパイルしたときに固定サイズが割り当てられ、 あらかじめロードするライブラリに対して十分な大きさがないと temacsはクラッシュします。 その場合には、ファイルsrc/puresize.hのコンパイルパラメータ PURESIZEを増やす必要があります。 あらかじめロードするライブラリを追加したり標準機能に機能を追加しなければ、 そのようなことは普通は起こらないはずです。

— Function: purecopy object

この関数は、ピュアメモリ内にobjectをコピーしそれを返す。 文字列のコピーでは、ピュアメモリ内に同じ文字の新たな文字列を単純に作る。 ベクトルやコンスセルの内容は再帰的にコピーする。 シンボルなどの他のオブジェクトはコピーせずに無変更でそれらを返す。 マーカをコピーしようとするとエラーを通知する。

この関数は、Emacsを構築してダンプするとき以外ではなにもしない。 普通はファイルemacs/lisp/loaddefs.elでのみ呼び出されるが、 あらかじめロードするとこれを呼び出すようなパッケージも少数だがある。

— Variable: pure-bytes-used

この変数の値は、割り当て済みのピュアメモリのバイト数である。 典型的には、ダンプしたEmacsでは この値は利用可能なピュアメモリの総量にとても近い。 そうでない場合には、あらかじめロードしたライブラリが少ないのであろう。

— Variable: purify-flag

この変数は、defunが関数定義をピュアメモリに コピーすべきかどうかを決定する。 nil以外であると、関数定義をピュアメモリにコピーする。

Emacsを構築中の初期段階ですべての基本的な関数をロード中には (これらの関数を共有してガベッジコレクションの対象にしないように)、 このフラグはtである。 実行形式としてEmacsをダンプするときには、 ダンプ前後の実際の値には関係なくこの変数にはnilを書く。

実行中のEmacsでこのフラグを変更するべきではない。