@ सैकुंडिम का उत्तर ज्यादातर सही है, लेकिन भाषा डिजाइन और व्यावहारिक आवश्यकताओं के बारे में व्यापार पर कुछ अन्य महत्वपूर्ण अंतर्दृष्टि भी हैं।
वस्तुओं और संदर्भों
ये भाषाएं आमतौर पर अनबाइंड डायनेमिक एक्सटेंड्स (या सी के पार्लेंस, लाइफटाइम , के लिए अनिवार्य हैं) , हालांकि, इन भाषाओं के बीच वस्तुओं के अर्थ के अंतर के कारण ठीक वैसा ही नहीं है , नीचे देखें) डिफ़ॉल्ट रूप से, प्रथम श्रेणी के संदर्भ से परहेज ( जैसे C में ऑब्जेक्ट पॉइंटर्स) और सिमेंटिक रूल्स में अप्रत्याशित व्यवहार (जैसे ISO C का अपरिभाषित व्यवहार से संबंधित व्यवहार)।
इसके अलावा, ऐसी भाषाओं में (प्रथम श्रेणी) वस्तुओं की धारणा रूढ़िवादी रूप से प्रतिबंधात्मक है: कुछ भी नहीं "स्थानिक" गुण डिफ़ॉल्ट रूप से निर्दिष्ट और गारंटीकृत हैं। यह कुछ ALGOL जैसी भाषाओं में पूरी तरह से अलग है, जिनकी वस्तुएं अनबाउंड डायनामिक extents (जैसे C और C ++) में हैं, जहां ऑब्जेक्ट का अर्थ मूल रूप से "टाइप किए गए स्टोरेज" के कुछ प्रकार हैं, जो आमतौर पर मेमोरी स्थानों के साथ युग्मित होते हैं।
वस्तुओं के भीतर भंडारण को एनकोड करने के लिए कुछ अतिरिक्त लाभ हैं जैसे कि अपने पूरे जीवन काल में नियतात्मक कम्प्यूटेशनल प्रभाव संलग्न करने में सक्षम हैं, लेकिन यह एक अन्य विषय है।
डेटा स्ट्रक्चर्स सिमुलेशन की समस्याएं
प्रथम श्रेणी के संदर्भों के बिना, इन डेटा संरचनाओं के प्रतिनिधित्व की प्रकृति और इन भाषाओं में सीमित आदिम संचालन के कारण, एकल-जुड़ी सूचियां कई पारंपरिक (उत्सुक / परिवर्तनशील) डेटा संरचनाओं को प्रभावी और आंशिक रूप से अनुकरण नहीं कर सकती हैं। (इसके विपरीत, C में, आप लिंक किए गए सूचियों को कड़ाई से अनुरूप कार्यक्रम में भी आसानी से प्राप्त कर सकते हैं ।) और इस तरह के वैकल्पिक डेटा संरचनाएं जैसे सरणियों / वैक्टरों में व्यवहार में एकल-लिंक्ड सूचियों की तुलना में कुछ बेहतर गुण होते हैं। यही कारण है कि आर 5 आरएस नए आदिम संचालन की शुरुआत करता है।
लेकिन वहाँ मौजूद अंतर वेक्टर / सरणी प्रकार बनाम दोहरी-लिंक्ड सूची। एक सरणी को अक्सर O (1) पहुंच समय जटिलता और कम स्थान के उपरि के साथ ग्रहण किया जाता है, जो सूची द्वारा साझा नहीं किए गए उत्कृष्ट गुण हैं। (हालांकि कड़ाई से बोलते हुए, न तो आईएसओ सी द्वारा गारंटी दी जाती है, लेकिन उपयोगकर्ता लगभग हमेशा इसकी उम्मीद करते हैं और कोई व्यावहारिक कार्यान्वयन इन निहितार्थों की गारंटी नहीं देता है, यह स्पष्ट रूप से गारंटी देता है।) ओटीओएच, एक डबल-लिंक्ड सूची अक्सर दोनों गुणों को एक एकल-लिंक्ड सूची से भी बदतर बना देती है। , जबकि पिछड़े / आगे के पुनरावृत्ति भी एक सरणी या एक वेक्टर (पूर्णांक सूचकांकों के साथ) से भी कम ओवरहेड द्वारा समर्थित हैं। इस प्रकार, एक डबल-लिंक्ड सूची सामान्य रूप से बेहतर प्रदर्शन नहीं करती है। और भी बुरा, सूचियों के डायनेमिक मेमोरी आवंटन पर कैश दक्षता और विलंबता के बारे में प्रदर्शन अंतर्निहित कार्यान्वयन वातावरण (उदाहरण libc) द्वारा प्रदान किए गए डिफ़ॉल्ट आवंटनकर्ता का उपयोग करते समय सरणियों / वैक्टरों के प्रदर्शन की तुलना में भयावह रूप से बदतर हैं। तो एक बहुत ही विशिष्ट और "चतुर" रनटाइम के बिना ऐसी वस्तु कृतियों का भारी अनुकूलन, सरणी / वेक्टर प्रकार अक्सर लिंक की गई सूचियों के लिए पसंद किए जाते हैं। (उदाहरण के लिए, आईएसओ सी ++ का उपयोग करते हुए, एक चेतावनी है किstd::vector
std::list
डिफ़ॉल्ट रूप से प्राथमिकता दी जानी चाहिए ।) इस प्रकार, विशेष रूप से समर्थन (दोगुनी) लिंक करने के लिए नई प्राथमिकताओं को पेश करना निश्चित रूप से इतना फायदेमंद नहीं है जितना कि अभ्यास में सरणी / वेक्टर डेटा संरचनाओं का समर्थन करना है।
निष्पक्ष होने के लिए, सूची में अभी भी सरणियों / वैक्टर की तुलना में कुछ विशिष्ट गुण हैं:
- सूची नोड-आधारित हैं। सूची से तत्वों को हटाने से अन्य नोड्स में अन्य तत्वों के संदर्भ को अमान्य नहीं किया जाता है । (यह कुछ पेड़ या ग्राफ डेटा संरचनाओं के लिए भी सच है।) OTOH, सरणियाँ / वैक्टर अनुगामी स्थिति के संदर्भ को अमान्य बना सकते हैं (कुछ मामलों में बड़े पैमाने पर वसूली के साथ)।
- सूचियाँ O (1) समय में विभाजित हो सकती हैं । वर्तमान के साथ नए सरणियों / वैक्टरों का पुनर्निर्माण कहीं अधिक महंगा है।
हालांकि, ये गुण किसी भाषा में अंतर्निहित एकल-लिंक्ड सूचियों के समर्थन के लिए बहुत महत्वपूर्ण नहीं हैं, जो इस तरह के उपयोग के लिए पहले से ही सक्षम है। हालाँकि, अभी भी मतभेद मौजूद हैं, भाषा में वस्तुओं के अनिवार्य गतिशील विस्तार के साथ (जिसका आमतौर पर मतलब है कि झूलने वाले संदर्भों को दूर रखते हुए एक कचरा कलेक्टर है), इरादों के आधार पर अमान्यता भी कम महत्वपूर्ण हो सकती है। तो, एकमात्र मामले जहां दोगुनी-लिंक्ड सूचियां जीत सकती हैं:
- गैर-प्राप्ति गारंटी और द्विदिश पुनरावृत्ति आवश्यकताओं की आवश्यकता होती है। (यदि तत्व पहुंच का प्रदर्शन महत्वपूर्ण है और डेटा का सेट काफी बड़ा है, तो मैं इसके बजाय बाइनरी सर्च ट्री या हैश टेबल चुनूंगा।)
- कुशल द्विदिश विभाजन कार्यों की आवश्यकता है। यह काफी दुर्लभ है। (मैं केवल एक ब्राउज़र में रैखिक इतिहास रिकॉर्ड जैसे कुछ लागू करने पर केवल आवश्यकताओं को पूरा करता हूं।)
अपरिवर्तनशीलता और अलियासिंग
हास्केल जैसी शुद्ध भाषा में, वस्तुएँ अपरिवर्तनीय होती हैं। योजना की वस्तु अक्सर म्यूटेशन के बिना उपयोग की जाती है। इस तरह के तथ्य से ऑब्जेक्ट इंटर्निंग के साथ मेमोरी दक्षता को प्रभावी ढंग से सुधारना संभव हो जाता है - मक्खी पर एक ही मूल्य के साथ कई वस्तुओं का अंतर्निहित साझाकरण।
यह भाषा के डिजाइन में एक आक्रामक उच्च-स्तरीय अनुकूलन रणनीति है। हालाँकि, इसमें कार्यान्वयन की समस्याएं शामिल हैं। यह वास्तव में अंतर्निहित भंडारण कोशिकाओं को निहित उपनामों का परिचय देता है। यह विश्लेषण को और अधिक कठिन बनाता है। नतीजतन, गैर-प्रथम श्रेणी के संदर्भों के ओवरहेड को खत्म करने की संभावनाएं कम हो सकती हैं, यहां तक कि उपयोगकर्ता उन्हें कभी भी नहीं छूते हैं। स्कीम जैसी भाषाओं में, एक बार म्यूटेशन पूरी तरह से खारिज नहीं किया जाता है, यह भी समानता को बाधित करता है। यह एक आलसी भाषा में ठीक हो सकता है (जिसमें पहले से ही प्रदर्शन समस्याएँ किसी भी तरह से होती हैं), हालाँकि।
सामान्य प्रयोजन के प्रोग्रामिंग के लिए, भाषा डिजाइन की ऐसी पसंद समस्याग्रस्त हो सकती है। लेकिन कुछ सामान्य कार्यात्मक कोडिंग पैटर्न के साथ, भाषाएँ अभी भी अच्छी तरह से काम करती हैं।