c++ - सी++ प्रोग्राम्स




सी++ में प्रतिबिंब क्यों नहीं है? (10)

यह कुछ हद तक विचित्र सवाल है। मेरे उद्देश्य भाषा डिजाइन निर्णय को समझना और सी ++ में प्रतिबिंब की संभावनाओं की पहचान करना है।

  1. क्यों सी ++ भाषा समिति भाषा में प्रतिबिंब लागू करने की दिशा में नहीं गई? क्या ऐसी भाषा में प्रतिबिंब बहुत कठिन है जो वर्चुअल मशीन (जावा की तरह) पर नहीं चलता है?

  2. अगर कोई सी ++ के प्रति प्रतिबिंब लागू करना था, तो चुनौतियों का क्या होगा?

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


एलिस्टेयर कॉकबर्न के मुताबिक, सबटाइपिंग को प्रतिबिंबित वातावरण में गारंटी नहीं दी जा सकती है

प्रतिबिंब गुप्त टाइपिंग सिस्टम के लिए अधिक प्रासंगिक है। सी ++ में, आप जानते हैं कि आपको किस प्रकार का मिला है और आप जानते हैं कि आप इसके साथ क्या कर सकते हैं।


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


प्रीप्रोसेसर निर्देश की तरह प्रतिबिंब वैकल्पिक हो सकता है। कुछ इस तरह

#pragma enable reflection

इस तरह से हम दोनों दुनिया के सर्वश्रेष्ठ हो सकते हैं, इस प्रागमा पुस्तकालयों को प्रतिबिंब के बिना बनाया जाएगा (बिना किसी ओवरहेड के चर्चा के), तो यह व्यक्तिगत डेवलपर होगा चाहे वे गति या उपयोग में आसानी चाहते हों।


भाषाओं के लिए प्रतिबिंब यह है कि संकलक सक्षम करने के लिए संकलक सक्षम करने के लिए आपके ऑब्जेक्ट कोड में कितना स्रोत कोड छोड़ने के लिए तैयार है, और उस परावर्तित जानकारी की व्याख्या करने के लिए कितनी विश्लेषण मशीनरी उपलब्ध है। जब तक कंपाइलर सभी स्रोत कोड को चारों ओर रखता है, प्रतिबिंब स्रोत कोड के बारे में उपलब्ध तथ्यों का विश्लेषण करने की अपनी क्षमता में सीमित होगा।

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

लेकिन आप भाषा के बाहर कदम उठा सकते हैं और पूर्ण प्रतिबिंब क्षमताओं को प्राप्त कर सकते हैं। सी में प्रतिबिंब पर एक और ढेर ओवरफ्लो चर्चा का जवाब इस पर चर्चा करता है


यदि सी ++ हो सकता है:

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

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

उदाहरण के लिए, Q_PROPERTY मैक्रो (क्यूटी फ्रेमवर्क का हिस्सा) द्वारा समर्थित मूलभूत जानकारी http://qt.nokia.com/doc/4.5/properties.html कक्षा विधियों को कवर करने के लिए विस्तारित और ई) - सी ++ के लिए असाधारण फायदेमंद होगा और सामान्य रूप से सॉफ्टवेयर समुदाय के लिए।

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


यह मूल रूप से है क्योंकि यह एक "वैकल्पिक अतिरिक्त" है। कई लोग जावा और सी # जैसी भाषाओं पर सी ++ चुनते हैं ताकि उनके पास कंपाइलर आउटपुट पर अधिक नियंत्रण हो, उदाहरण के लिए एक छोटा, और / या तेज़ प्रोग्राम।

यदि आप प्रतिबिंब जोड़ने का विकल्प चुनते हैं तो विभिन्न समाधान उपलब्ध हैं


सी ++ में प्रतिबिंब का उपयोग करने के लिए कई मामले हैं जिन्हें टेम्पलेट मेटा-प्रोग्रामिंग जैसे संकलन समय संरचनाओं का उपयोग करके पर्याप्त रूप से संबोधित नहीं किया जा सकता है।

N3340 सी ++ में प्रतिबिंब पेश करने के तरीके के रूप में समृद्ध पॉइंटर्स का प्रस्ताव करता है। अन्य चीजों के अलावा यह एक सुविधा के लिए भुगतान न करने के मुद्दे को तब तक संबोधित करता है जब तक कि आप इसका उपयोग न करें।


सी ++ में प्रतिबिंब के साथ कई समस्याएं हैं।

  • यह जोड़ने के लिए बहुत काम है, और सी ++ कमेटी काफी रूढ़िवादी है, और कट्टरपंथी नई सुविधाओं पर समय नहीं बिताती है जब तक कि वे सुनिश्चित न हों कि यह भुगतान करेगा। (.NET असेंबली के समान मॉड्यूल सिस्टम जोड़ने के लिए एक सुझाव दिया गया है, और जब मुझे लगता है कि आम सहमति है कि यह अच्छा होगा, इस समय उनकी सर्वोच्च प्राथमिकता नहीं है, और बाद में इसे वापस धक्का दिया गया है सी ++ 0x। इस सुविधा के लिए प्रेरणा #include प्रणाली से छुटकारा पाने के लिए है, लेकिन यह कम से कम कुछ मेटाडेटा भी सक्षम करेगी)।

  • आप जो भी उपयोग नहीं करते हैं उसके लिए आप भुगतान नहीं करते हैं। यह सी ++ के तहत मूलभूत बुनियादी सिद्धांतों में से एक है। अगर मुझे कभी इसकी आवश्यकता न हो तो मेरा कोड मेटाडाटा के आसपास क्यों लेना चाहिए? इसके अलावा, मेटाडेटा के अतिरिक्त संकलक को अनुकूलित करने से रोक सकता है। अगर मुझे उस मेटाडेटा की आवश्यकता न हो तो मुझे अपने कोड में उस लागत का भुगतान क्यों करना चाहिए?

  • जो हमें एक और बड़े बिंदु पर ले जाता है: सी ++ संकलित कोड के बारे में बहुत कम गारंटी देता है। कंपाइलर को इसे पसंद करने वाली बहुत कुछ करने की अनुमति है, जब तक परिणामस्वरूप कार्यक्षमता की अपेक्षा की जाती है। उदाहरण के लिए, वास्तव में वहां आपके वर्गों की आवश्यकता नहीं है। कंपाइलर उन्हें अनुकूलित कर सकता है, जो कुछ भी करता है, इनलाइन करता है, और यह अक्सर ऐसा करता है, क्योंकि यहां तक ​​कि सरल टेम्पलेट कोड भी कुछ टेम्पलेट इंस्टॉलेशन को बनाता है। सी ++ मानक पुस्तकालय इस आक्रामक अनुकूलन पर निर्भर करता है । फंक्शंस केवल तभी सक्षम होते हैं जब ऑब्जेक्ट को तत्काल और नष्ट करने के ऊपरी हिस्से को अनुकूलित किया जा सके। operator[] एक वेक्टर पर केवल प्रदर्शन में कच्चे सरणी अनुक्रमण के लिए तुलनीय है क्योंकि पूरे ऑपरेटर को रेखांकित किया जा सकता है और इस प्रकार संकलित कोड से पूरी तरह हटा दिया जा सकता है। सी # और जावा संकलक के आउटपुट के बारे में बहुत सारी गारंटी देता है। यदि मैं सी # में एक कक्षा परिभाषित करता हूं, तो वह वर्ग परिणामी असेंबली में मौजूद होगी । यहां तक ​​कि अगर मैं इसका कभी भी उपयोग नहीं करता हूं। भले ही उसके सदस्य कार्यों के सभी कॉल को रेखांकित किया जा सके। कक्षा वहां रहनी है, ताकि प्रतिबिंब इसे पा सके। इसका हिस्सा बाइटकोड से संकलित सी # द्वारा कम किया गया है, जिसका अर्थ यह है कि जेआईटी कंपाइलर क्लास परिभाषाओं और इनलाइन फ़ंक्शंस को हटा सकता है , भले ही प्रारंभिक सी # कंपाइलर न हो। सी ++ में, आपके पास केवल एक कंपाइलर है, और इसे कुशल कोड आउटपुट करना होगा। यदि आपको सी ++ निष्पादन योग्य के मेटाडेटा का निरीक्षण करने की अनुमति दी गई थी, तो आप इसे परिभाषित प्रत्येक वर्ग को देखने की उम्मीद करेंगे, जिसका अर्थ यह है कि संकलक को सभी परिभाषित कक्षाओं को संरक्षित करना होगा, भले ही वे आवश्यक न हों।

  • और फिर टेम्पलेट्स हैं। सी ++ में टेम्पलेट्स अन्य भाषाओं में जेनेरिक की तरह कुछ नहीं हैं। प्रत्येक टेम्पलेट त्वरण एक नया प्रकार बनाता है। std::vector<int> std::vector<float> से एक पूरी तरह से अलग वर्ग है। यह पूरे कार्यक्रम में कई अलग-अलग प्रकारों को जोड़ता है। हमारे प्रतिबिंब को क्या देखना चाहिए? टेम्पलेट std::vector ? लेकिन यह कैसे हो सकता है, क्योंकि यह एक स्रोत-कोड निर्माण है, जिसका रनटाइम पर कोई मतलब नहीं है? इसे अलग-अलग कक्षाएं std::vector<int> और std::vector<float> देखना होगा। और std::vector<int>::iterator और std::vector<float>::iterator , const_iterator लिए const_iterator और इसी तरह। और एक बार जब आप टेम्पलेट मेटाप्रोग्रामिंग में कदम उठाते हैं, तो आप जल्दी से सैकड़ों टेम्पलेट्स को तुरंत चालू करते हैं, जिनमें से सभी को संकलक द्वारा फिर से रेखांकित और हटा दिया जाता है। संकलन-समय मेटाप्रोग्राम के हिस्से को छोड़कर उनका कोई अर्थ नहीं है। क्या इन सभी सैकड़ों वर्ग प्रतिबिंब के लिए दृश्यमान होना चाहिए? उन्हें करना होगा, क्योंकि अन्यथा हमारा प्रतिबिंब बेकार होगा, अगर यह गारंटी भी नहीं देता कि मैंने परिभाषित कक्षाएं वास्तव में वहां होंगी । और एक पक्ष समस्या यह है कि टेम्पलेट वर्ग तब तक अस्तित्व में नहीं है जब तक कि यह तत्काल नहीं हो जाता है। एक प्रोग्राम की कल्पना करें जो std::vector<int> का उपयोग करता है। क्या हमारी प्रतिबिंब प्रणाली std::vector<int>::iterator को देखने में सक्षम होनी चाहिए? एक ओर, आप निश्चित रूप से ऐसा उम्मीद करेंगे। यह एक महत्वपूर्ण वर्ग है, और इसे std::vector<int> संदर्भ में परिभाषित किया गया है, जो मेटाडेटा में मौजूद है। दूसरी तरफ, यदि कार्यक्रम वास्तव में इस इटरेटर वर्ग टेम्पलेट का उपयोग नहीं करता है , तो इसका प्रकार कभी भी तत्काल नहीं किया जाएगा, और इसलिए संकलक पहले स्थान पर कक्षा उत्पन्न नहीं करेगा। और रनटाइम पर इसे बनाने में बहुत देर हो चुकी है, क्योंकि इसे स्रोत कोड तक पहुंच की आवश्यकता है।

  • और अंत में, प्रतिबिंब सी ++ में उतना ही महत्वपूर्ण नहीं है जितना सी # में है। कारण फिर से है, टेम्पलेट मेटाप्रोग्रामिंग। यह सबकुछ हल नहीं कर सकता है, लेकिन कई मामलों के लिए जहां आप अन्यथा प्रतिबिंब का सहारा लेते हैं, एक मेटाप्रोग्राम लिखना संभव है जो संकलन-समय पर एक ही चीज़ करता है। boost::type_traits एक साधारण उदाहरण है। आप टाइप T बारे में जानना चाहते हैं? इसके type_traits जांच करें। सी # में, आपको प्रतिबिंब का उपयोग करके अपने प्रकार के बाद मछली पकड़ना होगा। प्रतिबिंब अभी भी कुछ चीजों के लिए उपयोगी होगा (मुख्य उपयोग जो मैं देख सकता हूं, जो मेटाप्रोग्रामिंग आसानी से प्रतिस्थापित नहीं कर सकता है, ऑटोगनेरेटेड सीरियलाइजेशन कोड के लिए है), लेकिन इसमें सी ++ के लिए कुछ महत्वपूर्ण लागतें होंगी, और यह अक्सर आवश्यक नहीं है अन्य भाषाओं में है।

संपादित करें: टिप्पणियों के जवाब में:

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

इवान टेरन: बेशक इन मुद्दों को हल किया जा सकता है। लेकिन यह मेरे बिंदु # 1 पर वापस आ जाता है। यह बहुत काम करेगा, और सी ++ कमेटी में बहुत सारी चीजें हैं जो उन्हें लगता है कि यह अधिक महत्वपूर्ण है। सी ++ में कुछ सीमित प्रतिबिंब (और यह सीमित होगा) प्राप्त करने का लाभ वास्तव में अन्य सुविधाओं की कीमत पर ध्यान केंद्रित करने के लिए पर्याप्त बड़ा है? क्या मूल भाषा को जोड़ने में वास्तव में एक बड़ा लाभ है जो पहले से ही (ज्यादातर) लाइब्रेरी और क्यूटी के प्रीप्रोसेसरों के माध्यम से किया जा सकता है? शायद, लेकिन ऐसी पुस्तकालय मौजूद नहीं होने की आवश्यकता बहुत कम जरूरी है। हालांकि, आपके विशिष्ट सुझावों के लिए, मुझे विश्वास है कि टेम्पलेट्स पर इसे अस्वीकार करने से यह पूरी तरह से बेकार हो जाएगा। उदाहरण के लिए, आप मानक लाइब्रेरी पर प्रतिबिंब का उपयोग करने में असमर्थ होंगे। किस प्रकार का प्रतिबिंब आपको std::vector देखने नहीं देगा? टेम्पलेट्स सी ++ का एक बड़ा हिस्सा हैं। एक सुविधा जो टेम्पलेट्स पर काम नहीं करती है मूल रूप से बेकार है।

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

लेकिन जैसा कि मैंने कहा, संकलन मॉडल में परिवर्तन के लिए एक प्रस्ताव है, स्वयं निहित मॉड्यूल जोड़ना, चुनिंदा प्रकारों के लिए मेटाडेटा संग्रहीत करना, अन्य मॉड्यूल को संदर्भित करने के लिए इन्हें संदर्भित करना #include । यह एक अच्छी शुरुआत है, और ईमानदार होने के लिए, मुझे हैरान है कि मानक समिति ने प्रस्ताव को बहुत बड़ा बदलाव करने के लिए प्रस्ताव नहीं दिया था। तो शायद 5-10 साल में? :)


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

बिल्ड प्रक्रिया के दौरान सॉफ़्टवेयर डेवलपर को उपलब्ध एक संकलित समय स्विच का उपयोग इस 'आप जो भी आप उपयोग करते हैं उसके लिए भुगतान करते हैं' को खत्म करने के लिए किया जा सकता है।

मैं एक फर्मवेयर डेवलपर को सीरियल पोर्ट से डेटा पढ़ने के प्रतिबिंब की आवश्यकता नहीं है - तो ठीक स्विच का उपयोग न करें। लेकिन एक डेटाबेस डेवलपर जो सी ++ का उपयोग करना जारी रखना चाहता है, मैं लगातार एक भयानक, कोड बनाए रखने में मुश्किल हूं जो डाटा सदस्यों और डेटाबेस संरचनाओं के बीच डेटा को मैप करता है।

न तो बूस्ट सीरियलाइजेशन और न ही अन्य तंत्र वास्तव में प्रतिबिंब को हल कर रहे हैं - इसे कंपाइलर द्वारा किया जाना चाहिए - और एक बार ऐसा करने के बाद सी ++ स्कूलों में फिर से खरीदे जाएंगे और डेटा प्रोसेसिंग से निपटने वाले सॉफ़्टवेयर में उपयोग किए जाएंगे

मेरे लिए यह समस्या # 1 (और नैटिव थ्रेडिंग प्राइमेटिव्स समस्या # 2 है)।


प्रतिबिंब पहले और सी ++ में लागू किया जा सकता है।

यह देशी सी ++ सुविधा नहीं है क्योंकि इसकी भारी लागत (स्मृति और गति) है जिसे भाषा द्वारा डिफ़ॉल्ट रूप से सेट नहीं किया जाना चाहिए - भाषा "डिफ़ॉल्ट रूप से अधिकतम प्रदर्शन" उन्मुख है।

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







reflection