क्या संदर्भ गिनती जीसी बनाम जीसी भाषा की संपत्ति या कार्यान्वयन संपत्ति का पता लगा रही है?


9

हम कभी-कभी सुनते हैं "स्विफ्ट क्लासिक (ट्रेसिंग) जीसी नहीं करता है, यह एआरसी का उपयोग करता है।"

लेकिन मुझे यकीन नहीं है कि स्विफ्ट शब्दार्थ में कुछ भी है जिसे संदर्भ गणना की आवश्यकता है। ऐसा लगता है कि जीसी का उपयोग करने के लिए कोई व्यक्ति अपने स्विफ्ट कंपाइलर और रनटाइम का निर्माण कर सकता है।

तो स्विफ्ट के बारे में वास्तव में "संदर्भ-गणना" क्या है? Apple का कार्यान्वयन या भाषा ही? क्या भाषा या पुस्तकालय के कुछ हिस्से ऐसे हैं जो ARC को इतनी मजबूती से समर्थन करते हैं कि हम उस लेबल का उपयोग भाषा के लिए ही कर सकते हैं?

जवाबों:


9

स्विफ्ट गारंटी देता है कि एक बार किसी वस्तु के अंतिम संदर्भ को गिरा देने के बाद वस्तु का विखंडन किया जाता है, और deinitकोड तुरंत चलाया जाता है।

जीसी के माध्यम से इस तरह की गारंटी प्राप्त करना संभव नहीं है - कम से कम, प्रदर्शन का त्याग किए बिना नहीं। मानक GC तंत्र केवल यह सुनिश्चित करता है कि deinitकोड अंततः चल रहा है, उदाहरण के लिए अगले GC चक्र पर। सटीक शब्दार्थ के लिए, आपको कहीं संदर्भ संख्या की आवश्यकता है।


3
आह, इसलिए deinitएक कीवर्ड और उससे जुड़े शब्दार्थ के रूप में उपस्थिति वास्तव में ऐसी चीजें हैं जो संदर्भ में, कार्यान्वयन के बजाय, भाषा को वर्ग गणना में रखती हैं।
रे तोल

2
जब भी कुछ डील किया जाता है तो अनुपयोगी वस्तुओं की जांच करने के लिए कुछ भी जीसीड रनटाइम को रोकता नहीं है। यह सिर्फ भयावह अक्षम है।
राफेल

@ राफेल उस बिंदु पर और अधिक सटीक होने के लिए संपादित।
चाई

3

ची ने स्विफ्ट के बारे में शरीर में विशिष्ट प्रश्न का उत्तर दिया है, यह उत्तर शीर्षक में अधिक सामान्य प्रश्न का उत्तर देता है।

क्या संदर्भ गिनती जीसी बनाम जीसी भाषा की संपत्ति या कार्यान्वयन संपत्ति का पता लगा रही है?

संदर्भ गिनती जीसी और ट्रेसिंग जीसी विभिन्न प्रोग्रामर के साथ प्रोग्रामर प्रदान करते हैं।

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

यह एक व्यक्तिगत भाषा के विनिर्देश पर निर्भर करता है कि क्या हो अगर कोई विशेषताएँ गुणात्मक हों और इसलिए एक अनुपालन कार्यान्वयन के लिए कौन से विकल्प उपलब्ध हैं।


4
यह भी संभव है कि रिफंड और जीसी को मिलाएं। फिर भाषा यह दस्तावेज कर सकती है कि वस्तुओं का उनके विनाशकर्ता के रूप में जल्द से जल्द निष्पादन हो जाता है (एक रूप या किसी अन्य में प्रतिक्षेप को लागू करना) और वह संदर्भ चक्र अंततः नष्ट हो जाएगा (जीसी के कुछ रूप को लागू करते हुए)। वैकल्पिक रूप से, कार्यान्वयन ऐसा कर सकता है जबकि भाषा यह गारंटी नहीं देती है कि जब विध्वंसक चलाए जाते हैं (IIRC जो कि पायथन और उसके संदर्भ कार्यान्वयन का मामला है), तो उस स्थिति में यह एक कार्यान्वयन संपत्ति होगी।
गिल्स एसओ- बुराई को रोकना '

1

आप स्विफ्ट के नाम से जानी जाने वाली भाषा को ले सकते हैं और इसका नाम बदलकर "स्विफ्ट विद एआरसी" रख सकते हैं। फिर आप एक ही वाक्यविन्यास के साथ "स्विफ्ट विद जीसी" नामक एक नई भाषा बना सकते हैं, लेकिन जब वस्तुएं डील की जाती हैं, तो कम गारंटी के साथ।

एआरसी के साथ स्विफ्ट में, संदर्भ संख्या 0 होने के बाद, ऑब्जेक्ट जाएगा। कचरा संग्रह के साथ, जब तक आपके पास एक कमजोर संदर्भ है, तब तक आप उस कमजोर संदर्भ को वस्तु को "पुनर्प्राप्त" करने के लिए एक मजबूत संदर्भ दे सकते हैं। (स्विफ्ट में, एक बार संदर्भ संख्या 0 है, कमजोर संदर्भ शून्य हैं); यह एक बड़ा अंतर है।

और निश्चित रूप से एआरसी के साथ स्विफ्ट गारंटी देता है कि अंतिम संदर्भ गणना को मारने से वस्तु को तुरंत हटा दिया जाएगा। उदाहरण के लिए, आपके पास एक FileWriter वर्ग हो सकता है, जहाँ आपको एक ही समय में एक ही फ़ाइल के दो उदाहरण लिखने की अनुमति नहीं है। एआरसी के साथ स्विफ्ट में आप कह सकते हैं पुराना = शून्य; newWriter = FileWriter (...) और आपको पता होगा कि नया FileWriter पुराने के हटने के बाद ही बनाया गया है (जब तक कि आप किसी अन्य सन्दर्भ को नहीं रखते); जीसी के साथ स्विफ्ट में यह काम नहीं करेगा।

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

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