Next: , Up: Lispからネイティブコードへのコンパイル   [Contents][Index]


18.1 ネイティブコンパイル関数

ネイティブコンパイルはバイトコンパイル(バイトコンパイルを参照)の副作用として実装されています。したがってLispコードをネイティブコンパイルすると、同様にバイトコードが常に生成されるため、バイトコンパイル用にLispコードを準備する際の規則や注意事項(バイトコンパイル関数を参照)は、ネイティブコンパイルでも同じようにすべて有効です。

native-compile関数により単一の関数やマクロ、あるいはLispコードのファイル全体をネイティブコンパイルできます。ファイルをネイティブコンパイルすると、それに対応するネイティブコードの.elnファイルが生成されます。

ネイティブコンパイルでは警告やエラーが生成されるかもしれません。これらは通常は*Native-compile-Log*と呼ばれるバッファーに記録されます。このバッファーではインタラクティブなセッションではLIMPLEという特別なモードが使用されます。このモードではログにたいして適切なfont-lockロックをセットアップされて、それ以外はFundamentalモードと同じです。ネイティブコンパイルの結果メッセージのロギングは変数native-comp-verboseで制御できます(ネイティブコンパイル関数を参照)。

Emacsが非インタラクティブに実行されている際には、ネイティブコンパイルによって生成されたメッセージはmessage (エコーエリアへのメッセージの表示を参照)の呼び出しによって報告されます。これは通常はEmacsを呼び出した端末の標準エラーストリームに表示されます。

Function: native-compile function-or-file &optional output

この関数はfunction-or-fileをネイティブコードにコンパイルする。引数function-or-fileにはコンパイルする関数シンボル、Lispフォーム、またはEmacs Lispソースコードを含むファイル名(文字列)を指定できる。オプション引数outputが与えられた場合には、コンパイル済みコードを書き込むファイルの名前を指定する文字列でなければならない。それ以外の場合には、function-or-fileが関数かLispフォームならコンパイル済みオブジェクト、ファイル名ならコンパイル済みコード用に作成したファイルの完全な絶対ファイル名をリターンする。出力ファイルにはデフォルトで拡張子.elnが与えられる。

この関数はlibgccjitを通じて別のサブプロセス内でGCCを呼び出すネイティブコンパイルの最終フェーズを実行する。これはこの関数を呼び出したプロセスとして、同じEmacs実行可能形式を呼び出す。

Function: batch-native-compile &optional for-tarball

この関数はbatchモードでEmacsのコマンドラインで指定されたファイルにたいしてネイティブコンパイルを実行する。これはコンパイル完了によりEmacsをkillするので、Emacsのバッチ実行でのみ使用しなければならない。1つ以上のファイルでコンパイルが失敗すると、Emacsプロセスはそれ以外のすべてのファイルのコンパイルを試みて、非0のexitステータスで終了する。オプション引数for-tarballが非nilなら、この関数はコンパイルした結果の.elnファイルをnative-comp-eln-load-pathに記述された最後のディレクトリーに配置する(ライブラリー検索を参照)。これは初回にEmacsソースtarballをビルドするときに、ソースtarballに含まれていないネイティブコンパイル済みファイルをユーザーのキャッシュディレクトリーではなくビルドツリー内に生成する必要がある際に使用されることを意図している。

ネイティブコンパイルはメインのEmacsプロセスのサブプロセス中で、全体を非同期に実行できます。これによりバックグラウンドでコンパイルを実行する間、メインのEmacsプロセスをフリーにできます。これはEmacsにロードされた任意のLispファイルやバイトコンパイル済みLispファイルを、Emacsがネイティブコンパイルするために使用する手法です。サブプロセスをこのように使用することによって、ネイティブコンパイルではバイトコンパイルでは発生しない警告やエラーが生成されるかもしれず、それ故に正しく機能するようにLispコードの修整が必要かもしれないことに注意してください。詳細はネイティブコンパイル関数native-comp-async-report-warnings-errorsを参照してください。

Function: native-compile-async files &optional recursively load selector

この関数はfilesという名前のファイルを非同期にコンパイルする。引数filesは単一のファイル名(文字列)、または1つ以上のファイルおよび/またはディレクトリー名のリストであること。このリスト中にディレクトリーが与えられた場合には、それらのディレクトリー内で再帰的にコンパイルするように、オプション引数recursivelyは非nilであること。loadが非nilなら、Emacsはコンパイルが成功したそれぞれのファイルをロードする。オプション引数selectorによりfilesのどれをコンパイルするか制御できる。これには以下のいずれかの値を指定できる:

nilまたは省略

files内のすべてのファイルとディレクトリーを選択。

正規表現文字列

このregexpに名前がマッチするファイルとディレクトリーを選択。

関数

files内のファイルおよびディレクトリーそれぞれにたいして呼び出される述語関数。そのファイルまたはディレクトリーを選択する必要があるなら非nilをリターンすること。

複数のCPU実行ユニットをもつシステムでは、この関数はfilesが複数のファイル名の際には、通常はnative-comp-async-jobs-number (ネイティブコンパイル関数を参照)の制御の下で複数のコンパイル用サブプロセスを並行で開始する。

Command: emacs-lisp-native-compile

このコマンドはカレントバッファーによってvisitされているファイルが最後にネイティブコンパイルされてから変更されていればネイティブコードにコンパイルする。

Command: emacs-lisp-native-compile-and-load

このコマンドはemacs-lisp-native-compileと同様にカレントバッファーによってvisitされているファイルをネイティブコードにコンパイルするが、コンパイル完了時にネイティブコードのロードも行う。

以下の関数により、実行時にネイティブコンパイルが利用可能かどうかをLispプログラムがテストできます。

Function: native-comp-available-p

この関数は実行中のEmacsにネイティブコンパイルのサポートがコンパイルされていれば非nilをリターンする。libgccjitを動的にロードするシステムでは、ライブラリーg利用できロードできることも確認する。ネイティブコンパイルが利用可能か事前に知る必要があるLispプログラムはこの述語を使用すること。

非同期なネイティブコンパイルはnative-comp-eln-load-path変数(ネイティブコンパイル関数を参照)で指定された最初の書き込み可能なディレクトリーのサブディレクトリーに生成した*.elnファイルを書き込む。スタートアップファイルで以下の関数を使用してこれを変更できる:

Function: startup-redirect-eln-cache cache-directory

この関数は非同期なネイティブコンパイルがcache-directory (単一のディレクトリーを表す文字列)に生成した*.elnファイルを書き込むように手配する。更にnative-comp-eln-load-pathの最初の要素がcache-directoryになるように破壊的な変更も行う。cache-directoryが絶対ファイル名でなければ、user-emacs-directory (initファイル)。を参照から相対的なファイル名と解釈する。