Emacs में केवल 29 बिट्स में क्यों fixnums हैं?




lisp elisp (5)

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

और वे इसे क्यों नहीं बदलते?

संपादित करें: कारण पूछना है क्योंकि मैं emacs के लिए नया हूँ और मैं "प्रोग्रामर कैलकुलेटर" के रूप में ईएमएसीएस का उपयोग करना चाहूंगा। इसलिए, मैं 32-बिट और 64-बिट इंटिजर्स को हेरफेर कर सकता हूं और उन्हें मूल मशीन पर ऐसा व्यवहार करना चाहिए।


एमएक्स-लिस्प एक गतिशील रूप से टाइप की गई भाषा है इसका मतलब यह है कि आपको रनटाइम पर टाइप टैग की आवश्यकता है यदि आप संख्याओं के साथ काम करना चाहते हैं, तो आपको सामान्यतः उन्हें किसी तरह के टैग किए गए कंटेनर में पैक करना होगा जिसे आप इंगित कर सकते हैं (यानी "बॉक्स" उन्हें), क्योंकि रनटाइम पर मशीन पूर्णांक से एक सूचक को अलग करने का कोई तरीका नहीं है बिना किसी प्रकार की टैगिंग योजना

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

अब, जाहिर है, अगर आप टाइप टैग जोड़ते हैं, तो आपके पास संख्या के लिए पूर्ण 32 बिट्स नहीं हैं, इसलिए आप 26 बिट्स के साथ एमआईटी स्कीम या 29 बीट्स के साथ एमएक्स या किसी अन्य बिट्स की संख्या में छोड़ देते हैं आपने टैगिंग के लिए उपयोग नहीं किया

विभिन्न गतिशील भाषाओं के कुछ कार्यान्वयन फिक्समों के लिए कई टैग आरक्षित करते हैं ताकि वे आपको 30-बिट या 31-बिट फिक्सनम दे सकें। एसबीसीएल एक सामान्य लिस्प का कार्यान्वयन है जो यह करता है । मुझे नहीं लगता कि इस वजह से यह कारण एमएक्स के लिए इसके लायक है, हालांकि। एक टेक्स्ट एडिटर में 29-बिट तयनम अंकगणितीय के विरोध में कितनी बार आपको 30-बिट तयअनम अंकगणित की आवश्यकता है, जो कि इसके लिस्प कोड को मशीन कोड में भी संकलित नहीं करता है (या क्या यह मुझे याद नहीं है)? क्या आप Emacs-Lisp में एक वितरित.net क्लाइंट लिख रहे हैं? सामान्य लिस्प को बेहतर स्विच, फिर! ;)


यह केवल 32 बिट आर्किटेक्चर के लिए सच है, और बिल्ड विकल्पों के आधार पर बदला जा सकता है। अन्य बिट्स मूल डेटा संरचनाओं को टैग करने के लिए उपयोग किया जाता है।

आप एक 64-बिट बिल्ड का उपयोग कर सकते हैं जिसमें बड़े पूर्णांक हैं, और मनमाने ढंग से बड़े पूर्णांक अंकगणित के लिए संकुल हैं।

या, आप बस गुस्सा और महत्वपूर्ण ध्वनि की कोशिश कर रहे एक बयानबाजी सवाल पूछ रहे हैं ...


शेष 3 बिट्स का प्रयोग लिस्प में अनुवादक द्वारा ध्वज के रूप में किया जाता है। (आप 64-बिट मशीन के लिए एएमएक्स संकलित करके बड़ा पूर्णांक प्राप्त कर सकते हैं।)


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





elisp