関数 `purecopy`は何のために必要ですか?


23

私はブラウジングしていたがcompile.el、この構造に気づいた:

(defcustom compile-command (purecopy "make -k ")) 

purecopyドキュメントの状態:

purecopyは、「Cソースコード」の組み込み関数です。

(純粋コピーOBJ)

純粋なストレージにオブジェクトOBJのコピーを作成します。ベクトルとコンスセルの内容を再帰的にコピーします。シンボルをコピーしません。テキストプロパティなしで文字列をコピーします。

したがってcompile-command、後日修正が必要になる可能性のある複雑なリストが含まれていることが予想される場合、なぜ必要になるのか理解できたと思います。しかし、それは単なる文字列なので、なぜpurecopy必要なのでしょうか?より一般的には、いつpurecopy必要ですか?

回答:


31

purecopy ユーザー設定やサードパーティのライブラリで必要ありません。実際、通常のEmacsインスタンスから呼び出された場合、何もしませんPure Storageから:

この関数は、Emacsが構築およびダンプされている間を除き何もしません。通常、プリロードされたLispファイルでのみ呼び出されます。

いくつかの背景情報が続きます。

純粋なストレージ

Emacsには2段階のビルドプロセスがあります。最初にプレーンバイナリをビルドしてから、このバイナリを実行し、選択した組み込みライブラリのセットをロードしてから、プロセスのメモリイメージをダンプし、emacsこのダンプから実際のバイナリを作成します。

この複雑なプロセスの理由は、パフォーマンスの向上とメモリ使用量の削減です。重要なEmacs Lispライブラリをプリロードすると、組み込みライブラリをロードするためのIOが不要になるため、起動が速くなります。すべてのEmacsインスタンス間で共有できます。

プリロードされたライブラリを含むこの特定のメモリ領域は「純粋なストレージ」です。前述のメモリ共有を可能にするため、読み取り専用であるため、「純粋」です。したがって、purecopy通常のEmacsインスタンスではノーオペレーションです。とにかく純粋なストレージに書き込むことができませんでした。その結果、純粋なストレージもガベージコレクションから除外されます。

ただし、プリロードされたライブラリのメモリイメージを作成およびダンプする際に、これらのライブラリを使用purecopyして、純粋なストレージに割り当てる特定のオブジェクトをマークできます。通常は、とにかくEmacsの全寿命に必要な頻繁に使用されるオブジェクトです。

純粋なストレージ内の文字列は、本質的にグローバルな静的定数文字列です。ので"make -k"(それも、おそらく今日最も頻繁に使用されるコンパイルコマンドです)Emacsのセッションを実行している中で頻繁に使用されようとしている、それが再割り当てとガベージコレクションの不要なを避けるために、この文字列定数と静的を保つために理にかなっています。

純粋なストレージのこの概念はまた、なぜ修正の理由で.el、いくつかの組み込みのライブラリ(特にのファイルstartup.elsubr.elなど)の効果はありません:Emacsは実際にこれらのライブラリのソースファイルをロードすることはありません。代わりに、バイナリにバイトコードが組み込まれ、特別なメモリ領域からロードされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.