Функции байт-компиляции
Вы можете байт-скомпилировать отдельную функцию или определение макроса с помощью функции byte-compile. Вы можете скомпилировать весь файл с помощью byte-compile-file, или несколько файлов с помощью byte-recompile-directory или batch-byte-compile.
Иногда байт-компилятор выводит предупреждения и/или сообщения об ошибках (см. Ошибки компилятора для подробностей). Эти сообщения обычно записываются в буфер, называемый *Журнал компиляции*, который использует режим компиляции. См. Режим компиляции в Руководстве по GNU Emacs. Однако, если переменная byte-compile-debug имеет не-nil значение, сообщения об ошибках будут сигнализироваться как ошибки Lisp (см. Ошибки).
Будьте внимательны при написании вызовов макросов в файлах, которые вы хотите байт-скомпилировать. Поскольку вызовы макросов расширяются при компиляции, макросы должны быть загружены в Emacs, иначе байт-компилятор не выполнит правильных действий. Обычно это делается с помощью форм require, которые указывают файлы, содержащие необходимые определения макросов (см. Именованные особенности). Обычно байт-компилятор не оценивает код, который он компилирует, но он обрабатывает формы require особым образом, загружая указанные библиотеки. Чтобы избежать загрузки файлов определений макросов, когда кто-то *запускает* скомпилированную программу, запишите eval-when-compile вокруг вызовов require (см. Оценивание во время компиляции). Для более подробной информации см. Компиляция макросов.
Встроенные (defsubst) функции менее проблематичны; если вы скомпилируете вызов такой функции до того, как станет известно её определение, вызов всё равно будет работать правильно, но будет выполняться медленнее.
- Функция: byte-compile символ
Эта функция байт-компилирует определение функции символа, заменяя предыдущее определение скомпилированным. Определение функции символа должно содержать фактический код функции;
byte-compileне обрабатывает косвенные вызовы функций. Возвращаемое значение — объект функции байт-кода, который является скомпилированным определением символа (см. Объекты байт-кода).(defun factorial (integer) "Compute factorial of 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."]
Если определение символа является объектом функции байт-кода,
byte-compileничего не делает и возвращаетnil. Оно не компилирует определение символа повторно, так как исходный (не скомпилированный) код уже был заменён в ячейке функции символа скомпилированным кодом.Аргумент для
byte-compileтакже может бытьlambdaвыражением. В этом случае функция возвращает соответствующий скомпилированный код, но не сохраняет его нигде.
- Команда: compile-defun &optional arg
Эта команда считывает defun, содержащий точку, компилирует его и оценивает результат. Если вы используете это на defun, который на самом деле является определением функции, эффект заключается в установлении скомпилированной версии этой функции.
compile-defunобычно отображает результат оценки в области эха, но если arg имеет не-nilзначение, оно вставляет результат в текущий буфер после формы, которую оно скомпилировало.
- Команда: byte-compile-file имя_файла
Эта функция компилирует файл Lisp-кода с именем имя_файла в файл байт-кода. Имя выходного файла создаётся путём замены суффикса «.el» на «.elc»; если имя_файла не оканчивается на «.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 каталог &optional флаг force follow-symlinks
Эта команда перекомпилирует каждый файл «.el» в каталоге (или его подкаталогах), который требует перекомпиляции. Файл требует перекомпиляции, если файл «.elc» существует, но старше файла «.el».
Когда у файла «.el» нет соответствующего файла «.elc», флаг указывает, что делать. Если он
nil, эта команда игнорирует эти файлы. Если флаг равен 0, она компилирует их. Если он ниnilни 0, она спрашивает пользователя, следует ли компилировать каждый такой файл, а также спрашивает о каждом подкаталоге.В интерактивном режиме
byte-recompile-directoryзапрашивает каталог, а флаг — это префиксный аргумент.Если 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-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Compilation-Functions.html