¿Para qué se necesita la función `purecopy`?


23

Estaba mirando compile.ely noté esta construcción :

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

Los purecopydocumentos indican:

purecopy es una función incorporada en el 'código fuente C'.

(purecopy OBJ)

Haga una copia del objeto OBJ en puro almacenamiento. Copia recursivamente contenidos de vectores y contras de células. No copia símbolos. Copia cadenas sin propiedades de texto.

Así que creo que entiendo por qué podría ser necesario si se esperaba que compile-commandcontuviera una lista compleja que podría requerir modificaciones en una fecha posterior. Sin embargo, es solo una cadena simple, entonces, ¿por qué es purecopynecesario? Más en general, ¿cuándo se purecopynecesita?

Respuestas:


31

purecopy nunca se necesita en la configuración del usuario o en bibliotecas de terceros. De hecho, es un no-op cuando se llama desde una instancia normal de Emacs. De Pure Storage :

Esta función es no operativa, excepto mientras Emacs se está construyendo y volcando ; generalmente se llama solo en archivos Lisp precargados.

A continuación se incluye información básica.

Puro almacenamiento

Emacs tiene un proceso de compilación de dos etapas. Primero construye un binario simple, y luego ejecuta este binario, carga un conjunto seleccionado de bibliotecas integradas, y luego volca una imagen de memoria del proceso, y crea el emacsbinario real a partir de este volcado.

Las razones de este complicado proceso son un mejor rendimiento y un menor uso de memoria: la precarga de las bibliotecas esenciales de Emacs Lisp permite un inicio más rápido, ya que no se requieren más E / S para cargar las bibliotecas integradas y disminuye el uso de la memoria, ya que las bibliotecas precargadas se puede compartir entre todas las instancias de Emacs.

Esta área de memoria particular que contiene las bibliotecas precargadas es el "almacenamiento puro". Es de solo lectura, por lo tanto, "puro", para permitir el intercambio de memoria mencionado anteriormente. Por lo tanto, purecopyes un no-op en instancias normales de Emacs: de todos modos, no podría escribir en almacenamiento puro. En consecuencia, el almacenamiento puro también está exento de la recolección de basura.

Sin embargo, al crear y volcar la imagen de memoria para bibliotecas precargadas, estas bibliotecas se pueden usar purecopypara "marcar" objetos específicos para la asignación en almacenamiento puro, de todos modos, los objetos que se usan con frecuencia son necesarios para toda la vida útil de Emacs.

Las cadenas en almacenamiento puro son esencialmente cadenas constantes estáticas globales. Dado "make -k"que se usará con frecuencia para ejecutar sesiones de Emacs (es probable que sea el comando de compilación más utilizado, incluso hoy en día), tiene sentido mantener esta cadena constante y estática, para evitar la reasignación innecesaria y la recolección de basura.

Este concepto de almacenamiento puro es también la razón por la modificación de los .elarchivos de algunos (en particular incorporados en las bibliotecas startup.el, subr.ely otros) no tiene ningún efecto: Emacs en realidad nunca las cargas de los archivos de origen de estas bibliotecas. En cambio, tiene su código de bytes integrado en su binario, y los carga desde un área de memoria especial.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.