Next: , Previous: , Up: Byte Compilation   [Contents][Index]


16.3 ドキュメント文字列とコンパイル

Emacsがバイトコンパイルされたファイルから関数や変数をロードする際、通常はメモリー内にそれらのドキュメント文字列をロードしません。それぞれのドキュメント文字列は、必要なときだけバイトコンパイルされたファイルから“ダイナミック(dynamic: 動的)”にロードされます。ドキュメント文字列の処理をスキップすることにより、メモリーが節約され、ロードが高速になります。

この機能には欠点があります。コンパイル済みのファイルを削除や移動、または(新しいバージョンのコンパイル等で)変更した場合、Emacsは以前にロードした関数や変数のドキュメント文字列にアクセスできなくなるでしょう。このような問題は通常なら、あなた自身がEmacsをビルドしたときに、そのLispファイルを編集および/またはリコンパイルしたときだけ発生します。この問題は、リコンパイル後にそれぞれのファイルをリロードするだけで解決します。

バイトコンパイルされたファイルからのドキュメント文字列のダイナミックロードは、バイトコンパイルされたファイルごとにコンパイル時に解決されます。これはオプションbyte-compile-dynamic-docstringsで無効にできます。

User Option: byte-compile-dynamic-docstrings

これが非nilなら、バイトコンパイラーはドキュメント文字列をダイナミックロードするようにセットアップしたコンパイル済みファイルを生成する。

特定のファイルでダイナミックロード機能を無効にするには、以下のようにヘッダー行でこのオプションにnilをセットする(Local Variables in Files in The GNU Emacs Manualを参照)。

-*-byte-compile-dynamic-docstrings: nil;-*-

これは主として、あるファイルを変更しようとしていて、そのファイルをすでにロード済みのEmacsセッションがファイルを変更した際にも正しく機能し続けることを望む場合に有用である。

内部的には、ドキュメント文字列のダイナミックロードは、特殊なLispリーダー構成‘#@count’とともにコンパイル済みファイルに書き込むことにより達成されます。この構成は、次のcount文字をスキップします。さらに‘#$’構成も使用され、これは“このファイルの名前(文字列)”を意味します。これらの構成をLispソースファイル内で使用しないでください。これらは人間がファイルを読む際に明確であるようデザインされていません。