Previous: ネイティブコンパイル関数, Up: Lispからネイティブコードへのコンパイル [Contents][Index]
このセクションではネイティブコンパイルを制御する変数について述べます。
この変数はネイティブコンパイルの最適化レベルを指定する。値は-1から3の数値であること。値0から3はコンパイラーの対応する最適化レベル-O0、-O1、...のコマンドラインオプションと等しい。値-1はネイティブコンパイルの無効化を意味する。この場合には関数およびファイルはバイトコンパイルされる。ただしバイトコード形式でコンパイルされたコードだけを含む*.elnファイルは依然として生成される((declare (speed -1))
を使えばこれを関数単位で行うこともできる。declare
フォームを参照)。デフォルト値は2。
この変数は生成されるネイティブコードにたいする安全レベルを指定する。値には0または1のいずれかの数値を指定すること。意味は以下のとおり:
関数定義にその関数が何を行うか、あるいは呼び出し方を正しく記述していない関数をネイティブコンパイルすると、生成されるコードが誤動作するかもしれない(最悪Emacsがクラッシュする)。
たとえ関数の定義が間違っていても、コードは安全な方法で生成しなければならない。
これは関数の粒度にsafety
やsafety
といったフォームを用いることによっても制御できる。declare
フォームを参照のこと。
この変数はネイティブコンパイルが生成するデバッグ情報のレベルを指定する。値は0から3の数値で、以下のような意味をもつ:
デバッグ出力なし。これがデフォルト。
ネイティブコードでデバッグシンボルを発行する。これはgdb
のようなデバッガによるネイティブコードの電話を容易にする。
1と同様だが、更に疑似Cコードをダンプする。
2と同様、更にGCC中間パス(GCC intermediate passes)とlibgccjitログファイルをダンプする。
生成されたC疑似コードは、対応する.elnファイルと同じディレクトリーに格納される。
この変数はネイティブコンパイルが発行する一部またはすべてのログメッセージを抑制することにより、ネイティブコンパイルの冗長性(verbosity)を制御する。値が0(デフォルト)なら、ログメッセージはすべて抑制される。1から3の値をセットすることにより、レベルが上述の値であるようなメッセージのロギングを可能にする。値には以下のような解釈がある:
ログなし。これがデフォルト。
コードの最終的なLIMPLE表現をログ。
LAP、最終的なLIMPLE、および追加のパス情報をログ。
最大の冗長性。すべてをログ。
この変数は同時に開始するネイティブコンパイルのサブプロセスの最大数を決定する。非負の数値であること。デフォルト値0はCPU実行ユニットの半数の使用、1は単一の実行ユニットの使用を意味する。
この変数の値が非nil
なら、ネイティブコンパイルの非同期サブプロセスからの警告とエラーは、メインのEmacsセッションの*Warnings*という名前のバッファーに報告される。デフォルト値のt
はそのバッファーへの表示を意味する。*Warnings*バッファーをポップアップせずに警告をログするには、この変数にsilent
をセットすればよい。
非同期ネイティブコンパイルで警告が生成されるのは、必要な機能にたいするrequire
が欠落したファイルのコンパイルが原因であることが多い。この機能はメインのEmacsにロードされるかもしれないが、ネイティブコンパイルは常にサブプロセスから初期状態の環境で開始されるので、サブプロセスではロードされないかもしれない。
この変数の値が非nil
なら、Emacsはexitに際して実行中のネイティブコンパイルの非同期サブプロセスをすべてkillしてexitするかどうかを尋ねる(対応する.elnファイルへの書き込みを防ぐため)。値がnil
(デフォルト)なら、Emacsは問い合わせを行わずにそれらのサブプロセスをkillする。
変数native-comp-eln-load-path
はEmacsが*.elnファイルを探すディレクトリーのリストを保持します(ライブラリー検索を参照)。これは役割りの面では*.elや*.elcのファイルを探すために使用されるload-path
と同じです。このリストにあるディレクトリーは非同期のネイティブコンパイルによって生成された*.elnファイルの書き込みにも使用されます。特にEmacsはこのリスト中の最初に書き込み可能なディレクトリーにファイルを書き込むでしょう。したがってこの変数の値を変更することで、ネイティブコンパイルが結果を格納する場所を制御することができます。
この変数が非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は非同期ネイティブコンパイルを開始する必要があるかもしれません。これを制御するためには、以下で説明する別の変数を使用します。
この変数はトランポリンの生成を制御する。トランポリンとは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はいずれの場所からもトランポリンを探さないからである。