Для чего нужна функция purecopy?

23

Я просматривал compile.elи заметил эту конструкцию :

(defcustom compile-command (purecopy "make -k ")) 

В purecopyдокументах заявляют:

purecopy - это встроенная функция в `C исходном коде '.

(чистокровный OBJ)

Сделайте копию объекта OBJ в чистом хранилище. Рекурсивно копирует содержимое векторов и минусов. Не копирует символы. Копирует строки без текстовых свойств.

Поэтому я думаю, что понимаю, почему это может быть необходимо, если ожидалось, что он compile-commandсодержит сложный список, который может потребовать изменения на более позднем этапе. Однако это просто простая строка, так зачем это purecopyнужно? Вообще, когда это purecopyнеобходимо?

dgtized
источник

Ответы:

31

purecopy никогда не требуется в пользовательской конфигурации или сторонних библиотеках. На самом деле, он не активен, когда вызывается из обычного экземпляра Emacs. Из чистого хранилища :

Эта функция недоступна, за исключением тех случаев, когда Emacs собирается и сбрасывается ; обычно вызывается только в предварительно загруженных файлах Lisp.

Некоторая справочная информация следует.

Чистое Хранение

Emacs имеет двухэтапный процесс сборки. Сначала он создает простой двоичный файл, а затем запускает этот двоичный файл, загружает выбранный набор встроенных библиотек, а затем выгружает образ памяти процесса и создает настоящий emacsдвоичный файл из этого дампа.

Причины этого запутанного процесса - лучшая производительность и меньшее использование памяти: предварительная загрузка необходимых библиотек Emacs Lisp обеспечивает более быстрый запуск, поскольку больше не требуется ввод-вывод для загрузки встроенных библиотек, и уменьшает использование памяти, поскольку предварительно загруженные библиотеки может использоваться всеми экземплярами Emacs

Эта конкретная область памяти, которая содержит предварительно загруженные библиотеки, является «чистой памятью». Это только для чтения, следовательно, «чистый», чтобы учесть вышеупомянутый обмен памятью. Следовательно, purecopyв обычных экземплярах Emacs это не работает: он все равно не может записать в чистое хранилище. Следовательно, чистое хранилище также освобождается от сбора мусора.

Однако, создавая и выгружая образ памяти для предварительно загруженных библиотек, эти библиотеки могут использовать, purecopyчтобы «пометить» конкретные объекты для размещения в чистом хранилище, обычно часто используемые объекты, которые так или иначе необходимы для всего времени существования Emacs.

Строки в чистом хранилище по сути являются глобальными статическими константами. Поскольку "make -k"он будет часто использоваться в сеансах Emacs (вероятно, это наиболее часто используемая команда компиляции, даже сегодня), имеет смысл сохранять эту строку постоянной и статической, чтобы избежать ненужного перераспределения и сбора мусора.

Эта концепция чистого хранения также является причиной того, почему изменения в .elфайлы некоторых встроенных библиотек ( в частности startup.el, subr.elи другие) не имеет никакого эффекта: Emacs никогда на самом деле загружает исходные файлы этих библиотек. Вместо этого он имеет свой байт-код, встроенный в свой двоичный файл, и загружает их из специальной области памяти.

lunaryorn
источник