Next: , Previous: , Up: Byte Compilation   [Contents][Index]


16.2 バイトコンパイル関数

byte-compileにより、関数やマクロを個別にバイトコンパイルできます。byte-compile-fileでファイル全体、byte-recompile-directoryまたはbatch-byte-compileで複数ファイルをコンパイルできます。

バイトコンパイラーが警告および/またはエラーメッセージを生成することもあります(詳細はCompiler Errorsを参照)。これらのメッセージは通常はCompilationモードが使用する*Compile-Log*と呼ばれるバッファーに記録されます。Compilation Mode in The GNU Emacs Manualを参照してください。しかし変数byte-compile-debugが非nilならエラーメッセージはかわりにLispエラーをシグナルする(Errorsを参照)。

バイトコンパイルを意図したファイル内にマクロ呼び出しを記述する際には注意が必要です。マクロ呼び出しはコンパイル時に展開されるので、そのマクロはEmacsにロードされる必要があります(さもないとバイトコンパイラーが正しく処理しないだろう)。これを処理する通常の方法は、必要なマクロ定義を含むファイルをrequireフォームで指定することです。バイトコンパイラーは通常はコンパイルするコードを評価しませんが、requireフォームは指定されたライブラリーをロードすることにより特別に扱われます。誰かがコンパイルされたプログラムを実行する際にマクロ定義ファイルのロードを回避するためには、require呼び出しの周囲にeval-when-compileを記述します(Eval During Compileを参照)。詳細はCompiling Macrosを参照してください。

インライン関数(defsubst)はこれほど面倒ではありません。定義が判明する前にそのような関数呼び出しをコンパイルした場合でも、その呼び出しは低速になるだけで正しく機能するでしょう。

Function: byte-compile symbol

この関数は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式も指定できる。この場合、関数は対応するコンパイル済みコードをリターンするが、それはどこにも格納されない。

Command: compile-defun &optional arg

このコマンドはポイントを含むdefunを読み取りそれをコンパイルして、結果を評価します。実際に関数定義であるようなdefunでこれを使用した場合は、その関数のコンパイル済みバージョンをインストールする効果があります。

compile-defunは通常は評価した結果をエコーエリアに表示するが、argが非nilなら、そのフォームをコンパイルした後にカレントバッファーに結果を挿入する。

Command: byte-compile-file filename &optional load

この関数は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
Command: byte-recompile-directory directory &optional flag force

このコマンドはdirectory(またはそのサブディレクトリー)内の、リコンパイルを要するすべての‘.el’ファイルをリコンパイルする。‘.elc’ファイルが存在して、それが‘.el’より古いファイルは、リコンパイルが必要となる。

.el’ファイルに対応する‘.elc’ファイルが存在しない場合に何を行うかをflagで指定する。nilなら、このコマンドはこれらのファイルを無視する。flagが0なら、それらをコンパイルする。nilと0以外なら、それらのファイルをコンパイルするかユーザーに尋ねて、同様にそれぞれのサブディレクトリーについても尋ねる。

インタラクティブに呼び出されると、byte-recompile-directorydirectoryの入力を求めて、flagはプレフィクス引数となる。

forceが非nilなら、このコマンドは‘.elc’ファイルが存在するすべての‘.el’ファイルをリコンパイルする。

リターン値は不定。

Function: batch-byte-compile &optional noforce

この関数はコマンドラインで指定されたファイルにたいしてbyte-compile-fileを実行する。この関数は処理が完了するとEmacsをkillするので、Emacsのバッチ実行でのみ使用しなければならない。1つのファイルでエラーが発生しても、それによって後続のファイルにたいする処理が妨げられることはないが、そのファイルにたいする出力ファイルは生成されず、Emacsプロセスは0以外のステータスコードで終了する。

noforceが非nilなら、この関数は最新の‘.elc’ファイルがあるファイルをリコンパイルしない。

$ emacs -batch -f batch-byte-compile *.el