linked list - क्या लिस्प नोट्स हमेशा हुड के तहत लिंक की गई सूची के रूप में लागू होती हैं?




linked-list lisp (4)

क्या लिस्प नोट्स हमेशा हुड के तहत लिंक की गई सूची के रूप में लागू होती हैं?

क्या यह एक समस्या है जहां तक ​​प्रोसेसर कैशिंग चला जाता है? यदि हां, तो क्या ऐसे समाधान मौजूद हैं जो कैशिंग में मदद करने वाले अधिक निकट संरचनाओं का उपयोग करते हैं?


जैसे कि मैं इसे समझता हूं, क्लोज़र्स के अनुक्रम को वीएलआईएस के रूप में लागू किया जाता है । हां, लिस्ट्स आमतौर पर लिस्प्स में सूचियों से जुड़ी होती हैं (हालांकि मुझे यकीन है कि प्रयोगात्मक बिल्डिंग है या दो जो कुछ और का उपयोग करता है)


रेनर ने पहले ही उल्लेख किया है कि विभिन्न मेमोरी प्रबंधन तकनीकों को स्थानीय इलाके में मदद मिलती है। मैं एसबीसीएल का उपयोग करते हुए दो प्रयोगों को पेश करना चाहता हूं, जो कि उनकी बात को स्पष्ट करता है।

सबसे पहले, एक सूची में प्रत्येक विपक्ष के पते मुद्रित करने के लिए एक त्वरित उपयोगिता

(defun print-addresses (list)
  (mapl (lambda (cons)
          (format t "address: 0x~X~%"
                  (sb-kernel:get-lisp-obj-address cons)))
        list))

पहले प्रयोग में, हम देख सकते हैं कि आवंटन सटे है, इसलिए हम दस तत्वों के साथ एक सूची बना सकते हैं और उनके कच्चे पतों पर पोकिंग हमें बताते हैं कि वे एक साथ करीब हैं:

> (print-addresses (loop repeat 10 collect 'dummy))
address: 0x1003F57167
address: 0x1003F57177
address: 0x1003F57187
address: 0x1003F57197
address: 0x1003F571A7
address: 0x1003F571B7
address: 0x1003F571C7
address: 0x1003F571D7
address: 0x1003F571E7
address: 0x1003F571F7

दूसरा प्रयोग क्या होगा अगर हम बीच में कुछ असंबंधित आवंटन करते हैं? चलो एक ऐसी सूची को एक चर में आवंटित करें ताकि हम इसे बाद में दबा सकें।

(defparameter *another-list*
  (loop repeat 10
        ;; using eval to trick the compiler into
        ;; compiling this piece of dummy code
        do (eval '(make-array (random 1000)))
        collect 'dummy))

हम देख सकते हैं कि इस बार पते अधिक यादृच्छिक हैं:

> (print-addresses *another-list*)
address: 0x10046E9AF7
address: 0x10046EB367
address: 0x10046ECB97
address: 0x10046EE827
address: 0x10046EF247
address: 0x10046F1F17
address: 0x10046F2007
address: 0x10046F3FD7
address: 0x10046F5E67
address: 0x10046F6887

अब, यदि हम जीसी (sb-ext:gc) आह्वान करते हैं, तो हम देख सकते हैं कि उसने कंसों को एक साथ पैक किया है:

> (sb-ext:gc)
> (print-addresses *another-list*)
address: 0x1004738007
address: 0x1004738017
address: 0x1004738027
address: 0x1004738037
address: 0x1004738047
address: 0x1004738057
address: 0x1004738067
address: 0x1004738077
address: 0x1004738087
address: 0x1004738097

इन उदाहरणों में हमने सूची के तत्वों के इलाके का आकलन नहीं किया, मुझे लगता है कि यह दूसरे दिन के लिए एक प्रयोग है। :-)


दार्शनिक "सही" उत्तर "लिस्प में कोई सूची नहीं है, केवल कंस" होगा आम तौर पर लिखित सूची तैयार करने के लिए आम तौर पर माना जाता है कि सीएल मानक और पुस्तकालयों में बहुत सारे कार्य उन प्रकार की सूचियों पर काम करते हैं। लेकिन कंस भी अन्य प्रकार की संरचनाओं के निर्माण के लिए इस्तेमाल किया जा सकता है, जैसे नक्शे या ग्राफ़ तो (पारंपरिक) लिप्स में मौलिक डेटा संरचना का विचार है, न कि सूची में। सूची विपक्ष का केवल एक सुविधाजनक आवेदन है तो, "लिस्प नोट्स" द्वारा आप वास्तव में "लिस्प कंसों के साथ क्रियान्वित सूचियों" का अर्थ रखते हैं और उनको, अच्छी तरह से, conses से कुछ अलग से लागू नहीं किया जा सकता;)

फिर निश्चित रूप से सीडीआर-कोडिंग जैसी तकनीकें हैं, जो अन्य उत्तरों में उल्लिखित हैं, जिनका उपयोग कुछ कंस-आधारित संरचनाओं को कुशलतापूर्वक करने के लिए किया जा सकता है। ऐसे पुस्तकालय भी हैं जो सूची डेटा संरचना प्रदान करते हैं जो लिंक किए गए conses (जैसे सामान्य लिस्प के लिए FSet) पर आधारित नहीं हैं।

यह आम लिस्प और योजना जैसे "पारंपरिक" लिप्स के लिए सही है। क्लोज़र में मौलिक डेटा प्रकार के रूप में सूचियां होती हैं और एएफएआईके के पास बिल्कुल भी शामिल नहीं है।


लिंक्ड जोड़े सामान्य क्रियान्वयन हैं, लेकिन अतीत में अन्य तरीकों का भी पता चला है।

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

यह अगले विपक्ष स्वयं उसी तरह संकुचित हो सकता है, और इसलिए अनुकूल परिस्थितियों में आप उत्कृष्ट संगीता के साथ एक सरणी-समान संरचना के साथ समाप्त होते हैं (यह काफी सरणी नहीं है क्योंकि टैगिंग जानकारी के लिए स्थान होना आवश्यक है, और आप इसका सूचक नहीं कर सकते।)

मुश्किल भागों में से एक car के दोनों उत्परिवर्तन और संकुचित कंसों के cdr का कुशलतापूर्वक समर्थन करता है। (स्टीली के पेपर देखें, "सीडीआर-कोडित सूचियों का विनाशकारी पुनरीक्षण"।) यदि कंस अपरिवर्तनीय है तो टैगिंग योजना सरल हो सकती है। इस अकसर किये गए सवाल व्यापार के अवसर पर कुछ दिलचस्प चर्चा है।

सीडीआर-कोडिंग के एक नकारात्मक पक्ष यह है कि क्योंकि विपक्ष अलग-अलग 'आकार' हो सकता है, सूची ऑपरेशन के लिए टैग पर प्रेषण की आवश्यकता होती है। यह कोड आकार और शाखा गलत तरीके से लागत का परिचय देता है ये लागत सुविधा को काफी कम आकर्षक बनाती हैं, इस बात पर कि मैं किसी आधुनिक लिस्प कार्यान्वयन के बारे में नहीं जानता जो सीडीआर-कोडिंग का उपयोग करता है।

जहां निकटता एक चिंता का विषय है, एक लिस्प प्रोग्रामर आमतौर पर केवल एक सरणी का उपयोग करेगा।