Компиляция Lisp в машинный код
В дополнение к байт-компиляции, описанной в предыдущей главе, 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.
Связанное с файлом значение переменной no-byte-compile (см. Байт-компиляция) также отключает машинную компиляцию этого файла. Кроме того, аналогичная переменная no-native-compile отключает только машинную компиляцию файла. Если указаны и no-byte-compile, и no-native-compile, приоритет отдается первому.
| • Функции машинной компиляции | Функции для машинной компиляции Lisp. | |
| • Переменные машинной компиляции | Переменные, контролирующие машинную компиляцию. |
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/Native-Compilation.html