तो, रूबी रचनाकारों को symbolsभाषा में अवधारणा का उपयोग क्यों करना पड़ा ?
खैर, उन्होंने सख्ती से "करने के लिए" नहीं किया, उन्होंने चुना। यह भी ध्यान दें कि कड़ाई से बोलना Symbolभाषा का हिस्सा नहीं है, वे मुख्य पुस्तकालय का हिस्सा हैं। वे करते भाषा स्तरीय शाब्दिक वाक्य रचना है, लेकिन वे बस के रूप में अच्छी तरह से काम लेंगे, जब आप फोन करके उन्हें निर्माण करने के लिए किया था Symbol::new।
मैं एक गैर-रूबी प्रोग्रामर के दृष्टिकोण से इसे समझने की कोशिश कर रहा हूं। मैंने बहुत सी अन्य भाषाएं सीखी हैं और उनमें से किसी में भी यह निर्दिष्ट करने की आवश्यकता नहीं है कि मैं रूबी कॉल के साथ काम कर रहा था या नहीं symbols।
आपने यह नहीं बताया कि "अन्य भाषाओं के बहुत सारे" क्या हैं, लेकिन यहाँ भाषाओं का एक छोटा सा अंश है जिसमें Symbolरूबीज़ की तरह डेटाटाइप है
- ECMAScript , जावास्क्रिप्ट भी
- स्काला
- स्कीम , कॉमन लिस्प , क्लूजुर (भी, क्लोजर के कीवर्ड हैं ), मूल रूप से लिस्प परिवार की हर भाषा, इसके उत्तराधिकारी और चचेरे भाई हैं
- स्मॉलटॉक परिवार में स्मॉलटॉक , न्यूजक , और कई अन्य भाषाएं (संभवत: रूबी उनसे मिली), जिसमें ऑब्जेक्टिव-सी (यद्यपि सीमित रूप में)
- एरलंग ( परमाणु कहा जाता है ) , एलिक्सिर और एलएफई भी
- जूलिया
- प्रोलोग (जिन्हें परमाणु कहा जाता है ), जो कि संभव है कि एर्लैंग उन्हें कहां से मिला था
अन्य भाषाएं भी हैं जो Symbolअलग रूप में एस की विशेषताएं प्रदान करती हैं । उदाहरण के लिए, जावा में, रूबी की सुविधाओं Stringको दो (वास्तव में तीन) प्रकारों में विभाजित किया गया है: Stringऔर StringBuilder/ StringBuffer। दूसरी ओर, रूबी के Symbolप्रकार की विशेषताओं को जावा Stringप्रकार में बदल दिया जाता है : जावा Stringएस को नजरअंदाज किया जा सकता है , शाब्दिक तार और Stringएस जो संकलन-समय मूल्यांकन किए गए निरंतर अभिव्यक्तियों का परिणाम होते हैं, स्वचालित रूप से नजरबंद कर दिए जाते हैं, गतिशील रूप से उत्पन्न Stringएस को कॉल करके नजरबंद किया जा सकता है। String.internविधि। Stringजावा में इंटर्न बिल्कुल Symbolरूबी में एक जैसा है , लेकिन इसे एक अलग प्रकार के रूप में लागू नहीं किया गया है, यह सिर्फ एक अलग स्थिति है कि एक जावाStringमें हो सकता है (नोट: रूबी के पुराने संस्करणों में, String#to_symकहा जाता था String#internऔर यह विधि आज भी एक विरासत उर्फ के रूप में मौजूद है।)
मुख्य प्रश्न यह हो सकता है: क्या symbolsरूबी की अवधारणा स्वयं और अन्य भाषाओं के प्रदर्शन के इरादे के रूप में मौजूद है,
Symbols पहले और विशिष्ट शब्दार्थ के साथ डेटाटाइप हैं । ये शब्दार्थ कुछ प्रदर्शनकारी कार्यों (जैसे तेज़ ओ (1) समानता परीक्षण) को लागू करना संभव बनाते हैं, लेकिन यह मुख्य उद्देश्य नहीं है।
या सिर्फ कुछ ऐसा है जो भाषा के लिखे जाने के कारण अस्तित्व में है?
Symbols रूबी भाषा में बिलकुल भी आवश्यक नहीं हैं, रूबी उनके बिना ही ठीक काम करेगी। वे विशुद्ध रूप से एक पुस्तकालय सुविधा है। भाषा में ठीक एक स्थान है जो Symbols से बंधा है : एक defविधि परिभाषा अभिव्यक्ति Symbolउस पद्धति के नाम को दर्शाने के लिए मूल्यांकन करती है जिसे परिभाषित किया जा रहा है। हालाँकि, यह एक हालिया बदलाव है, इससे पहले, वापसी मूल्य केवल अनिर्दिष्ट था। एमआरआई ने केवल मूल्यांकन किया nil, रुबिनियस ने किसी Rubinius::CompiledMethodवस्तु का मूल्यांकन किया , और इसी तरह। यह भी मूल्यांकन करना संभव होगा UnboundMethod… या सिर्फ ए String।
क्या रूबी में एक कार्यक्रम हल्का और / या उससे अधिक तेज होगा, जो कहता है, पायथन या नोड समकक्ष? यदि हां, तो क्या इसकी वजह होगी symbols?
मुझे यकीन नहीं है कि आप यहां क्या पूछ रहे हैं। प्रदर्शन ज्यादातर कार्यान्वयन गुणवत्ता का विषय है, भाषा का नहीं। इसके अलावा, नोड भी एक भाषा नहीं है, यह ECMAScript के लिए एक व्यवस्थित I / O ढांचा है। IronPython और MRI पर एक समान स्क्रिप्ट चलाने से, IronPython के तेज होने की संभावना है। CPython और JRuby + Truffle पर एक समान स्क्रिप्ट चलाने से JRuby + Truffle के तेज़ी से चलने की संभावना है। यह Symbolएस के साथ कुछ भी नहीं है लेकिन कार्यान्वयन की गुणवत्ता के साथ है: JRuby + Truffle में आक्रामक रूप से अनुकूलन करने वाला कंपाइलर है, साथ ही उच्च प्रदर्शन वाले JVM का संपूर्ण अनुकूलन तंत्र, CPython एक सरल दुभाषिया है।
चूंकि रूबी का एक इरादा इंसानों के लिए पढ़ना और लिखना आसान है, क्या इसके निर्माता दुभाषिया में उन सुधारों को लागू करके कोडिंग की प्रक्रिया को आसान नहीं बना सकते थे (जैसा कि अन्य भाषाओं में हो सकता है)?
सं Symbol। कंपाइलर ऑप्टिमाइज़ेशन नहीं हैं। वे विशिष्ट शब्दार्थ के साथ एक अलग डेटाटाइप हैं। वे YARV की तरह नहीं हैं flonums है, जिसके लिए एक निजी आंतरिक अनुकूलन कर रहे हैं Floatरों। स्थिति समान नहीं है Integer, Bignumऔर Fixnum, जो एक अदृश्य निजी आंतरिक अनुकूलन विवरण होना चाहिए , लेकिन दुर्भाग्य से नहीं है। (यह अंत में रूबी 2.4 में तय होने जा रहा है, जो हटाता है Fixnumऔर Bignumबस छोड़ देता है Integer।)
इसे करने का तरीका जावा करता है, सामान्य Stringएस के एक विशेष राज्य के रूप में इसका मतलब है कि आपको हमेशा इस बात से सावधान रहने की आवश्यकता है कि आपका Stringएस उस विशेष स्थिति में है या नहीं और किन परिस्थितियों में वे स्वचालित रूप से उस विशेष स्थिति में हैं और कब नहीं। यह एक अलग डेटाटाइप होने की तुलना में बहुत अधिक बोझ है।
क्या प्रतीकों की एक भाषा-अज्ञेय परिभाषा होगी और उन्हें अन्य भाषाओं में रखने का एक कारण होगा?
Symbolनाम और लेबल की अवधारणा को दर्शाता है कि एक डेटा प्रारूप है । Symbols मूल्य वस्तुएं हैं , अपरिवर्तनीय, आमतौर पर तत्काल (यदि भाषा ऐसी चीज़ को अलग करती है), स्टेटलेस, और कोई पहचान नहीं है। दो Symbolएस विच समान हैं, समान होने की गारंटी भी है, दूसरे शब्दों में, दो Symbolएस जो समान हैं वास्तव में एक ही हैं Symbol। इसका मतलब यह है कि मूल्य समानता और संदर्भ समानता एक ही चीज है, और इस तरह समानता कुशल और ओ (1) है।
किसी भाषा में उनके होने के कारण वास्तव में एक ही हैं, भाषा से स्वतंत्र। कुछ भाषाएं दूसरों की तुलना में उन पर अधिक भरोसा करती हैं।
उदाहरण के लिए, लिस्प परिवार में, "चर" की कोई अवधारणा नहीं है। इसके बजाय, आप Symbolमूल्यों से जुड़े हैं।
चिंतनशील या आत्मविश्लेषी क्षमताओं के साथ भाषाओं में, Symbolरों अक्सर रूबी में, प्रतिबिंब एपीआई में परिलक्षित संस्थाओं के नाम निरूपित करने के लिए जैसे, उपयोग किया जाता है Object#methods, Object#singleton_methods, Object#public_methods, Object#protected_methods, और Object#public_methodsएक वापसी Arrayकी Symbolहै (हालांकि वे बस के रूप में अच्छी तरह से एक वापसी कर सकता है Arrayकी Methodरों)। एक तर्क के रूप में भेजने के लिए संदेश के नाम को दर्शाते हुए Object#public_sendलेता है Symbol(हालाँकि यह एक Stringरूप में अच्छी तरह से स्वीकार करता है , Symbolअधिक अर्थपूर्ण रूप से सही है)।
ECMAScript में, भविष्य में ECMAScript क्षमता को सुरक्षित बनाने का Symbolएक मूलभूत निर्माण खंड है। वे प्रतिबिंब में भी बड़ी भूमिका निभाते हैं।