Untuk apa fungsi `purecopy` diperlukan?

23

Saya compile.elmelihat-lihat dan melihat konstruksi ini :

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

The purecopydocs menyatakan:

purecopy adalah fungsi bawaan di `kode sumber C '.

(purecopy OBJ)

Buat salinan objek OBJ dalam penyimpanan murni. Salin konten vektor dan sel kontra secara rekursif. Tidak menyalin simbol. Menyalin string tanpa properti teks.

Jadi saya pikir saya mengerti mengapa mungkin perlu jika diharapkan compile-commandberisi daftar rumit yang mungkin memerlukan modifikasi di kemudian hari. Namun ini hanya string sederhana, jadi mengapa purecopyperlu? Lebih umum, kapan purecopydibutuhkan?

dgtized
sumber

Jawaban:

31

purecopy tidak pernah diperlukan dalam konfigurasi pengguna atau perpustakaan pihak ketiga. Bahkan, itu adalah no-op ketika dipanggil dari instance Emacs normal. Dari Penyimpanan Murni :

Fungsi ini adalah no-op kecuali saat Emacs sedang dibangun dan dibuang ; biasanya disebut hanya dalam file Lisp yang dimuat sebelumnya.

Beberapa informasi latar belakang berikut.

Penyimpanan Murni

Emacs memiliki proses pembangunan dua tahap. Pertama membangun biner biasa, dan kemudian menjalankan biner ini, memuat kumpulan perpustakaan bawaan yang dipilih, dan kemudian membuang gambar memori dari proses, dan menciptakan emacsbiner nyata dari dump ini.

Alasan untuk proses yang berbelit-belit ini adalah kinerja yang lebih baik dan penggunaan memori yang lebih sedikit: Pra-loading essential Emacs Lisp libraries memungkinkan startup lebih cepat, karena tidak ada IO lebih lanjut diperlukan untuk memuat perpustakaan built-in, dan mengurangi penggunaan memori, karena perpustakaan pre-loaded dapat dibagikan di antara semua instance Emacs.

Area memori khusus ini yang berisi pustaka yang dimuat sebelumnya adalah "penyimpanan murni". Dibaca hanya, karena itu "murni", untuk memungkinkan berbagi memori yang disebutkan sebelumnya. Karenanya, purecopyadalah no-op dalam contoh Emacs yang normal: Lagipula itu tidak bisa menulis ke penyimpanan murni. Akibatnya, penyimpanan murni juga dibebaskan dari pengumpulan sampah.

Namun, saat membuat dan membuang gambar memori untuk pustaka yang dimuat sebelumnya, pustaka ini dapat digunakan purecopyuntuk "menandai" objek tertentu untuk alokasi dalam penyimpanan murni, toh biasanya objek yang sering digunakan yang dibutuhkan untuk seluruh masa pakai Emacs.

String dalam penyimpanan murni pada dasarnya adalah string konstan statis global. Karena "make -k"akan sering digunakan dalam menjalankan sesi Emacs (kemungkinan ini adalah perintah kompilasi yang paling sering digunakan, bahkan hari ini), masuk akal untuk menjaga string ini konstan dan statis, untuk menghindari alokasi ulang yang tidak perlu dan pengumpulan sampah.

Konsep penyimpanan murni adalah juga alasan mengapa memodifikasi .elfile dari beberapa built-in perpustakaan (terutama startup.el, subr.el, dan lain-lain) tidak memiliki pengaruh: Emacs pernah benar-benar beban file sumber perpustakaan tersebut. Sebagai gantinya, ia memiliki kode byte yang dibangun ke dalam binernya, dan memuatnya dari area memori khusus.

lunaryorn
sumber