Wofür wird die Funktion `purecopy` benötigt?

23

Ich habe mich durchgearbeitet compile.elund diese Konstruktion bemerkt :

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

In den purecopyDokumenten heißt es:

purecopy ist eine in C-Quellcode integrierte Funktion.

(purecopy OBJ)

Erstellen Sie eine Kopie des Objekts OBJ im reinen Speicher. Kopiert rekursiv den Inhalt von Vektoren und Zellen. Kopiert keine Symbole. Kopiert Zeichenfolgen ohne Texteigenschaften.

Ich denke, ich verstehe, warum es notwendig sein kann, wenn erwartet wurde, dass compile-commandeine komplexe Alist enthalten ist, die zu einem späteren Zeitpunkt möglicherweise geändert werden muss. Es ist jedoch nur eine einfache Zeichenfolge, warum ist es also purecopynotwendig? Generell, wann wird purecopybenötigt?

dgtized
quelle

Antworten:

31

purecopy Wird in Benutzerkonfigurationen oder Bibliotheken von Drittanbietern nie benötigt. Tatsächlich ist es ein No-Op, wenn es von einer normalen Emacs-Instanz aufgerufen wird. Aus reiner Lagerung :

Diese Funktion ist nur möglich, wenn Emacs erstellt und gesichert wird . Es wird normalerweise nur in vorinstallierten Lisp-Dateien aufgerufen.

Es folgen einige Hintergrundinformationen.

Reine Lagerung

Emacs hat einen zweistufigen Build-Prozess. Zuerst wird eine einfache Binärdatei erstellt, und dann wird diese Binärdatei ausgeführt, ein ausgewählter Satz integrierter Bibliotheken geladen, und anschließend wird ein Speicherabbild des Prozesses erstellt und die echte emacsBinärdatei aus diesem Speicherauszug erstellt .

Die Gründe für diesen komplizierten Prozess sind eine bessere Leistung und eine geringere Speichernutzung: Das Vorladen der wichtigsten Emacs Lisp-Bibliotheken ermöglicht einen schnelleren Start, da zum Laden der integrierten Bibliotheken keine weiteren E / A-Vorgänge erforderlich sind kann von allen Emacs-Instanzen gemeinsam genutzt werden.

Dieser spezielle Speicherbereich, der die vorinstallierten Bibliotheken enthält, ist der "reine Speicher". Es ist nur lesbar, daher "rein", um die oben erwähnte Speicherfreigabe zu ermöglichen. Daher purecopyist es in normalen Emacs-Fällen ein No-Op: Es konnte sowieso nicht in den reinen Speicher geschrieben werden. Folglich ist auch die reine Lagerung von der Müllabfuhr befreit.

Während das Speicherabbild für vorinstallierte Bibliotheken erstellt und gesichert wird, können diese Bibliotheken jedoch purecopybestimmte Objekte für die Zuordnung im reinen Speicher "markieren". Dies sind normalerweise häufig verwendete Objekte, die ohnehin für die gesamte Lebensdauer von Emacs benötigt werden.

Zeichenfolgen im reinen Speicher sind im Wesentlichen globale statische konstante Zeichenfolgen. Da "make -k"Emacs-Sitzungen häufig ausgeführt werden (dies ist wahrscheinlich auch heute noch der am häufigsten verwendete Kompilierungsbefehl), ist es sinnvoll, diese Zeichenfolge konstant und statisch zu halten, um unnötige Neuzuweisungen und Garbage Collection zu vermeiden.

Dieses Konzept der reinen Lagerung ist auch der Grund , warum die modifizierenden .elDateien von einigen integrierten Bibliotheken (vor allem startup.el, subr.elund andere) hat keine Auswirkung: Emacs nie tatsächlich lädt die Quelldateien dieser Bibliotheken. Stattdessen wird der Bytecode in die Binärdatei integriert und aus einem speziellen Speicherbereich geladen.

Mondhorn
quelle