क्या कार्य `purecopy` के लिए आवश्यक है?


23

मैं भौंक रहा था compile.elऔर मैंने इस निर्माण पर ध्यान दिया :

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

purecopyडॉक्स राज्य:

प्योरकोपी `सी सोर्स कोड’ में एक अंतर्निहित फ़ंक्शन है।

(प्योरकोपी OBJ)

शुद्ध भंडारण में ऑब्जेक्ट OBJ की एक प्रति बनाएँ। वैक्टर और कॉन्स कोशिकाओं की सामग्री को पुन: कॉपी करता है। प्रतीकों की नकल नहीं करता। पाठ गुणों के बिना तार की नकल।

इसलिए मुझे लगता है कि मैं समझता हूं कि यह आवश्यक हो सकता है यदि यह उम्मीद की जाती है कि compile-commandइसमें एक जटिल मुट्ठी शामिल है जिसे बाद की तारीख में संशोधन की आवश्यकता हो सकती है। हालांकि इसकी सिर्फ एक साधारण स्ट्रिंग है, इसलिए purecopyआवश्यक क्यों है ? अधिक आम तौर पर, जब purecopyजरूरत होती है?

जवाबों:


31

purecopy उपयोगकर्ता विन्यास या तीसरे पक्ष के पुस्तकालयों में कभी भी आवश्यक नहीं है। वास्तव में, यह एक नो-ऑप है जब इसे सामान्य एमएसीएस उदाहरण से बुलाया जाता है। से शुद्ध संग्रहण :

यह समारोह एक नो-ऑप है, सिवाय जबकि Emacs का निर्माण और डंप किया जा रहा है ; इसे आमतौर पर केवल प्रीलोडेड लिस्प फ़ाइलों में कहा जाता है।

कुछ पृष्ठभूमि जानकारी इस प्रकार है।

शुद्ध भंडारण

Emacs की दो चरणीय निर्माण प्रक्रिया है। यह पहले एक सादे बाइनरी बनाता है, और फिर इस बाइनरी को चलाता है, बिल्ट-इन पुस्तकालयों के एक चयनित सेट को लोड करता है, और फिर प्रक्रिया की एक मेमोरी छवि को डंप करता है, और emacsइस डंप से वास्तविक बाइनरी बनाता है ।

इस जटिल प्रक्रिया के कारण बेहतर प्रदर्शन और कम मेमोरी उपयोग हैं: पूर्व-लोडिंग आवश्यक Emacs लिस्प पुस्तकालयों को तेजी से स्टार्टअप की अनुमति देता है, क्योंकि पहले से लोड किए गए पुस्तकालयों में अंतर्निहित IO को लोड करने के लिए कोई IO की आवश्यकता नहीं होती है, और मेमोरी का उपयोग कम हो जाता है, क्योंकि पहले से लोड किए गए पुस्तकालयों से सभी Emacs उदाहरणों के बीच साझा किया जा सकता है।

यह विशेष मेमोरी क्षेत्र जिसमें प्री-लोडेड लाइब्रेरी शामिल हैं, "शुद्ध भंडारण" है। यह आसानी से है, इसलिए "शुद्ध", पूर्वोक्त स्मृति साझाकरण के लिए अनुमति देने के लिए। इसलिए, purecopyसामान्य एमएसीएस उदाहरणों में एक नो-ऑप है: यह वैसे भी शुद्ध भंडारण में नहीं लिख सकता है। नतीजतन, शुद्ध भंडारण को कचरा संग्रहण से भी छूट दी गई है।

हालाँकि, प्री-लोडेड लाइब्रेरी के लिए मेमोरी इमेज बनाने और डंप करने के दौरान, ये लाइब्रेरी purecopyशुद्ध स्टोरेज में आवंटन के लिए विशिष्ट ऑब्जेक्ट्स को "मार्क" करने के लिए उपयोग कर सकते हैं , आम तौर पर वैसे ऑब्जेक्ट्स का उपयोग किया जाता है जो वैसे भी Emacs के पूरे जीवनकाल के लिए आवश्यक होते हैं।

शुद्ध भंडारण में तार अनिवार्य रूप से वैश्विक स्थिर स्थिर तार हैं। चूंकि "make -k"एमएसीएस सत्रों को चलाने में अक्सर इसका उपयोग किया जा रहा है (यह संभवतः सबसे अधिक इस्तेमाल किया जाने वाला संकलन कमांड है, यहां तक ​​कि आज भी), यह अनावश्यक पुन: आवंटन और कचरा संग्रह से बचने के लिए, इस स्ट्रिंग को स्थिर और स्थिर रखने के लिए समझ में आता है।

शुद्ध भंडारण की यह अवधारणा भी कारण है कि संशोधित है .elकुछ बिल्ट-इन पुस्तकालयों (विशेष रूप से की फ़ाइलों को startup.el, subr.elEmacs वास्तव में कभी भार इन पुस्तकालयों के स्रोत फ़ाइलें:, और अन्य) कोई प्रभाव नहीं है। इसके बजाय, इसका बाइट कोड उसके बाइनरी में बनाया गया है, और उन्हें एक विशेष मेमोरी क्षेत्र से लोड करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.