Next: Docs and Compilation, Previous: Speed of Byte-Code, Up: Byte Compilation [Contents][Index]
byte-compile
により、関数やマクロを個別にバイトコンパイルできます。byte-compile-file
でファイル全体、byte-recompile-directory
またはbatch-byte-compile
で複数ファイルをコンパイルできます。
バイトコンパイラーが警告、および/またはエラーメッセージを生成することもあります(詳細はCompiler Errorsを参照)。これらのメッセージはCompilationモードが使用する*Compile-Log*と呼ばれるバッファーに記録されます。Compilation Mode in The GNU Emacs Manualを参照してください。
バイトコンパイルを意図したファイル内にマクロ呼び出しを記述する際は、注意が必要です。マクロ呼び出しはコンパイル時に展開されるので、そのマクロはEmacsにロードされる必要があります(さもないとバイトコンパイラーは正しく処理しないでしょう)。これを処理する通常の方法は、必要なマクロ定義を含むファイルをrequire
フォームで指定することです。バイトコンパイラーは通常、コンパイルするコードを評価しませんが、require
フォームは指定されたライブラリーをロードすることにより特別に扱われます。誰かがコンパイルされたプログラムを実行する際に、マクロ定義ファイルのロードを回避するには、require
呼び出しの周囲にeval-when-compile
を記述します(Eval During Compileを参照)。詳細はCompiling Macrosを参照してください。
インライン(defsubst
)の関数は、これほど面倒ではありません。定義が判明する前にそのような関数呼び出しをコンパイルした場合でも、その呼び出しは低速になるだけで、正しく機能するでしょう。
この関数はsymbolの関数定義をバイトコンパイルして、以前の定義をコンパイルされた定義に置き換えます。symbolの関数定義は、その関数にたいする実際のコードでなければなりません。byte-compile
はインダイレクト関数を処理しません。リターン値は、symbolのコンパイルされた定義であるバイトコード関数ブジェクトです(Byte-Code Objectsを参照)。
(defun factorial (integer) "INTEGERの階乗を計算する。" (if (= 1 integer) 1 (* integer (factorial (1- integer))))) ⇒ factorial
(byte-compile 'factorial) ⇒ #[(integer) "^H\301U\203^H^@\301\207\302^H\303^HS!\"\207" [integer 1 * factorial] 4 "Compute factorial of INTEGER."]
symbolの定義がバイトコード関数オブジェクトの場合、byte-compile
は何も行わずnil
をリターンします。そのシンボルの関数セル内の(コンパイルされていない)オリジナルのコードはすでにバイトコンパイルされたコードに置き換えられているので、“シンボルの定義の再コンパイル”はしません。
byte-compile
の引数としてlambda
式も指定できます。この場合、関数は対応するコンパイル済みコードをリターンしますが、それはどこにも格納されません。
このコマンドはポイントを含むdefunを読み取りそれをコンパイルして、結果を評価します。実際に関数定義であるようなdefunでこれを使用した場合は、その関数のコンパイル済みバージョンをインストールする効果があります。
compile-defun
は通常、評価した結果をエコーエリアに表示しますが、argが非nil
の場合は、そのフォームをコンパイルした後にカレントバッファーに結果を挿入します。
この関数はfilenameという名前のLispコードファイルを、バイトコードのファイルにコンパイルします。出力となるファイルの名前は、サフィックス‘.el’を‘.elc’に変更することにより作成されます。filenameが‘.el’で終了しない場合は、‘.elc’をfilenameの最後に付け足します。
コンパイルは入力ファイルから1つのフォームを逐次読み取ることにより機能します。フォームが関数またはマクロの場合は、コンパイル済みの関数またはマクロが書き込まれます。それ以外のフォームはまとめられて、まとめられたものごとにコンパイルされ、そのファイルが読まれたとき実行されるようにコンパイルされたコードが書き込まれます。入力ファイルを読み取る際、すべてのコメントは無視されます。
このコマンドはエラーのないときはt
、それ以外はnil
をリターンします。インタラクティブに呼び出されたときは、ファイル名の入力をもとめます。
loadが非nil
の場合、このコマンドはコンパイルした後にコンパイルされたファイルをロードします。インタラクティブに呼び出された場合、loadはプレフィクス引数です。
$ ls -l push* -rw-r--r-- 1 lewis lewis 791 Oct 5 20:31 push.el
(byte-compile-file "~/emacs/push.el") ⇒ t
$ ls -l push* -rw-r--r-- 1 lewis lewis 791 Oct 5 20:31 push.el -rw-rw-rw- 1 lewis lewis 638 Oct 8 20:25 push.elc
このコマンドは、directory(またはそのサブディレクトリー)内の、リコンパイルを要するすべての‘.el’ファイルをリコンパイルします。‘.elc’ファイルが存在し、それが‘.el’より古いファイルは、リコンパイルが必要です。
‘.el’ファイルに対応する‘.elc’ファイルが存在しない場合、何を行うかをflagで指定します。nil
の場合、このコマンドはこれらのファイルを無視します。flagが0のときは、それらをコンパイルします。nil
と0以外の場合は、それらのファイルをコンパイルするかユーザーに尋ね、同様にそれぞれのサブディレクトリーについても尋ねます。
インタラクティブに呼び出された場合、byte-recompile-directory
はdirectoryの入力を求め、flagはプレフィクス引数になります。
forceが非nil
の場合、このコマンドは‘.elc’ファイルのあるすべての‘.el’ファイルをリコンパイルします。
リターン値は不定です。
この関数は、コマンドラインで指定されたファイルにたいして、byte-compile-file
を実行します。この関数は処理が完了するとEmacsをkillするので、Emacsのバッチ実行だけで使用しなければなりません。1つのファイルでエラーが発生しても、それにより後続のファイルにたいする処理が妨げられることはありませんが、そのファイルにたいする出力ファイルは生成されず、Emacsプロセスは0以外のステータスコードで終了します。
noforceが非nil
の場合、この関数は最新の‘.elc’ファイルがあるファイルをリコンパイルしません。
$ emacs -batch -f batch-byte-compile *.el