ネイティブコンパイルは、バイトコンパイルの副産物として実装されています(バイトコンパイルを参照)。したがって、Lispコードをネイティブコンパイルすると、常にそのバイトコードも生成されます。そのため、Lispコードをバイトコンパイル用に準備する際のあらゆる規則や注意点(バイトコンパイル関数を参照)は、ネイティブコンパイルにおいても同様に適用されます。
native-compile 関数を使用すると、単一の関数やマクロ定義、あるいは Lisp
コードが記述されたファイル全体をネイティブコンパイルできます。ファイルをネイティブコンパイルすると、ネイティブコードを含む .eln ファイルが生成されます。
ネイティブコンパイルでは警告やエラーメッセージが出力されることがあり、これらは通常 *Native-compile-Log* と呼ばれるバッファに記録されます。対話型セッションでは、特別な
LIMPLE モード (native-comp-limple-mode)
が使用され、このログに合わせて font-lock が適切に設定されますが、それ以外は
Fundamental モードと同様です。ネイティブコンパイルによって生成されるメッセージのログ出力は、native-comp-verbose 変数で制御できます(ネイティブコンパイル変数 を参照)。
Emacsを非対話的に実行した場合、native-compilationによって生成されたメッセージはmessageを呼び出すことで報告され(エコーエリアへのメッセージ表示を参照)、通常はEmacsを起動した端末の標準エラーストリームに出力されます。
この関数は function-or-file をネイティブコードにコンパイルします。引数 function-or-file には、関数シンボル、Lispフォーム、またはコンパイル対象の Emacs Lisp ソースコードを含むファイルの名前(文字列)を指定できます。オプション引数 output を指定する場合は、コンパイル済みコードを書き出すファイル名を指定する文字列である必要があります。そうでない場合、function-or-file が関数または Lisp フォームであればこの関数はコンパイル済みオブジェクトを返し、function-or-file がファイル名であれば、コンパイル済みコード用に作成したファイルの完全な絶対パスを返します。出力ファイルには、デフォルトで .eln という拡張子が付与されます。
この関数は、ネイティブコンパイルの最終フェーズを実行します。このフェーズでは、libgccjit を介して GCC を呼び出しますが、その呼び出し元のプロセスと同じ Emacs 実行ファイルを、別のサブプロセスとして起動します。
この関数は、directoryおよびその配下の任意のサブディレクトリ内で.elファイルを再帰的に検索し、まだコンパイルされていないファイルに対してネイティブコンパイルを実行します。ファイルが既にコンパイル済みかどうかを判定するため、native-comp-eln-load-path変数の中から対応する.elnを検索します(ネイティブコンパイル変数を参照)。
この関数は、Emacsのコマンドラインで指定されたファイルをバッチモードでネイティブコンパイルします。コンパイル完了時にEmacsを終了させるため、Emacsのバッチ実行時のみ使用する必要があります。1つ以上のファイルのコンパイルに失敗した場合、Emacsプロセスは他のすべてのファイルのコンパイルを試み、非ゼロのステータスコードで終了します。オプション引数
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内のすべてのファイルとディレクトリを選択してください。
正規表現に一致する名前のファイルとディレクトリを選択します。
files内の各ファイルおよびディレクトリに対して呼び出され、そのファイルまたはディレクトリをコンパイル対象として選択すべき場合にnon-nilを返す述語関数。
複数のCPU実行ユニットを備えたシステムにおいて、files
が複数のファイル名を指定した場合、この関数は通常、native-comp-async-jobs-number
の制御下で複数のコンパイルサブプロセスを並列に起動します(ネイティブコンパイル変数を参照)。
この関数は、native-comp-eln-load-path
リストに記載されたいずれのディレクトリにも対応する .eln
ファイルが見つからなかった場合、指定された directory
およびそのすべてのサブディレクトリ(再帰的に)にあるすべての *.el
ファイルをネイティブコードにコンパイルします(ライブラリ検索 を参照)。
このコマンドは、現在のバッファで参照されているファイルが、前回のネイティブコンパイル以降に変更されていた場合に、そのファイルをネイティブコードにコンパイルします。
このコマンドは、現在のバッファで参照されているファイルをemacs-lisp-native-compileのようにネイティブコードにコンパイルし、コンパイル完了時にそのネイティブコードをロードします。
以下の関数を使用すると、Lispプログラムは実行時にネイティブコンパイルが利用可能かどうかを判定できます。
この関数は、実行中のEmacsプロセスにnative-compilationのサポートがコンパイル済みで組み込まれている場合、non-nilを返します。libgccjitを動的にロードするシステムでは、ライブラリが利用可能であり、ロード可能であることも確認します。native-compilationが利用可能かどうかを事前に把握する必要があるLispプログラムは、この述語を使用してください。
デフォルトでは、非同期ネイティブコンパイルによって生成された *.eln ファイルは、native-comp-eln-load-path
変数で指定された最初の書き込み可能なディレクトリのサブディレクトリに書き込まれます(ネイティブコンパイル変数を参照)。スタートアップファイルで以下の関数を使用することで、この動作を変更できます。