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


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

このセクションではネイティブコンパイルを制御する変数について述べます。

User Option: native-comp-speed

この変数はネイティブコンパイルの最適化レベルを指定する。値は-1から3の数値であること。値0から3はコンパイラーの対応する最適化レベル-O0-O1、...のコマンドラインオプションと等しい。値-1はネイティブコンパイルの無効化を意味する。この場合には関数およびファイルはバイトコンパイルされる。ただしバイトコード形式でコンパイルされたコードだけを含む*.elnファイルは依然として生成される((declare (speed -1))を使えばこれを関数単位で行うこともできる。declareフォームを参照)。デフォルト値は2。

User Option: native-comp-debug

この変数はネイティブコンパイルが生成するデバッグ情報のレベルを指定する。値は0から3の数値で、以下のような意味をもつ:

0

デバッグ出力なし。これがデフォルト。

1

ネイティブコードでデバッグシンボルを発行する。これはgdbのようなデバッガによるネイティブコードの電話を容易にする。

2

1と同様だが、更に疑似Cコードをダンプする。

3

2と同様、更にGCC中間パス(GCC intermediate passes)とlibgccjitログファイルをダンプする。

User Option: native-comp-verbose

この変数はネイティブコンパイルが発行する一部またはすべてのログメッセージを抑制することにより、ネイティブコンパイルの冗長性(verbosity)を制御する。値が0(デフォルト)なら、ログメッセージはすべて抑制される。1から3の値をセットすることにより、レベルが上述の値であるようなメッセージのロギングを可能にする。値には以下のような解釈がある:

0

ログなし。これがデフォルト。

1

コードの最終的なLIMPLE表現をログ。

2

LAP、最終的なLIMPLE、および追加のパス情報をログ。

3

最大の冗長性。すべてをログ。

User Option: native-comp-async-jobs-number

この変数は同時に開始するネイティブコンパイルのサブプロセスの最大数を決定する。非負の数値であること。デフォルト値0はCPU実行ユニットの半数の使用、1は単一の実行ユニットの使用を意味する。

User Option: native-comp-async-report-warnings-errors

この変数の値が非nilなら、ネイティブコンパイルの非同期サブプロセスからの警告とエラーは、メインのEmacsセッションの*Warnings*という名前のバッファーに報告される。デフォルト値のtはそのバッファーへの表示を意味する。*Warnings*バッファーをポップアップせずに警告をログするには、この変数にsilentをセットすればよい。

非同期ネイティブコンパイルで警告が生成されるのは、必要な機能にたいするrequireが欠落したファイルのコンパイルが原因であることが多い。この機能はメインのEmacsにロードされるかもしれないが、ネイティブコンパイルは常にサブプロセスから初期状態の環境で開始されるので、サブプロセスではロードされないかもしれない。

User Option: native-comp-async-query-on-exit

この変数の値が非nilなら、Emacsはexitに際して実行中のネイティブコンパイルの非同期サブプロセスをすべてkillしてexitするかどうかを尋ねる(対応する.elnファイルへの書き込みを防ぐため)。値がnil (デフォルト)なら、Emacsは問い合わせを行わずにそれらのサブプロセスをkillする。

変数native-comp-eln-load-pathはEmacsが*.elnファイルを探すディレクトリーのリストを保持します(ライブラリー検索を参照)。これは役割りの面では*.el*.elcのファイルを探すために使用されるload-pathと同じです。このリストにあるディレクトリーは非同期のネイティブコンパイルによって生成された*.elnファイルの書き込みにも使用されます。特にEmacsはこのリスト中の最初に書き込み可能なディレクトリーにファイルを書き込むでしょう。したがってこの変数の値を変更することで、ネイティブコンパイルが結果を格納する場所を制御することができます。

Variable: native-comp-jit-compilation

この変数が非nilであれば、対応する*.elnがまだ存在しないEmacsにロード済みの*.elcの非同期(別名just-in-time、あるいはJIT)なネイティブコンパイルを有効にする。このJITコンパイルはnative-comp-async-jobs-numberの値に応じて、batchモードで走行する別個のEmacsサブプロセスを使用する。LispファイルのJITコンパイルが、成功裏に終了した際にはコンパイル結果の.elnファイルがロードされて、.elcファイルによって提供されていた関数定義をコンパイルしたコードで置き換える。

native-comp-jit-compilationの値をnilにセットすることによって、JITネイティブコンパイルが無効になります。ただしたとえJITネイティブコンパイルを無効にしても、トランポリン(trampolines)を生成するために依然としてEmacsは非同期ネイティブコンパイルを開始する必要があるかもしれません。これを制御するためには、以下で説明する別の変数を使用します。

Variable: native-comp-enable-subr-trampolines

この変数はトランポリンの生成を制御する。トランポリンとはnative-comp-speedが2以上でネイティブコンパイルされたLispコードから、アドバイスまたは再定義されたLispプリミティブの呼び出しを許すために必要な小さいネイティブコード片のこと。Emacsは生成されたトランポリンを別の*.elnファイルに格納する。この変数のデフォルトの値はトランポリンファイルの生成を有効にするtだが、値をnilにセットすることでトランポリンの生成が無効になる。プリミティブにたいするアドバイスや再定義に必要となるトランポリンが利用できなければ、ネイティブコンパイルされたLispからのプリミティブ呼び出しでは再定義とアドバイスは無視されて、プリミティブは直接Cから呼び出されたかのように振る舞うことに注意。したがってあなたのLispプログラムに必要なトランポリンすべてがコンパイル済みでEmacsからアクセス可能であることが不明なら、トランポリン生成の無効化は推奨しない。

この変数の値は文字列でもよく、その場合には生成されたトランポリンである*.elnファイルを格納するディレクトリー名を指定する。このディレクトリー名はnative-comp-eln-load-pathのディレクトリーをオーバーライドする。これは必要に応じてトランポリンを生成したいものの、ユーザーのHOMEディレクトリーや*.elnが保持されるその他のパブリックディレクトリーの配下には格納したくない場合に役に立つ。ただしnative-comp-eln-load-path内のディレクトリーとは異なり、トランポリンはバージョン固有のサブディレクトリーではなくこの変数で与えられたディレクトリーに格納されることになる。このディレクトリーが絶対名でなければ、invocation-directory (オペレーティングシステムの環境を参照)に相対的なディレクトリー名と解釈される。

この変数が非nil、かつEmacsがトランポリンの生成を要するもののトランポリンを格納するための書き込み可能ディレクトリーが見つからない場合には、トランポリンをtemporary-file-directory (一意なファイル名の生成を参照)の内部に格納する。

格納するための書き込み可能ディレクトリーが見つからない、あるいはこの変数の値が文字列の際に生成されたトランポリンは、Emacsのカレントセッションの間のみ利用できる。なぜならEmacsはいずれの場所からもトランポリンを探さないからである。