18.1 Функции нативной компиляции

Нативная компиляция реализована как побочный эффект байт-компиляции (см. Байт-компиляция). Таким образом, компиляция Lisp-кода в машинный код всегда также создаёт его байт-код, и поэтому все правила и предостережения по подготовке Lisp-кода к байт-компиляции (см. Функции байт-компиляции) действительны и для нативной компиляции.

Вы можете скомпилировать в машинный код либо отдельное определение функции или макроса, либо целый файл с Lisp-кодом, с помощью функции native-compile. Компиляция файла в машинный код приведёт к созданию файла .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, что и процесс, вызвавший эту функцию.

Функция: 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, если файл или каталог должны быть выбраны для компиляции.

В системах с несколькими исполнительными устройствами CPU, когда files содержит более одного файла, эта функция обычно запускает несколько дочерних процессов компиляции параллельно под управлением native-comp-async-jobs-number (см. Переменные нативной компиляции).

Команда: 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 (см. Файл инициализации).