Компиляция Lisp в машинный код
В дополнение к байт-компиляции, описанной в предыдущей главе, Emacs также может при необходимости компилировать определения функций Lisp в настоящий скомпилированный код, известный как машинный код. Эта возможность использует библиотеку libgccjit, входящую в дистрибутив GCC, и требует, чтобы Emacs был собран с поддержкой этой библиотеки. Для компиляции кода Lisp в машинный код в системе также должны быть доступны GCC и Binutils (ассемблер и компоновщик).
Чтобы определить, может ли текущий процесс Emacs создавать и загружать код Lisp, скомпилированный в машинный код, вызовите native-comp-available-p (см. Функции компиляции в машинный код).
В отличие от байт-компилированного кода, код Lisp, скомпилированный в машинный код, непосредственно выполняется аппаратными средствами компьютера и поэтому работает на полной скорости, которую может обеспечить процессор. Ускорение зависит от того, что делает код Lisp, но обычно код работает в 2,5–5 раз быстрее соответствующего байт-компилированного кода.
Поскольку машинный код обычно несовместим между разными системами, код, скомпилированный в машинный код, нельзя переносить с одного компьютера на другой; его можно использовать только на том же компьютере, где он был создан, или на очень похожих компьютерах (с тем же процессором и библиотеками времени выполнения). Переносимость кода, скомпилированного в машинный код, такая же, как у динамических библиотек (файлов .so или .dll).
Библиотеки кода, скомпилированного в машинный код, имеют важные зависимости от примитивов Emacs Lisp (см. Что такое функция?) и соглашений об их вызове, поэтому Emacs обычно не загружает код, скомпилированный в машинный код более ранними или более поздними версиями Emacs; компиляция одного и того же кода Lisp другой версией Emacs обычно создаёт библиотеку с уникальным именем файла, которую сможет загрузить только эта версия Emacs. Однако использование уникальных имён файлов позволяет размещать в одном каталоге несколько версий одной и той же библиотеки Lisp, скомпилированных в машинный код разными версиями Emacs.
Привязка переменной file-local, не являющаяся 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; см. Функции компиляции в машинный код.
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-Compilation.html