2009-02-19 14 views
5

मान लें कि आप स्क्रैच से एक नई भाषा को डिजाइन और कार्यान्वित कर रहे हैं, हालांकि आप मौजूदा भाषाओं/कार्यान्वयन से स्वतंत्र रूप से विचार उधार ले सकते हैं।आप अपने स्ट्रिंग प्रकार को कैसे कार्यान्वित करेंगे?

प्रश्न: यदि कोई प्रोग्रामर स्ट्रिंग वैरिएबल घोषित करता है (दृढ़ता से टाइप किया गया मान लें), तो आप इस चर को स्मृति में कैसे स्टोर करना चुनेंगे?

कई उपयोग के मामले हैं, लेकिन क्या आपके पास एक विशेष मॉडल है जो कुछ क्षेत्रों में बेहतर है? क्या आपकी स्ट्रिंग म्यूटेबल है? क्या यह उत्परिवर्तनीय है, लेकिन केवल एक निश्चित लंबाई के लिए जो स्मृति का अंत नहीं है? क्या मैं गतिशील रूप से लंबाई निर्धारित कर सकता हूं, या यह केवल संकलन समय पर किया जा सकता है? क्या 'एनटी' तत्व का उपयोग करना आसान है? क्या स्ट्रिंग को स्मृति के एक संगत क्षेत्र की आवश्यकता होती है? क्या इसे छोटे तारों में विभाजित किया जा सकता है?

कुछ चीजें यह मानने के लिए कि प्रोग्रामर आपकी स्ट्रिंग के साथ क्या करना पसंद कर सकते हैं: लंबाई की गणना करना। स्ट्रिंग में जोड़ना। स्ट्रिंग (सबस्ट्रिंग्स) के हिस्सों को निकालना। रेगेक्स लागू करना। एक अलग मूल्य (संख्या, बूलियन, आदि) में कनवर्ट करना

संपादित करें: मेरा मतलब स्पष्ट करना।

एक उपयोगकर्ता वाणी निम्नलिखित हैं:

var Name : string 

आप कैसे चुनते हैं, भाषा डिजाइनर के रूप में, कैसे रैम में यह स्टोर करने के लिए? आपकी विधि के फायदे और नुकसान क्या हैं, आदि

+0

यह एक भाषा स्वतंत्र प्रश्न नहीं है। प्रत्येक भाषा में स्ट्रिंग्स को स्टोर करने के तरीके के विभिन्न तरीके और क्षमताएं होती हैं। शायद आप एक भाषा परिवार निर्दिष्ट कर सकते हैं? – gahooa

+0

"दृढ़ता से टाइप किया गया" स्ट्रिंग सभी सामान्यतः उपयोग की जाने वाली भाषाओं में निर्मित प्रथम श्रेणी का प्रकार है। कृपया अपने प्रश्न को स्पष्ट करें। क्या आप पूछ रहे हैं कि कोई अंतर्निहित स्ट्रिंग प्रकार का उपयोग क्यों नहीं करेगा? तुम क्या जानना चाहते हो? –

+0

मैं इसे समझने के लिए समझता हूं: यदि आप स्क्रैच से एक नई भाषा तैयार कर रहे थे, तो आप अपने स्ट्रिंग प्रकार को कैसे कार्यान्वित करेंगे? –

उत्तर

5

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

अपरिवर्तनीय स्ट्रिंग, मैं यूनिकोड मानों की एक शून्य-समाप्त सरणी के रूप में स्टोर करूंगा। म्यूटेबल स्ट्रिंग, मैं आसान रीफफलिंग, स्लाइसिंग इत्यादि के लिए यूनिकोड वर्णों की एक लिंक्ड सूची के रूप में स्टोर करूंगा।

+0

क्या चार्स का एलएल काफी प्रदर्शन बाधा नहीं होगा? –

+0

मुझे लगता है कि यूनिकोड मानों के सरणी की एक लिंक की गई सूची अधिक कुशल होगी, लेकिन मूल विचार सही लगता है। – Darron

+0

मैं भी म्यूटेबल स्ट्रिंग को स्मृति में यूनिकोड वर्णों की सरणी के रूप में रखूंगा; हालांकि, मैं 256 बाइट्स की तरह बड़े बफर को पूर्व-आवंटित करता हूं। अन्यथा आपके उत्परिवर्तनीय उदाहरण स्मृति और समय दोनों उपभोग पर बहुत महंगा हो जाते हैं। –

2

मुझे लगता है कि आप यह मान रहे हैं कि आप एक भाषा तैयार कर रहे हैं? तो मुझे लगता है कि मैं सी के मॉडल के साथ जाऊंगा और इसे स्मृति के एक संगत टुकड़े के रूप में स्टोर करूंगा, शून्य समाप्त हो जाएगा। यह मेरे लिए सबसे तार्किक तरीका लगता है।

पेशेवर: यदि आप शून्य को छूट देते हैं तो कोई स्मृति बर्बाद नहीं होती है।

विपक्ष: एक विधि के माध्यम से स्ट्रिंग की लंबाई की गणना करने के, आदि

0

मैं नेट स्ट्रिंग वर्ग स्वांग रचना और उस से निर्माण होगा लो।

+0

क्या यह अवैध नहीं होगा? – cdmckay

+1

आप मोनो स्ट्रिंग का उपयोग कर सकते हैं और यह काफी समान होगा। –

1

मेरा मानना ​​है कि आप पूछ रहे हैं कि आप स्ट्रिंग ऑब्जेक्ट को कैसे कार्यान्वित करेंगे।

प्रदर्शन कारणों से, आप एक ब्लॉक के रूप में स्ट्रिंग में वर्णों के लिए आवंटित स्मृति को रखना चाहते हैं। यह सभी तत्वों पर किए गए संचालन को तेज करेगा - केस परिवर्तन, प्रतिलिपि, लंबाई गणना, अनुक्रमणिका और इसी तरह। यह संचालन को कार्यान्वित करना भी आसान बनाता है जो स्ट्रिंग के प्रारंभ या अंत में काम करता है - ट्रिम, सबस्ट्रिंग आदि।

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

एक स्ट्रिंग दो कारणों से अपरिवर्तनीय है या नहीं निर्धारित होता होना चाहिए या नहीं:

  • आप स्मृति भंडारण करने के लिए या यदि सभी कार्यों एक वर्ग में समाहित हैं सीधी पहुँच दे सकते हैं?
  • आपकी स्मृति आवंटन रनटाइम द्वारा प्रबंधित है या आपको इसे स्वयं प्रबंधित करना है?

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

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

2

मैं स्ट्रिंग से जुड़े एन्कोडिंग की आवश्यकता से शुरू करूंगा। यदि स्रोत में निर्दिष्ट नहीं है, तो स्ट्रिंग अक्षर में स्रोत फ़ाइल के समान ही एन्कोडिंग होगी।

बेशक मैं UTF-8 के प्रति पक्षपाती हूँ, और शायद मानक पुस्तकालय है कि तंत्र में संचालित करने के लिए

इसके अलावा की व्यवस्था होगी, मैं एक संरचनात्मक प्रतिनिधित्व कि एक सरणी की तुलना में थोड़ा होशियार है उपयोग करने पर विचार करता हूँ बाइट्स, क्योंकि बफर के साथ परेशान करना चाहता है!

एसजीआई की टेम्पलेट लाइब्रेरी एक 'रस्सी' अमूर्त प्रकार के साथ आता है जो यह बहुत अच्छी तरह से करता है। Iterators (लेकिन पुनरावृत्ति नहीं) महंगा हैं, लेकिन बदले में, आवेषण, हटाना, संलग्न, उप-श्रेणियां और तुलना सभी काफी सस्ते हैं।

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

टीसीएल के टेक्स्ट फ़ील्ड विजेट के माध्यम से ऐसा करने का अप्रत्यक्ष तरीका है। यह आम तौर पर पाठ को आम तौर पर उपयोगी बनाता है। एकमात्र नकारात्मकता यह डिज़ाइन उन अनुक्रमों के लिए खराब काम करता है जिनके पास लाइन उन्मुख वितरण नहीं है।

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

3

मैं सी स्ट्रिंग से बचूंगा। लंबाई कंप्यूटिंग ओ (एन) है। सबस्ट्रिंग साझा करना लगभग असंभव है। संगत स्मृति आवश्यकता विखंडन की ओर जाता है। टर्मिनेटर के साथ कोई भी समस्या बग और सुरक्षा छेद की ओर ले जाती है। यदि आप इसे यूसीएस -4 के रूप में स्टोर करते हैं, तो आप एएससीआईआई स्ट्रिंग्स के लिए बहुत सी जगह बर्बाद कर देते हैं (और सी संगतता खो देते हैं, सी स्ट्रिंग का एक लाभ); यदि आप इसे यूटीएफ -8 के रूप में स्टोर करते हैं, तो इंडेक्सिंग ओ (एन) है।पीडीपी -11 के एएससीआईजेड प्रकार ने वास्तव में बहुत सी समझदारी की है जब आप एक पीडीपी -11 पर ASCII के लिए लाइब्रेरी लिख रहे हैं।

बोली से PDP-11 के युवा अक्सर एक अलग संरचना का उपयोग करें:

  • पास्कल एक टर्मिनेटर के बजाय एक लंबाई क्षेत्र का उपयोग करता है - अपने strlen() हे है (1)।
  • फर्थ का उपयोग (पता, लंबाई) युगल - उनके strlen() ओ (1) है, साथ ही वे आसानी से सबस्ट्रिंग साझा कर सकते हैं।
  • जावा जैसी कई आधुनिक "प्रबंधित" भाषाएं अलग-अलग लंबाई को स्टोर करती हैं।
  • अन्य भाषाओं में (जैसे सामान्य लिस्प), तार केवल वेक्टर का एक उप प्रकार हैं (जिनके तत्व पात्र हैं)।
  • एक्सेल टीम ने सी का उपयोग किया, लेकिन प्रदर्शन के लिए अपने स्वयं के पास्कल तारों को लागू किया।

मैं ropes जैसे कुछ उपयोग करता हूं। Concatenation निरंतर समय है। उन्हें संगत स्मृति की आवश्यकता नहीं है। सबस्ट्रिंग साझा करना आसान है। सभी परिचालन एक बहुप्रचारित वातावरण में लॉक किए बिना किया जा सकता है। शायद यूसीएस -4 और एएससीआईआई नोड्स को सामान्य मामले में भंडारण को अधिक कॉम्पैक्ट बनाने की अनुमति दें, और/या वास्तव में वास्तव में छोटे तारों के लिए आंतरिक रूप से एक सरल संरचना का उपयोग करें।

ASCIZ बहुत अच्छा है यदि आपके पास छोटी मेमोरी, लघु तार, 7-बिट वर्ण, विश्वसनीय इनपुट, और आपका सीपीयू इतना धीमा है कि यह वास्तव में सावधान रहने के लिए आपके प्रोग्रामर-टाइम के लायक है। यूनिकोड, मल्टीथ्रेडिंग, कुशल जीसी, फास्ट सीपीयू, और बड़े (संभवतः अविश्वसनीय) इनपुट की आधुनिक दुनिया में, यह अब एक अच्छा विकल्प नहीं है।

संबंधित मुद्दे

 संबंधित मुद्दे