Динамическая загрузка отдельных функций
При компиляции файла вы можете по желанию включить функцию динамической загрузки функций (также известную как ленивая загрузка). При динамической загрузке функций загрузка файла не полностью считывает определения функций в файле. Вместо этого каждое определение функции содержит заполнитель, который ссылается на файл. При первом вызове каждой функции она считывает полное определение из файла, чтобы заменить заполнитель.
Преимущества динамической загрузки функций заключаются в том, что загрузка файла должна стать быстрее. Это хорошо для файла, содержащего много отдельных вызываемых пользователем функций, если использование одной из них не подразумевает, что вы, вероятно, также будете использовать остальные. Специализированный режим, предоставляющий множество команд клавиатуры, часто имеет такую схему использования: пользователь может вызвать режим, но использовать только несколько из предоставляемых им команд.
Функция динамической загрузки имеет определенные недостатки:
- Если вы удалите или переместите скомпилированный файл после его загрузки, Emacs больше не сможет загрузить оставшиеся определения функций, которые еще не были загружены.
- Если вы измените скомпилированный файл (например, скомпилировав новую версию), то попытка загрузить любую функцию, которая еще не была загружена, обычно приведет к бессмысленным результатам.
Эти проблемы никогда не возникнут в обычных условиях с установленными файлами Emacs. Но они вполне могут произойти с файлами Lisp, которые вы изменяете. Самый простой способ предотвратить эти проблемы — сразу же перегрузить новый скомпилированный файл после каждой перекомпиляции.
Опыт показывает, что использование динамической загрузки функций обеспечивает преимущества, которые трудно измерить, поэтому эта функция устарела с момента Emacs 27.1.
Компилятор байткода использует функцию динамической загрузки функций, если переменная byte-compile-dynamic имеет значение, отличное от nil во время компиляции. Не устанавливайте эту переменную глобально, так как динамическая загрузка желательна только для определенных файлов. Вместо этого включите эту функцию для определенных исходных файлов с помощью локальных переменных файла. Например, вы можете сделать это, написав этот текст в первой строке файла исходного кода:
-*-byte-compile-dynamic: t;-*-
- Переменная: byte-compile-dynamic
Если это значение отлично от
nil, байткодовый компилятор генерирует скомпилированные файлы, настроенные для динамической загрузки функций.
- Функция: fetch-bytecode функция
Если функция — это объект функции байткода, это немедленно завершает загрузку байткода функции из её скомпилированного файла, если он ещё не полностью загружен. В противном случае ничего не делает. Всегда возвращает функцию.
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/Dynamic-Loading.html