À quoi sert la fonction «purecopy»?

23

Je parcourais compile.elet j'ai remarqué cette construction :

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

Les purecopydocuments indiquent:

purecopy est une fonction intégrée au «code source C».

(OBJ purecopy)

Faites une copie de l'objet OBJ dans le stockage pur. Copie récursivement le contenu des vecteurs et contre les cellules. Ne copie pas les symboles. Copie des chaînes sans propriétés de texte.

Je pense donc que je comprends pourquoi cela pourrait être nécessaire si l'on s'attendait à ce qu'il compile-commandcontienne une liste complexe qui pourrait nécessiter une modification à une date ultérieure. Cependant, c'est juste une chaîne simple, alors pourquoi est-ce purecopynécessaire? Plus généralement, quand est-il purecopynécessaire?

dgtized
la source

Réponses:

31

purecopy jamais nécessaire dans la configuration utilisateur ou les bibliothèques tierces. En fait, il s'agit d'un no-op lorsqu'il est appelé à partir d'une instance Emacs normale. De Pure Storage :

Cette fonction est un no-op, sauf pendant la création et le vidage d'Emacs ; il est généralement appelé uniquement dans les fichiers Lisp préchargés.

Voici quelques informations générales.

Stockage pur

Emacs a un processus de construction en deux étapes. Il crée d'abord un binaire ordinaire, puis exécute ce binaire, charge un ensemble sélectionné de bibliothèques intégrées, puis vide une image mémoire du processus et crée le vrai emacsbinaire à partir de ce vidage.

Les raisons de ce processus compliqué sont de meilleures performances et une utilisation moindre de la mémoire: le préchargement des bibliothèques Emacs Lisp essentielles permet un démarrage plus rapide, car aucune autre E / S n'est requise pour charger les bibliothèques intégrées et diminue l'utilisation de la mémoire, car les bibliothèques préchargées peut être partagé entre toutes les instances Emacs.

Cette zone de mémoire particulière qui contient les bibliothèques préchargées est le «stockage pur». Il est en lecture seule, donc «pur», pour permettre le partage de mémoire susmentionné. Par conséquent, purecopyc'est un no-op dans les instances normales d'Emacs: il ne pouvait de toute façon pas écrire dans le stockage pur. Par conséquent, le stockage pur est également exempt de collecte des ordures.

Cependant, lors de la création et du vidage de l'image mémoire pour les bibliothèques préchargées, ces bibliothèques peuvent utiliser purecopypour «marquer» des objets spécifiques à allouer dans le stockage pur, des objets généralement utilisés qui sont de toute façon nécessaires pour toute la durée de vie d'Emacs.

Les chaînes en stockage pur sont essentiellement des chaînes constantes statiques globales. Étant donné qu'il "make -k"va être utilisé fréquemment lors de l'exécution de sessions Emacs (c'est probablement la commande de compilation la plus fréquemment utilisée, même aujourd'hui), il est logique de garder cette chaîne constante et statique, pour éviter une réallocation inutile et un garbage collection.

Ce concept de stockage pur est aussi la raison pour laquelle la modification des .elfichiers de certains intégrés dans les bibliothèques (notamment startup.el, subr.elet d' autres) n'a pas d' effet: Emacs jamais réellement charge les fichiers source de ces bibliothèques. Au lieu de cela, il a leur code d'octet intégré dans son binaire et les charge à partir d'une zone de mémoire spéciale.

lunaryorn
la source