byte-compile 関数を使えば、個別の関数やマクロ定義をバイトコンパイルできます。byte-compile-file でファイル全体を、byte-recompile-directory または batch-byte-compile で複数のファイルをコンパイルできます。
バイトコンパイラは、時に警告および/またはエラーメッセージを生成します(詳細はコンパイラエラーを参照)。これらのメッセージは通常、コンパイルモードを使用する*Compile-Log*と呼ばれるバッファに記録されます。The GNU
Emacs Manualのコンパイルモードを参照してください。ただし、変数byte-compile-debugがnilでない場合、エラーメッセージは代わりにLispエラーとして通知されます(エラーを参照)。
バイトコンパイルを予定しているファイルにマクロ呼び出しを記述する際はご注意ください。マクロ呼び出しはコンパイル時に展開されるため、マクロをEmacsにロードしておく必要があります。そうしないと、バイトコンパイラが正しく動作しません。これを解決する一般的な方法は、必要なマクロ定義を含むファイルを指定するrequireフォームを使用することです(Featuresを参照)。通常、バイトコンパイラはコンパイル対象のコードを評価しませんが、requireフォームについては特別に処理を行い、指定されたライブラリをロードします。コンパイル済みプログラムを実行する際にマクロ定義ファイルのロードを避けるには、require呼び出しをeval-when-compileで囲んで記述してください(Evaluation During
Compilationを参照)。詳細については、Macros and Byte Compilationを参照してください。
インライン (defsubst)
関数はそれほど厄介ではありません。定義が知られる前にそのような関数の呼び出しをコンパイルしておけば、呼び出しは問題なく動作し、単に実行速度が遅くなるだけです。
この関数は symbol
の関数定義をバイトコンパイルし、元の定義をコンパイル済みのものに置き換えます。symbol
の関数定義は、関数の実際のコードである必要があります。byte-compile
は関数の間接参照を処理しません。戻り値は、symbol
のコンパイル済み定義であるバイトコード関数オブジェクトです(クロージャ関数オブジェクトを参照)。
(defun factorial (integer)
"Compute factorial of INTEGER."
(if (= 1 integer) 1
(* integer (factorial (1- integer)))))
⇒ factorial
(byte-compile 'factorial) ⇒ #[257 "\211\300U\203^H^@\300\207\211\301^BS!_\207" [1 factorial] 4 "Compute factorial of INTEGER.\n\n(fn INTEGER)"]
symbolの定義がバイトコード関数オブジェクトである場合、byte-compileは何も行わず、nilを返します。元の(コンパイルされていない)コードが、シンボルの関数セル内で既にバイトコンパイル済みコードに置き換えられているため、シンボルの定義を再コンパイルすることはありません。
byte-compile への引数は、lambda
式であっても構いません。その場合、関数は対応するコンパイル済みコードを返しますが、それをどこかに保存することはありません。
このコマンドは、pointを含むdefunを読み込み、コンパイルし、その結果を評価します。これを実際には関数定義であるdefunに対して使用した場合、その関数のコンパイル済みバージョンをインストールすることになります。
compile-defun は通常、評価結果をエコー領域に表示しますが、arg が nil
以外の場合は、コンパイル済みのフォームの後に結果を現在のバッファに挿入します。
この関数は、filename という名前の Lisp コードファイルをバイトコードファイルにコンパイルします。出力ファイル名は、接尾辞の '.el' を '.elc' に変更することで生成されます。もし filename が '.el' で終わっていない場合は、filename の末尾に '.elc' を付加します。
入力ファイルを1フォームずつ読み込んでコンパイルを行います。関数またはマクロの定義である場合は、コンパイル済みの関数またはマクロ定義が出力されます。それ以外のフォームはまとめて処理され、各バッチがコンパイルされた後、ファイル読み込み時にそのコンパイル済みコードが実行されるように出力されます。入力ファイルの読み込み時、すべてのコメントは破棄されます。
このコマンドは、エラーがなければ t を、そうでなければ nil を返します。対話的に呼び出された場合は、ファイル名の入力を求めます。
$ 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
ファイルを再コンパイルします。
このコマンドは通常、シンボリックリンクされた ‘.el’
ファイルはコンパイルしません。オプションの follow-symlink パラメータが nil 以外の場合、シンボリックリンクされた ‘.el’ もコンパイルされます。
戻り値は予測不能です。
この関数は、コマンドラインで指定されたファイルに対して byte-compile-file
を実行します。処理完了時に Emacs を終了させるため、この関数は Emacs
のバッチ実行時のみ使用する必要があります。1つのファイルでエラーが発生しても後続ファイルの処理は妨げられませんが、そのファイルに対する出力ファイルは生成されず、Emacs
プロセスは非ゼロのステータスコードで終了します。
noforce が nil
でない場合、この関数は最新の ‘.elc’
ファイルを持つファイルを再コンパイルしません。
$ emacs -batch -f batch-byte-compile *.el