byte-compile
により、関数やマクロを個別にバイトコンパイルできます。byte-compile-file
でファイル全体、byte-recompile-directory
またはbatch-byte-compile
で複数ファイルをコンパイルできます。
バイトコンパイラーが警告および/またはエラーメッセージを生成することもあります(詳細はコンパイラーのエラーを参照)。これらのメッセージは通常はCompilationモードが使用する*Compile-Log*と呼ばれるバッファーに記録されます。Compilation
Mode in The GNU Emacs
Manualを参照してください。しかし変数byte-compile-debug
が非nil
ならエラーメッセージはLispエラーとしてシグナルされます(エラーを参照)。
バイトコンパイルを意図したファイル内にマクロ呼び出しを記述する際には注意が必要です。マクロ呼び出しはコンパイル時に展開されるので、そのマクロはEmacsにロードされる必要があります(さもないとバイトコンパイラーが正しく処理しないだろう)。これを処理する通常の方法は、必要なマクロ定義を含むファイルをrequire
フォームで指定することです。バイトコンパイラーは通常はコンパイルするコードを評価しませんが、require
フォームは指定されたライブラリーをロードすることにより特別に扱われます。誰かがコンパイルされたプログラムを実行する際にマクロ定義ファイルのロードを回避するためには、require
呼び出しの周囲にeval-when-compile
を記述します(コンパイル中の評価を参照)。詳細はマクロとバイトコンパイルを参照してください。
インライン関数(defsubst
)はこれほど面倒ではありません。定義が判明する前にそのような関数呼び出しをコンパイルした場合でも、その呼び出しは低速になるだけで正しく機能するでしょう。
この関数はsymbolの関数定義をバイトコンパイルして、以前の定義をコンパイルされた定義に置き換える。symbolの関数定義は、その関数にたいする実際のコードでなければならない。byte-compile
はインダイレクト関数を処理しない。リターン値は、symbolのコンパイルされた定義であるようなバイトコード関数ブジェクト(クロージャ関数オブジェクトを参照)。
(defun factorial (integer) "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
式も指定できる。この場合、関数は対応するコンパイル済みコードをリターンするが、それはどこにも格納されない。
このコマンドはポイントを含むdefunを読み取りそれをコンパイルして結果を評価する。実際に関数定義であるようなdefunでこれを使用した場合には、その関数のコンパイル済みバージョンをインストールする効果がある。
compile-defun
は通常は評価した結果をエコーエリアに表示するが、argが非nil
ならフォームをコンパイルした後にカレントバッファーに結果を挿入する。
この関数はfilenameという名前のLispコードファイルを、バイトコードのファイルにコンパイルする。出力となるファイルの名前は、サフィックス‘.el’を‘.elc’に変更することにより作成される。filenameが‘.el’で終了しない場合には、‘.elc’をfilenameの最後に付け足す。
コンパイルは入力ファイルから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をkillするので、Emacsのバッチ実行でのみ使用しなければならない。1つのファイルでエラーが発生しても、それによって後続のファイルにたいする処理が妨げられることはないが、そのファイルにたいする出力ファイルは生成されず、Emacsプロセスは0以外のステータスコードで終了する。
noforceが非nil
なら、この関数は最新の‘.elc’ファイルがあるファイルをリコンパイルしない。
$ emacs -batch -f batch-byte-compile *.el