2016-07-04 9 views
6

मेमोरी मॉडल रूबी में कैसे प्रबंधित किया जाता है। पूर्व के लिए: अगर हम निष्पादन के दौरान सी प्रोग्राम लेते हैं, तो निम्नलिखित मेमोरी मॉडल है। इस के समान रूबी में स्मृति को कैसे नियंत्रित किया जाता है।रूबी

C: 
         __________________ 
         |    | 
         |  stack  | 
         |    | 
         ------------------ 
         |    | 
         | <Un Allocated| 
         |  space> | 
         ------------------ 
         |    | 
         |    | 
         |  Heap  | 
         |    | 
         |    | 
         __________________ 
         |    | 
         |  data  | 
         __________________ 
         |  text  | 
         __________________ 

Ruby: 

       ? 
+1

रूबी कार्यक्रम के लिए ऐसी कोई चीज़ दिखाई नहीं दे रही है। यह सब दुभाषिया द्वारा सारणित है। –

+0

@undur_gongor कम से कम किसी संकल्पनात्मक आरेख? – mrg

+2

"मेमोरी" लेबल वाला एक बॉक्स? –

उत्तर

8

रूबी में "स्मृति" जैसी कोई चीज़ नहीं है।

Class#allocate किसी ऑब्जेक्ट को आवंटित करता है और उस ऑब्जेक्ट को लौटाता है। और यह बातचीत की पूरी सीमा है कि एक प्रोग्रामर ऑब्जेक्ट स्पेस उपप्रणाली के साथ हो सकता है।

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

एक रूबी कार्यान्वयन एक अलग ढेर और ढेर का उपयोग कर सकता है, यह एक ढेर-आवंटित ढेर का उपयोग कर सकता है, यह भी एक स्टैक का उपयोग नहीं कर सकता है (उदा। कार्डिनल)।

नोट: ObjectSpace मॉड्यूल ऑब्जेक्ट स्पेस की आत्मनिरीक्षण और प्रतिबिंब की सीमित मात्रा की अनुमति देता है। आम तौर पर, जब मैं कहता हूं कि रूबी में कुछ "असंभव" है, तब तक हमेशा एक अंतर्निहित चेतावनी होती है जब तक कि आप प्रतिबिंब का उपयोग न करें "। हालांकि, ObjectSpace स्मृति के संगठन के बारे में किसी भी जानकारी को रिसाव नहीं करता है।

यारवी में, objspace लाइब्रेरी और GC मॉड्यूल भी है, जो YARV के बारे में आंतरिक कार्यान्वयन विवरण प्रदान करता है। हालांकि, वे YARV के निजी आंतरिक कार्यान्वयन विवरण हैं, उन्हें अन्य कार्यान्वयन में मौजूद होने की भी गारंटी नहीं है, और वे किसी भी समय YARV के भीतर बिना किसी सूचना के बदल सकते हैं।

आप ध्यान दें कि मैंने कचरा संग्रह के बारे में कुछ भी नहीं लिखा है! खैर, असल में, रुबी केवल निर्दिष्ट करता है कि वस्तुओं का संदर्भ कब दिया जाता है और जब वे नहीं होते हैं। को गैर-संदर्भित वस्तुओं के साथ क्या करना है, यह नहीं कहता है। यह उन अपरिवर्तित वस्तुओं द्वारा उपयोग की जाने वाली जगह को पुनः प्राप्त करने के लिए कार्यान्वयन के लिए समझ में आता है, और उनमें से सभी कुछ डिग्री करते हैं (उदाहरण के लिए YARV के पुराने संस्करण अप्रतिबंधित Symbol एस पुनः प्राप्त नहीं करेंगे), लेकिन यह आवश्यक नहीं है और न ही निर्दिष्ट है। और सभी कार्यान्वयन बहुत अलग दृष्टिकोण का उपयोग करते हैं। फिर, जेआरबी, आयरन रूबी, ओपल, कार्डिनल, मैक्रूबी, टॉपज़, मैग्लेव इत्यादि अंतर्निहित प्लेटफॉर्म पर समस्या "आउटसोर्स" करते हैं, रूबिनीस इमिक्स कलेक्टर पर आधारित एक पीढ़ी, प्रतिलिपि, चलती, ट्रेसिंग कलेक्टर का उपयोग करता है, याएआरवी एक साधारण चिह्न का उपयोग करता है -और-स्वीप ट्रेसिंग कलेक्टर।