В дополнение к побайтовой компиляции, описанной в предыдущей главе, Emacs также может опционально компилировать определения функций Lisp в истинный скомпилированный код, известный как нативный код. Эта функция использует библиотеку libgccjit, которая является частью дистрибутива GCC и требует, чтобы Emacs был собран с поддержкой использования этой библиотеки. Также требуется, чтобы GCC и Binutils (ассемблер и компоновщик) были доступны в вашей системе, чтобы вы могли нативно скомпилировать код Lisp.
Чтобы определить, может ли текущий процесс Emacs создавать и загружать
нативно скомпилированный код Lisp, вызовите
native-comp-available-p (см. Функции нативной компиляции).
В отличие от побайтового кода, нативно скомпилированный код Lisp выполняется напрямую аппаратным обеспечением машины и поэтому работает с полной скоростью, которую может обеспечить хостовый ЦП. Полученное ускорение в целом зависит от того, что делает код Lisp, но обычно он в 2,5–5 раз быстрее, чем соответствующий побайтово скомпилированный код.
Поскольку нативный код в целом несовместим между различными системами, нативно скомпилированный код не переносим с одного компьютера на другой; его можно использовать только на том же компьютере, где он был создан, или на очень похожих (имеющих тот же ЦП и библиотеки времени выполнения). Переносимость нативно скомпилированного кода та же, что и у библиотек с общей компоновкой (.so или .dll).
Библиотеки нативно скомпилированного кода включают критические зависимости от примитивов Emacs Lisp (см. Что такое функция?) и их соглашения о вызовах, поэтому Emacs обычно не загружает нативно скомпилированный код, созданный более ранними или более поздними версиями Emacs; нативная компиляция одного и того же кода Lisp другой версией Emacs обычно создает нативно скомпилированную библиотеку под уникальным именем файла, которую сможет загрузить только эта версия Emacs. Однако использование уникальных имен файлов позволяет нескольким версиям одной и той же библиотеки Lisp, скомпилированной нативно несколькими разными версиями Emacs, размещать в одном каталоге.
Не nil локальная переменная, устанавливающая
no-byte-compile (см. Побайтовая компиляция),
также отключает нативную компиляцию этого файла. Кроме того, аналогичная
переменная
no-native-compile отключает только нативную компиляцию
файла. Если указаны как no-byte-compile, так и
no-native-compile, приоритет имеет первая.
Иногда может возникнуть необходимость предотвратить запись результатов
нативной компиляции, файлов *.eln, в подкаталог
user-emacs-directory (см. Файл инициализации).
Вы можете сделать это, изменив значение native-comp-eln-load-path
(см. Переменные нативной компиляции)
или временно указав переменной окружения
HOME несуществующий каталог. Обратите внимание, что последний
метод все еще может создать небольшое количество файлов *.eln,
если Emacs необходимо сгенерировать трамполины, которые используются,
если примитивы Lisp заменяются или переопределяются в вашем коде Lisp, который
нативно компилируется. См. трамполины.
В качестве альтернативы вы можете указать, что файлы *.eln
записываются в невыбранный каталог, используя функцию
startup-redirect-eln-cache; см. Функции нативной компиляции.