Next: ネイティブコンパイル関数, Up: Lispからネイティブコードへのコンパイル [Contents][Index]
ネイティブコンパイルはバイトコンパイル(バイトコンパイルを参照)の副作用として実装されています。したがってLispコードをネイティブコンパイルすると、同様にバイトコードが常に生成されるため、バイトコンパイル用にLispコードを準備する際の規則や注意事項(バイトコンパイル関数を参照)は、ネイティブコンパイルでも同じようにすべて有効です。
native-compile
関数により単一の関数やマクロ、あるいはLispコードのファイル全体をネイティブコンパイルできます。ファイルをネイティブコンパイルすると、それに対応するバイトコードの.elcファイルと、ネイティブコードの.elnファイルの両方が生成されます。
ネイティブコンパイルでは警告やエラーが生成されるかもしれません。これらは通常は*Native-compile-Log*と呼ばれるバッファーに記録されます。このバッファーではインタラクティブなセッションではLIMPLEという特別なモードが使用されます。このモードではログにたいして適切なfont-lock
ロックをセットアップされて、それ以外はFundamentalモードと同じです。ネイティブコンパイルの結果メッセージのロギングは変数native-comp-verbose
で制御できます(ネイティブコンパイル関数を参照)。
Emacsが非インタラクティブに実行されている際には、ネイティブコンパイルによって生成されたメッセージはmessage
(エコーエリアへのメッセージの表示を参照)の呼び出しによって報告されます。これは通常はEmacsを呼び出した端末の標準エラーストリームに表示されます。
この関数はfunction-or-fileをネイティブコードにコンパイルする。引数function-or-fileにはコンパイルする関数シンボル、Lispフォーム、またはEmacs Lispソースコードを含むファイル名(文字列)を指定できる。オプション引数outputが与えられた場合には、コンパイル済みコードを書き込むファイルの名前を指定する文字列でなければならない。それ以外の場合には、function-or-fileが関数かLispフォームならコンパイル済みオブジェクト、ファイル名ならコンパイル済みコード用に作成したファイルの完全な絶対ファイル名をリターンする。出力ファイルにはデフォルトで拡張子.elnが与えられる。
この関数はlibgccjitを通じて別のサブプロセス内でGCCを呼び出すネイティブコンパイルの最終フェーズを実行する。これはこの関数を呼び出したプロセスとして、同じEmacs実行可能形式を呼び出す。
この関数は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
を参照してください。
この関数はfilesという名前のファイルを非同期にコンパイルする。引数filesは単一のファイル名(文字列)、または1つ以上のファイルおよび/またはディレクトリー名のリストであること。このリスト中にディレクトリーが与えられた場合には、それらのディレクトリー内で再帰的にコンパイルするように、オプション引数recursivelyは非nil
であること。loadが非nil
なら、Emacsはコンパイルが成功したそれぞれのファイルをロードする。オプション引数selectorによりfilesのどれをコンパイルするか制御できる。これには以下のいずれかの値を指定できる:
nil
または省略files内のすべてのファイルとディレクトリーを選択。
このregexpに名前がマッチするファイルとディレクトリーを選択。
files内のファイルおよびディレクトリーそれぞれにたいして呼び出される述語関数。そのファイルまたはディレクトリーを選択する必要があるなら非nil
をリターンすること。
複数のCPU実行ユニットをもつシステムでは、この関数はfilesが複数のファイル名の際には、通常はnative-comp-async-jobs-number
(ネイティブコンパイル関数を参照)の制御の下で複数のコンパイル用サブプロセスを並行で開始する。
以下の関数により、実行時にネイティブコンパイルが利用可能かどうかをLispプログラムがテストできます。
この関数は実行中のEmacsにネイティブコンパイルのサポートがコンパイルされていれば非nil
をリターンする。libgccjitを動的にロードするシステムでは、ライブラリーg利用できロードできることも確認する。ネイティブコンパイルが利用可能か事前に知る必要があるLispプログラムはこの述語を使用すること。
非同期なネイティブコンパイルはnative-comp-eln-load-path
変数(ネイティブコンパイル関数を参照)で指定された最初の書き込み可能なディレクトリーのサブディレクトリーに生成した*.elnファイルを書き込む。スタートアップファイルで以下の関数を使用してこれを変更できる: