Функции байт-компиляции
Вы можете байт-компилировать отдельное определение функции или макроса с помощью функции byte-compile. Вы можете скомпилировать целый файл с помощью byte-compile-file или несколько файлов с помощью byte-recompile-directory или batch-byte-compile.
Иногда байт-компилятор выводит предупреждения и/или сообщения об ошибках (подробности см. в разделе Ошибки компилятора). Обычно эти сообщения записываются в буфер с именем *Compile-Log*, в котором используется режим Compilation. См. раздел Режим Compilation в Руководстве GNU Emacs. Однако если значение переменной byte-compile-debug не равно nil, сообщения об ошибках вместо этого будут сигнализироваться как ошибки Lisp (см. раздел Ошибки).
Будьте осторожны при написании вызовов макросов в файлах, которые вы собираетесь байт-компилировать. Поскольку при компиляции вызовы макросов раскрываются, макросы должны быть загружены в Emacs, иначе байт-компилятор не сможет обработать их должным образом. Обычно для этого используют формы require, указывающие файлы с необходимыми определениями макросов (см. раздел Возможности). Обычно байт-компилятор не выполняет компилируемый код, но специальные формы require он обрабатывает особым образом, загружая указанные библиотеки. Чтобы не загружать файлы с определениями макросов, когда кто-либо запускает скомпилированную программу, заключайте вызовы require в eval-when-compile (см. раздел Вычисление во время компиляции). Подробнее см. раздел Макросы и байт-компиляция.
Встроенные (defsubst) функции не вызывают таких затруднений: если вы скомпилируете вызов такой функции до того, как станет известно её определение, вызов всё равно будет работать правильно, но медленнее.
- Функция: byte-compile symbol
-
Эта функция байт-компилирует определение функции 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. В этом случае функция возвращает соответствующий скомпилированный код, но нигде его не сохраняет.
- Команда: compile-defun &optional arg
-
Эта команда считывает defun, содержащий точку, компилирует его и вычисляет результат. Если применить её к defun, который является определением функции, то результатом будет установка скомпилированной версии этой функции.
Обычно
compile-defunотображает результат вычисления в области эха, но если arg не равноnil, она вставляет результат в текущий буфер после скомпилированной формы.
- Команда: byte-compile-file filename
-
Эта функция компилирует файл кода Lisp с именем filename в файл байт-кода. Имя выходного файла образуется заменой суффикса «.el» на «.elc»; если имя filename не заканчивается на «.el», к нему добавляется «.elc».
Компиляция выполняется путём считывания входного файла по одной форме за раз. Если форма является определением функции или макроса, скомпилированное определение функции или макроса записывается в файл. Остальные формы группируются, затем каждая группа компилируется и записывается так, чтобы её скомпилированный код выполнялся при чтении файла. При считывании входного файла все комментарии отбрасываются.
Эта команда возвращает
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
- Команда: byte-recompile-directory directory &optional flag force follow-symlinks
-
Эта команда повторно компилирует все файлы «.el» в directory (или его подкаталогах), которые нуждаются в повторной компиляции. Файл нуждается в повторной компиляции, если файл «.elc» существует, но старше файла «.el».
Если у файла «.el» нет соответствующего файла «.elc», параметр flag определяет, что делать. Если он равен
nil, эта команда игнорирует такие файлы. Если flag равен 0, команда компилирует их. Если он не равен ниnil, ни 0, команда спрашивает пользователя, следует ли компилировать каждый такой файл, а также спрашивает о каждом подкаталоге.В интерактивном режиме
byte-recompile-directoryзапрашивает directory, а значением flag служит префиксный аргумент.Если force не равно
nil, эта команда повторно компилирует каждый файл «.el», для которого существует файл «.elc».Обычно эта команда не компилирует файлы «.el», являющиеся символическими ссылками. Если необязательный параметр follow-symlink не равен
nil, символические ссылки на файлы «.el» также будут скомпилированы.Возвращаемое значение непредсказуемо.
- Функция: batch-byte-compile &optional noforce
-
Эта функция запускает
byte-compile-fileдля файлов, указанных в командной строке. Эту функцию следует использовать только при пакетном запуске Emacs, поскольку по завершении она завершает работу Emacs. Ошибка в одном файле не мешает обработке последующих файлов, однако для этого файла выходной файл создан не будет, а процесс Emacs завершится с ненулевым кодом состояния.Если noforce не равно
nil, эта функция не компилирует повторно файлы, для которых уже существует актуальный файл «.elc».$ emacs -batch -f batch-byte-compile *.el
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Compilation-Functions.html