Переменные нативной компиляции
В этом разделе описаны переменные, управляющие нативной компиляцией.
- Пользовательская настройка: native-comp-speed
Эта переменная задаёт уровень оптимизации для нативной компиляции. Её значение должно быть числом от −1 до 3. Значения от 0 до 3 задают уровни оптимизации, эквивалентные соответствующим параметрам командной строки компилятора -O0, -O1 и т. д. Значение −1 отключает нативную компиляцию: функции и файлы будут только компилироваться в байт-код; однако файлы *.eln всё равно будут созданы, но будут содержать скомпилированный код в форме байт-кода. (Этого можно добиться на уровне отдельной функции с помощью формы
(declare (speed -1)); см. Формаdeclare.) Значение по умолчанию — 2.
- Пользовательская настройка: compilation-safety
-
Эта переменная задаёт уровень безопасности для создаваемого машинного кода. Значением должно быть число — 0 или 1, со следующими значениями:
- 0
Созданный код может работать некорректно (вплоть до аварийного завершения Emacs), если объявление функции неправильно описывает её действия или способ вызова, а сама функция скомпилирована в машинный код.
- 1
Созданный код должен генерироваться безопасным способом, даже если объявления функций некорректны.
Это также можно настраивать на уровне отдельной функции с помощью формы
safetydeclare; см. Формаdeclare.
- Пользовательская настройка: native-comp-debug
-
Эта переменная задаёт уровень отладочной информации, создаваемой при нативной компиляции. Её значение должно быть числом от 0 до 3 со следующими значениями:
- 0
Без отладочных данных. Это значение по умолчанию.
- 1
Добавлять отладочные символы в машинный код. Это упрощает отладку машинного кода с помощью отладчиков, таких как
gdb.- 2
Как при значении 1, а также создавать дамп псевдокода на C.
- 3
Как при значении 2, а также создавать дампы промежуточных этапов GCC и файла журнала libgccjit.
Созданный псевдокод на C сохраняется в том же каталоге, что и соответствующий файл .eln.
- Пользовательская настройка: native-comp-verbose
-
Эта переменная управляет подробностью вывода при нативной компиляции, подавляя некоторые или все сообщения журнала. Если её значение равно 0 — значению по умолчанию, — подавляются все сообщения журнала. Значения от 1 до 3 разрешают запись сообщений, уровень которых выше заданного значения. Значения интерпретируются следующим образом:
- 0
Без ведения журнала. Это значение по умолчанию.
- 1
Записывать окончательное представление кода в LIMPLE.
- 2
Записывать LAP, окончательное представление LIMPLE и некоторую дополнительную информацию об этапах обработки.
- 3
Максимальная подробность: записывать всё.
- Пользовательская настройка: native-comp-async-jobs-number
Эта переменная задаёт максимальное число одновременно запускаемых подпроцессов нативной компиляции. Значение должно быть неотрицательным числом. Значение по умолчанию — 0: в этом случае используется половина числа вычислительных блоков ЦП или 1, если у ЦП только один вычислительный блок.
- Пользовательская настройка: native-comp-async-report-warnings-errors
-
Если значение этой переменной не равно
nil, предупреждения и ошибки из асинхронных подпроцессов нативной компиляции отображаются в основном сеансе Emacs в буфере с именем *Warnings*. Значение по умолчаниюtозначает, что полученный буфер будет показан. Чтобы записывать предупреждения, не открывая буфер *Warnings*, задайте для этой переменной значениеsilent.Частая причина появления предупреждений при асинхронной нативной компиляции — компиляция файла, в котором отсутствует часть
requireнеобходимого компонента. Компонент может быть загружен в основной процесс Emacs, но это может быть не так для подпроцесса, поскольку нативная компиляция всегда запускается в подпроцессе с чистым окружением.
- Пользовательская настройка: native-comp-async-query-on-exit
Если значение этой переменной не равно
nil, при выходе Emacs спросит, следует ли завершить все ещё работающие асинхронные подпроцессы нативной компиляции, тем самым предотвратив запись соответствующих файлов .eln. Если значение равноnil— значению по умолчанию, — Emacs завершит эти подпроцессы без запроса.
Переменная native-comp-eln-load-path содержит список каталогов, в которых Emacs ищет файлы *.eln (см. Поиск библиотек); в этой роли она эквивалентна load-path, используемой для поиска файлов *.el и *.elc. Каталоги из этого списка также используются для записи файлов *.eln, создаваемых при асинхронной нативной компиляции; в частности, Emacs записывает эти файлы в первый доступный для записи каталог из списка. Поэтому можно управлять местом хранения результатов нативной компиляции, изменив значение этой переменной.
- Переменная: native-comp-jit-compilation
Если значение этой переменной не равно
nil, она включает асинхронную нативную компиляцию (также называемую компиляцией «точно вовремя», или JIT) загружаемых Emacs файлов *.elc, для которых ещё не существуют соответствующие файлы *.eln. Эта JIT-компиляция выполняется в отдельных подпроцессах Emacs, работающих в пакетном режиме, в соответствии со значениемnative-comp-async-jobs-number. После успешного завершения JIT-компиляции файла Lisp полученный файл .eln загружается, и его код заменяет определения функций, предоставленные файлом .elc.
Установка для native-comp-jit-compilation значения nil отключает нативную JIT-компиляцию. Однако даже при отключённой нативной JIT-компиляции Emacs может потребоваться запускать асинхронные подпроцессы нативной компиляции для создания трамплинов. Чтобы управлять этим, используйте отдельную переменную, описанную ниже.
- Переменная: native-comp-enable-subr-trampolines
-
Эта переменная управляет созданием трамплинов. Трамплин — это небольшой фрагмент машинного кода, необходимый для вызова примитивов Lisp, для которых были заданы рекомендации или переопределения, из кода Lisp, скомпилированного в машинный код при значении
native-comp-speed, равном 2 или больше. Emacs сохраняет созданные трамплины в отдельных файлах *.eln. По умолчанию значение этой переменной равноt, что включает создание файлов трамплинов; значениеnilотключает создание трамплинов. Обратите внимание: если трамплин, необходимый для добавления рекомендации к примитиву или его переопределения, недоступен и не может быть создан, вызовы этого примитива из скомпилированного в машинный код Lisp будут игнорировать переопределения и рекомендации и работать так, как если бы примитив вызывался непосредственно из C. Поэтому мы не рекомендуем отключать создание трамплинов, если только вы не уверены, что все трамплины, необходимые вашим программам на Lisp, уже скомпилированы и доступны Emacs.Значением этой переменной также может быть строка; в этом случае она задаёт имя каталога для хранения созданных файлов трамплинов *.eln, переопределяя каталоги из
native-comp-eln-load-path. Это полезно, если вы хотите создавать трамплины по мере необходимости, но не хотите хранить их в каталогеHOMEпользователя или в других общедоступных каталогах, где хранятся файлы *.eln. Однако, в отличие от каталогов изnative-comp-eln-load-path, трамплины будут храниться в каталоге, заданном значением этой переменной, а не в его подкаталоге для конкретной версии. Если имя этого каталога не является абсолютным, оно интерпретируется относительноinvocation-directory(см. Окружение операционной системы)Если значение этой переменной не равно
nilи Emacs требуется создать трамплин, но найти доступный для записи каталог для его хранения не удаётся, он будет сохранён вtemporary-file-directory(см. Создание уникальных имён файлов).Трамплины, созданные при отсутствии доступного для записи каталога или когда значение этой переменной является строкой, будут доступны только в течение текущего сеанса Emacs, поскольку Emacs не ищет трамплины ни в одном из этих мест.
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-Variables.html