A cosa serve la funzione `purecopy`?


23

Stavo correndo compile.ele ho notato questa costruzione :

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

I purecopydocumenti dichiarano:

purecopy è una funzione integrata in "codice sorgente C".

(purecopy OBJ)

Crea una copia dell'oggetto OBJ nella memoria pura. Copia ricorsivamente i contenuti di vettori e celle contro. Non copia simboli. Copia le stringhe senza proprietà di testo.

Quindi penso di capire perché potrebbe essere necessario se ci si aspettasse che compile-commandcontenesse un elenco complesso che potrebbe richiedere modifiche in un secondo momento. Tuttavia è solo una semplice stringa, quindi perché è purecopynecessario? Più in generale, quando è purecopynecessario?

Risposte:


31

purecopy mai necessario nella configurazione dell'utente o nelle librerie di terze parti. In realtà, è una no-op quando chiamato da una normale istanza di Emacs. Da Pure Storage :

Questa funzione è no-op tranne quando Emacs viene creato e scaricato ; di solito viene chiamato solo nei file Lisp precaricati.

Di seguito alcune informazioni di base.

Conservazione pura

Emacs ha un processo di costruzione in due fasi. Crea prima un semplice binario, quindi esegue questo binario, carica un set selezionato di librerie integrate, quindi scarica un'immagine di memoria del processo e crea il vero emacsbinario da questo dump.

Le ragioni di questo complicato processo sono le prestazioni migliori e il minor utilizzo della memoria: il pre-caricamento delle librerie Emacs Lisp essenziali consente un avvio più rapido, poiché non sono necessari ulteriori IO per caricare le librerie integrate e riduce l'utilizzo della memoria, poiché le librerie precaricate può essere condiviso tra tutte le istanze di Emacs.

Questa particolare area di memoria che contiene le librerie precaricate è la "memoria pura". È di sola lettura, quindi "puro", consentire la suddetta condivisione della memoria. Quindi, purecopyè una no-op nelle normali istanze di Emacs: non può comunque scrivere nella memoria pura. Di conseguenza, anche l'archiviazione pura è esente dalla raccolta dei rifiuti.

Tuttavia, durante la creazione e il dumping dell'immagine di memoria per le librerie precaricate, queste librerie possono essere utilizzate purecopyper "contrassegnare" oggetti specifici per l'allocazione nella memoria pura, in genere oggetti utilizzati di frequente che sono comunque necessari per l'intera vita di Emacs.

Le stringhe nella memoria pura sono essenzialmente stringhe costanti statiche globali. Poiché "make -k"verrà utilizzato frequentemente durante l'esecuzione delle sessioni di Emacs (è probabilmente il comando di compilazione più frequentemente utilizzato, anche oggi), ha senso mantenere questa stringa costante e statica, per evitare inutili riassegnazioni e garbage collection.

Questo concetto di archiviazione puro è anche il motivo per cui la modifica dei .elfile di alcuni (in particolare incorporati nelle biblioteche startup.el, subr.ele altri) non ha alcun effetto: Emacs realtà mai carichi i file di origine di queste librerie. Invece, ha il suo codice byte incorporato nel suo binario e li carica da un'area di memoria speciale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.