2012-03-17 17 views
13

ऐसा लगता है कि सी ++ 11 एक whopping छह अलग नियमित अभिव्यक्ति व्याकरण का समर्थन करता है:सी ++ 11 6 अलग-अलग नियमित अभिव्यक्ति व्याकरण का समर्थन क्यों करता है?

  • ECMA-262 (ECMAScript) नियमित अभिव्यक्ति (थोड़ा संशोधित?)
  • बेसिक POSIX रेगुलर एक्सप्रेशन
  • विस्तारित POSIX रेगुलर भाव
  • awk नियमित अभिव्यक्ति
  • ग्रेप नियमित अभिव्यक्ति
  • egrep नियमित अभिव्यक्ति

क्यों यह बजाय एक ही व्याकरण पर बसने के इतने सारे विकल्प शामिल करने का फैसला किया गया था? ये विशेष 6 क्यों?

+8

क्योंकि यह सिर्फ * वह * कमाल है? –

+4

पर्ल नियमित अभिव्यक्ति ftw! –

+2

याद रखें, नियमित अभिव्यक्ति भाषाएं सभी समान हैं। मुझे यकीन है कि उनके पीछे इंजन पार्सर में कुछ मामूली बदलावों के साथ समान है। – Gabe

उत्तर

13

मानकीकरण प्रक्रिया व्यावहारिकता के बारे में है। मानक में आरई व्याकरण को शामिल करने के लाभ हैं, जब तक कि यह सही ढंग से निर्दिष्ट किया गया हो, लेकिन एक को छोड़ने का कोई लाभ नहीं है।

बहिष्करण लाइब्रेरी कार्यान्वयनकर्ता के लिए "100% सी ++ 11 अनुपालन" बैज लागू करने के लिए आसान बना देगा, लेकिन वास्तव में कौन परवाह करता है? किसी भी व्यक्ति को वैसे भी दावा नहीं करना चाहिए, और केवल अज्ञानी पीएचबी इसकी तलाश करेंगे। पुस्तकालयों में हमेशा ऐसी बग होती है जो 100% तक पहुंचने से रोकती हैं, और एक अच्छी लाइब्रेरी में अधिक सुविधाएं होती हैं।

ध्यान दें कि सभी शामिल व्याकरण पहले से ही मौजूदा अंतरराष्ट्रीय मानकों द्वारा निर्दिष्ट किए गए हैं। सी ++ समिति के हिस्से पर बहुत कम प्रयास की जरूरत है। बस §28.13, जो कि कुछ पेज लंबा है।

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

+0

+1 क्यों एकाधिक शामिल हैं। इन छः पर क्यों कोई विचार? मैं एक पर्ल-जैसी व्याकरण, जैसे संशोधित ईसीएमएस्क्रिप्ट व्याकरण, देख सकता हूं, उतने (अधिकांश?) आधुनिक भाषाओं में पर्ल व्युत्पन्न रेगेक्स व्याकरण है। यह दो POSIX व्याकरण को शामिल करने के लिए भी समझ में आता है, क्योंकि वे मानकीकृत हैं और यूनिक्स जैसी ओएस पर उपयोग किए जाते हैं। हालांकि, awk, grep, और egrep द्वारा उपयोग किए गए एक्सटेंशन सहित मनमाना लगता है। क्या पॉज़िक्स सी रेगेक्स एपीआई में उन्हें शामिल किया गया है? अन्य सामान्य रूप से प्रयुक्त रेगेक्स पुस्तकालयों का प्रयोग करें? – rkjnsn

+0

@rkjnsn: ईसीएमएस्क्रिप्ट को छोड़कर सभी व्याकरण POSIX द्वारा परिभाषित किए गए हैं, जिनमें Awk और [e] grep शामिल हैं। उनके बारे में सभी सी ++ 11 मानक कहते हैं "पॉज़िक्स देखें।" POSIX किसी अन्य POSIX व्याकरण के संदर्भ में Awk के व्याकरण को परिभाषित करता है: http://pubs.opengroup.org/onlinepubs/009604499/utilities/awk.html#tag_04_06_13_04। तो यह वास्तव में छह समर्थित व्याकरण नहीं है, लेकिन दो समर्थित मानकों। – Potatoswatter

+0

... एक पुराना धागा मैं कुछ जोड़ना चाहता हूं जिसे मैंने उल्लेख नहीं किया है। व्याकरण की एक विकल्प मौजूदा ReGex कार्यों को C++ पर पोर्ट करने के लिए एक आसान पथ की अनुमति देती है। नियमित कार्यों को उनकी जरूरतों के अनुरूप होने से पहले और सभी असामान्य स्थितियों को कवर करने से पहले मौजूदा कार्यों को बहुत सारे पुनरावृत्तियों से गुजरना पड़ सकता है। वहां एक ईमेल पता सत्यापित करने के सभी प्रयासों को देखें। मैं अपने वातावरण को सी ++ पर पोर्ट करने के बारे में कुछ वातावरण देख सकता हूं अगर उन्हें फिर से अपने पैटर्न तैयार करना शुरू करना पड़ा। लेकिन ऐप को फिर से शुरू करने और अपने मौजूदा पैटर्न को लाने के लिए एक जीत-जीत है। – Arbalest

0

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

इन समस्याओं को हल करने के लिए वहाँ दो समाधान हैं:

  • उन
  • की किसी भी भाषा में सभी लोकप्रिय मानकों को शामिल करें

दूसरा और अधिक सुरुचिपूर्ण है के लिए एक API बनाने क्योंकि अगर आप एक एपीआई के इंटरफ़ेस को बदलें, संगतता समस्याएं होती हैं।

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

+1

मुझे कोई ओएस नहीं पता है जिनके सम्मेलनों में नियमित अभिव्यक्तियां शामिल हैं ... –

+0

पॉज़िक्स पोर्टेबल ऑपरेटिंग सिस्टम इंटरफेस (एक्स यूनिक्स के लिए है) के लिए है। ऑपरेटिंग स्वयं को नियमित अभिव्यक्तियों की आवश्यकता नहीं है। हालांकि अगर आप फ़ाइल प्रबंधन करना चाहते हैं तो फाइलों को देखने के लिए कोई रेगेक्स का उपयोग कर सकता है। लिनक्स/यूनिक्स के साथ आने वाले अधिकांश कार्यक्रम नियमित अभिव्यक्तियों के लिए POSIX मानक का उपयोग करते हैं। –

+1

@ केरेकस्क: यूनिक्स के सम्मेलनों में नियमित अभिव्यक्तियां शामिल हैं। बेशक, यह एकमात्र ओएस है जो ऐसा करता है, और इसके सम्मेलनों में 6 में से 5 शामिल हैं। – Gabe

4

यह TR1 proposal द्वारा कवर किया गया है। मैं संक्षेप में प्रयास करने की कोशिश करूंगा।

यह अपने आप को हड़ताल करने के बजाय मौजूदा मानक पर निर्माण करने के लिए समझदार प्रतीत होता था।

दो मौजूदा मानकों पर वे निर्माण कर सकते थे पहचान की गई: POSIX RES और ECMAScript REs। पर्ल आरईएस को छोड़ दिया गया क्योंकि वे मानकीकृत नहीं हैं। (कौन से उचित लोग असहमत हो सकते हैं।) इसके अलावा, ईसीएमएस्क्रिप्ट आरई को पर्ल आरईएस के एक सरल सबसेट के रूप में देखा गया था जो सबसे उपयोगी (या शायद सबसे अधिक इस्तेमाल) सुविधाओं को शामिल करता है।

दो में से, पॉसिक्स आरईएस '"सबसे लंबा सबसे लंबा" कार्यान्वयन गैर-लालची दोहराने जैसी महत्वपूर्ण विशेषताओं के साथ अच्छी तरह से नहीं खेला गया था, और इस बात के बावजूद कि अधिकांश आरई इंजन इन दिनों कैसे काम करते हैं।

दूसरी ओर, ईसीएमएस्क्रिप्ट आरई में पॉज़िक्स आरईएस के स्थानीयकरण समर्थन की कमी थी। इसलिए, उन्होंने POSIX-RE-style स्थानीयकरण समर्थन को शामिल करने के लिए ईसीएमएस्क्रिप्ट आरई बढ़ाया।

पॉज़िक्स आरई समर्थन वैकल्पिक के रूप में शामिल किया गया था क्योंकि यह व्यवहार ईसीएमएस्क्रिप्ट आरईएस से काफी अलग है ताकि इसे मानक विकल्प माना जा सके। POSIX मानक दो व्याकरण के साथ आता है: मूल और विस्तारित। अजीब, grep, और egrep आरईएस वास्तव में अलग व्याकरण के बजाय बुनियादी या विस्तारित POSIX व्याकरण के लिए बस मामूली विविधताएं हैं।

तो: दो मानक, तीन व्याकरण, छह भिन्नताएं।

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