मैं अपनी खुद की भाषा करने के बारे में सोच रहा हूं (व्यावहारिकता: यह एक विचार प्रयोग है)। जिन विचारों के साथ मैं आया था उनमें से एक भाषा में अर्थपूर्ण भिन्नता है। आप अनिवार्य रूप से अर्थपूर्ण नियमित अभिव्यक्तियां लिखेंगे, जिन्हें समकक्ष कोड के साथ प्रतिस्थापित किया जाएगा। आप इसे डी में कुछ कम प्रत्यक्ष रूप में देख सकते हैं- उनके पास स्ट्रिंग मिश्रक हैं जो डी कोड में परिवर्तित होते हैं। सिवाय इसके कि मैं उन्हें पूरी तरह से करने जा रहा था, और एक और परिपत्र फैशन में।भाषा में अर्थपूर्ण भिन्नता
अभी, मैं सी ++ से निकला हूं। तो यदि आप विचार करते हैं:
string a, b, c, d;
// do stuff
a = b + c + d;
यह कोड विभिन्न अस्थायी परिणामों में परिणाम देता है। यहां तक कि यदि आपके पास रावल संदर्भ हैं, तो आप अस्थायी बनायेंगे, उन्हें आसानी से और अधिक कुशलतापूर्वक उपयोग किया जाएगा। लेकिन वे अभी भी मौजूद हैं और अभी भी प्रदर्शन बर्बाद कर रहे हैं। मैं सबसे सरल मामले में, इस बारे में सोच रहा था कि इन्हें कैसे हटाया जा सकता है। आप एक अर्थपूर्ण नियमित अभिव्यक्ति लिख सकते हैं जो इसे सबसे अनुकूलित रूप में परिवर्तित कर देगा।
string a, b, c, d;
// do stuff
a.resize(b.size() + c.size() + d.size());
a = b; a += c; a += d;
अगर मैंने std :: string लागू किया है, तो मैं कुछ और तेज़ी से लिखने में सक्षम हो सकता हूं। इसकी कुंजी यह है कि वे अंतर्निहित हैं - जब आप std :: स्ट्रिंग क्लास का उपयोग करते हैं, तो std :: स्ट्रिंग कार्यान्वयनकर्ता द्वारा लिखे गए सिद्धांत किसी भी std :: स्ट्रिंग कोड को प्रभावित कर सकते हैं। आप इसे मौजूदा सी ++ कोडबेस में छोड़ सकते हैं, पुनः संकलित कर सकते हैं, और सबसे तेज़ स्ट्रिंग कॉन्सटेनेशन प्राप्त कर सकते हैं कि आपका std :: स्ट्रिंग कार्यान्वयन मुफ्त में कल्पना कर सकता है।
फिलहाल, आपके द्वारा किए जा सकने वाले अनुकूलन सीमित हैं, क्योंकि आपके पास केवल उतना ही संदर्भ है जितना भाषा आपको अनुमति देता है, इस मामले में, सी ++ में ऑपरेटर अधिभार केवल दो तर्क लेता है, यह और तर्क देता है। लेकिन एक अर्थपूर्ण रेग एक्स आपको लगभग सभी संदर्भों को ले सकता है जिनकी आपको कभी आवश्यकता हो सकती है - क्योंकि आप यह बता सकते हैं कि यह क्या मेल खाता है - और यहां तक कि भाषा की विशेषताओं से मेल खाता है जो होस्ट भाषा में मौजूद नहीं हैं। उदाहरण के लिए, इसके लिए
string a;
a.size();
string a;
a.size;
विनिमय करने के लिए यदि आप सी # गुण चोरी करने के लिए चाहता था तुच्छ होगा। आप कक्षा परिभाषाओं से मेल खा सकते हैं और संकलन या रन टाइम प्रतिबिंब लागू कर सकते हैं, आदि
लेकिन, मेरा मतलब है, यह भ्रमित हो सकता है। यदि कोई बग था, या दृश्यों के पीछे वास्तव में क्या किया गया था, तो लिखा गया कोड प्रतिबिंबित नहीं करता है, यह ट्रैक करने के लिए कुल कुतिया हो सकता है, और मैंने नहीं सोचा है कि इसे गहराई में कैसे लागू किया जाएगा। आप लोग मेरी प्रस्तावित भाषा सुविधा के बारे में क्या सोचते हैं?
ओह मैन, सही टैग चुनना। उम्म्म ....
संपादित करें: मैं भी एक जवाब के संबंध में सीमाओं के दायरे का उल्लंघन करना चाहता था। साधारण तथ्य यह है कि अर्थपूर्ण रेगेक्स की कोई सीमा नहीं है (शून्य कार्यान्वयन विवरण जो जोड़ना पड़ सकता है)। उदाहरण के लिए, आप में
int i;
cin >> i;
std::variable_array<int>(alloca(sizeof(int) * i), i);
alloca के शब्दों अभिव्यक्ति
int i;
cin >> i;
int lols[i];
बारी टेम्पलेट्स impossible- आप किसी मैक्रो लिखने के लिए आप ऊपर चाहते हैं के साथ हेरफेर कर सकता है। सी ++ 03 या सी ++ 0x में, आप अपने स्वयं के वीएलए को समाहित नहीं कर सकते हैं।
इसके अलावा, अर्थपूर्ण regexes कोड से मेल खा सकता है जो वास्तव में किसी संकलन-समय के काम का आह्वान नहीं करता है। उदाहरण के लिए, आप कक्षा परिभाषा के प्रत्येक सदस्य से मेल खा सकते हैं और प्रतिबिंब प्रणाली बनाने के लिए इसका उपयोग कर सकते हैं। यह आज तक ++ में भी असंभव है।
कोई विचार क्या पैटर्न मिलान वाक्यविन्यास दिख सकता है? –
मुझे अभी बहुत कुछ नहीं पता है, लेकिन यह जटिल नहीं है- आप थोड़ा सा कोड लिखते हैं जो उस कोड की तरह दिखता है जिसे आप प्रतिस्थापित करना चाहते हैं, और थोड़ा सा कोड जो उस कोड की तरह दिखता है जिसे आप उपयोग करना चाहते हैं। – Puppy