Функции нативной компиляции
Нативная компиляция реализована как побочный эффект байт-компиляции (см. Байт-компиляция). Таким образом, нативная компиляция кода Lisp всегда также создаёт его байт-код, поэтому все правила и оговорки подготовки кода Lisp к байт-компиляции (см. Функции байт-компиляции) также применимы к нативной компиляции.
С помощью функции native-compile можно выполнить нативную компиляцию одного определения функции или макроса либо всего файла с кодом Lisp. В результате нативной компиляции файла будет создан файл .eln с нативным кодом.
При нативной компиляции могут появляться предупреждения и сообщения об ошибках; обычно они записываются в буфер с именем *Native-compile-Log*. В интерактивных сеансах используется специальный режим LIMPLE (native-comp-limple-mode), который настраивает font-lock соответствующим образом для этого журнала и в остальном совпадает с режимом Fundamental. Запись сообщений, возникающих в результате нативной компиляции, можно контролировать с помощью переменной native-comp-verbose (см. Переменные нативной компиляции).
При неинтерактивном запуске Emacs сообщения, созданные нативной компиляцией, выводятся вызовом message (см. Вывод сообщений в эхо-области) и обычно отображаются в стандартном потоке ошибок терминала, из которого был запущен Emacs.
- Функция: native-compile function-or-file &optional output
-
Эта функция компилирует function-or-file в нативный код. Аргумент function-or-file может быть символом функции, формой Lisp или именем (строкой) файла, содержащего исходный код Emacs Lisp для компиляции. Если задан необязательный аргумент output, он должен быть строкой с именем файла, в который следует записать скомпилированный код. В противном случае, если function-or-file — это функция или форма Lisp, функция возвращает скомпилированный объект, а если function-or-file — имя файла, функция возвращает полное абсолютное имя созданного файла со скомпилированным кодом. По умолчанию выходному файлу присваивается расширение .eln.
Эта функция выполняет заключительный этап нативной компиляции, вызывающий GCC через libgccjit в отдельном подпроцессе, который запускает тот же исполняемый файл Emacs, что и процесс, вызвавший эту функцию.
- Функция: native-compile-directory directory
Эта функция рекурсивно ищет файлы .el в directory и всех его подкаталогах и выполняет нативную компиляцию тех из них, которые ещё не были скомпилированы. Чтобы определить, был ли файл уже скомпилирован, функция ищет соответствующий файл .eln в переменной
native-comp-eln-load-path(см. Переменные нативной компиляции).
- Функция: batch-native-compile &optional for-tarball
Эта функция выполняет нативную компиляцию файлов, указанных в командной строке Emacs, в пакетном режиме. Её можно использовать только при пакетном запуске Emacs, поскольку по завершении компиляции она завершает работу Emacs. Если не удаётся скомпилировать один или несколько файлов, процесс Emacs попытается скомпилировать все остальные файлы и завершится с ненулевым кодом состояния. Если необязательный аргумент for-tarball не равен
nil, функция помещает созданные файлы .eln в последний каталог, указанный вnative-comp-eln-load-path(см. Поиск библиотек); это предназначено для использования при первой сборке исходного архива Emacs, когда файлы, скомпилированные нативно и отсутствующие в исходном архиве, следует создавать в дереве сборки, а не в каталоге кэша пользователя.
Нативную компиляцию можно полностью выполнять асинхронно в подпроцессе основного процесса Emacs. Это позволяет основному процессу Emacs оставаться доступным во время фоновой компиляции. Именно этот способ Emacs использует для нативной компиляции любого файла Lisp или байт-компилированного файла Lisp, загружаемого в Emacs, если для него нет файла с нативной компиляцией. Обратите внимание: из-за использования подпроцесса при нативной компиляции могут возникать предупреждения и ошибки, которых не бывает при байт-компиляции, поэтому для корректной работы код Lisp может потребоваться изменить. Дополнительные сведения см. в native-comp-async-report-warnings-errors в разделе Переменные нативной компиляции.
- Функция: native-compile-async files &optional recursively load selector
-
Эта функция асинхронно компилирует файлы files. Аргумент files должен быть именем одного файла (строкой) или списком из одного либо нескольких имён файлов и/или каталогов. Если в списке есть каталоги, необязательный аргумент recursively должен быть не равен
nil, чтобы компиляция выполнялась рекурсивно в этих каталогах. Если load не равенnil, Emacs загрузит каждый файл, который удалось скомпилировать. Необязательный аргумент selector позволяет управлять выбором компилируемых элементов из files; он может принимать одно из следующих значений:-
nilили не задан Выбрать все файлы и каталоги из files.
- строка с регулярным выражением
Выбрать файлы и каталоги, имена которых соответствуют регулярному выражению.
- функция
Функция-предикат, которая вызывается для каждого файла и каталога из files и должна возвращать значение, не равное
nil, если файл или каталог следует выбрать для компиляции.
В системах с несколькими вычислительными ядрами, если files содержит имена нескольких файлов, эта функция обычно запускает несколько подпроцессов компиляции параллельно под управлением
native-comp-async-jobs-number(см. Переменные нативной компиляции). -
- Функция: native-compile-directory directory
Эта функция компилирует в нативный код все файлы *.el в указанном directory и рекурсивно во всех его подкаталогах, если соответствующий файл .eln не найден ни в одном из каталогов, указанных в списке
native-comp-eln-load-path(см. Поиск библиотек).
- Команда: emacs-lisp-native-compile
Эта команда компилирует файл, открытый в текущем буфере, в нативный код, если файл изменился с момента последней нативной компиляции.
- Команда: emacs-lisp-native-compile-and-load
Эта команда компилирует файл, открытый в текущем буфере, в нативный код, как
emacs-lisp-native-compile, но также загружает нативный код по завершении компиляции.
Следующая функция позволяет программам Lisp проверять во время выполнения, доступна ли нативная компиляция.
- Функция: native-comp-available-p
Эта функция возвращает значение, не равное
nil, если в работающий процесс Emacs встроена поддержка нативной компиляции. В системах, где libgccjit загружается динамически, функция также проверяет, доступна ли эта библиотека и можно ли её загрузить. Программам Lisp, которым необходимо заранее узнать, доступна ли нативная компиляция, следует использовать этот предикат.
По умолчанию асинхронная нативная компиляция записывает созданные файлы *.eln в подкаталог первого доступного для записи каталога, указанного в переменной native-comp-eln-load-path (см. Переменные нативной компиляции). Это можно изменить с помощью следующей функции в файлах запуска:
- Функция: startup-redirect-eln-cache cache-directory
Эта функция настраивает асинхронную нативную компиляцию так, чтобы созданные файлы *.eln записывались в cache-directory, который должен быть строкой с именем одного каталога. Она также деструктивно изменяет
native-comp-eln-load-pathтак, чтобы первым элементом стал cache-directory. Если cache-directory не является абсолютным именем файла, он интерпретируется относительноuser-emacs-directory(см. Файл инициализации).
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/Native_002dCompilation-Functions.html