Для чого потрібна функція `purecopy`?


23

Я переглядав compile.elі помітив цю конструкцію :

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

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

purecopy - це вбудована функція у `C вихідному коді '.

(чистокопія OBJ)

Зробіть копію об'єкта OBJ у чистому сховищі. Рекурсивно копіює вміст комірок векторів і мінусів. Не копіює символи. Копіює рядки без властивостей тексту.

Тому я думаю, що я розумію, чому це може знадобитися, якщо очікувалося, що він compile-commandмістить складний перелік, який може потребувати внесення змін у більш пізній термін. Однак це просто простий рядок, так навіщо це purecopyпотрібно? Більш загально, коли це purecopyпотрібно?

Відповіді:


31

purecopy ніколи не потрібні в конфігурації користувача або сторонніх бібліотеках. Насправді, це не-оп, коли його викликають із звичайного екземпляра Emacs. З чистого зберігання :

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

Нижче випливає деяка довідкова інформація.

Чисте зберігання

Emacs має двоступеневий процес збирання. Він спочатку будує звичайний двійковий файл, а потім запускає цей двійковий файл, завантажує вибраний набір вбудованих бібліотек, а потім скидає зображення пам'яті процесу та створює справжній emacsбінарний файл із цього дампа.

Причини цього згорнутого процесу полягають у кращій продуктивності та меншому використанні пам’яті: Попереднє завантаження основних бібліотек Emacs Lisp дозволяє швидше запустити, оскільки для завантаження вбудованих бібліотек не потрібно більше вводу-виводу і зменшує використання пам'яті, оскільки попередньо завантажені бібліотеки можна поділитися між усіма примірниками Emacs.

Ця конкретна область пам'яті, яка містить попередньо завантажені бібліотеки, є «чистим сховищем». Це читається тільки, отже, «чисто», щоб дозволити спільний обмін пам’яттю. Отже, purecopyв нормальних екземплярах Emacs немає жодної операції: все-таки він не міг записатись у чисту сховище Отже, чисте зберігання також звільнене від вивезення сміття.

Однак, створюючи та скидаючи зображення пам'яті для попередньо завантажених бібліотек, ці бібліотеки можуть використовувати purecopyдля "маркування" конкретні об'єкти для розподілу в чистому сховищі, як правило, часто використовувані об'єкти, які так чи інакше потрібні протягом усього життя Emacs.

Струни в чистому сховищі - це по суті глобальні статичні постійні струни. Оскільки "make -k"він буде часто використовуватися для запуску сеансів Emacs (це, мабуть, найчастіше використовується команда компіляції навіть сьогодні), має сенс тримати цей рядок постійним та статичним, щоб уникнути зайвого перерозподілу та збирання сміття.

Ця концепція чистого зберігання також є причиною того, чому зміни в .elфайли деяких вбудованих бібліотек ( в Зокрема startup.el, subr.elі інші) не має ніякого ефекту: Emacs ніколи на насправді завантажує вихідні файли цих бібліотек. Натомість у них вбудований їхній байтовий код у свій бінарний файл та завантажує їх із спеціальної області пам'яті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.