2010-08-27 14 views
5

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

अभी, मैं सी ++ से निकला हूं। तो यदि आप विचार करते हैं:

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 कोड से मेल खा सकता है जो वास्तव में किसी संकलन-समय के काम का आह्वान नहीं करता है। उदाहरण के लिए, आप कक्षा परिभाषा के प्रत्येक सदस्य से मेल खा सकते हैं और प्रतिबिंब प्रणाली बनाने के लिए इसका उपयोग कर सकते हैं। यह आज तक ++ में भी असंभव है।

+0

कोई विचार क्या पैटर्न मिलान वाक्यविन्यास दिख सकता है? –

+0

मुझे अभी बहुत कुछ नहीं पता है, लेकिन यह जटिल नहीं है- आप थोड़ा सा कोड लिखते हैं जो उस कोड की तरह दिखता है जिसे आप प्रतिस्थापित करना चाहते हैं, और थोड़ा सा कोड जो उस कोड की तरह दिखता है जिसे आप उपयोग करना चाहते हैं। – Puppy

उत्तर

1

यदि आप "सी ++ अभिव्यक्ति टेम्पलेट" जैसे कुछ के लिए Google हैं, तो आप पाएंगे कि वास्तव में सी ++ में पहले से ही समान क्षमताएं हैं। सिंटैक्स के लिए आपके साथ आने के आधार पर, आपका विचार इस तरह के कोड को समझने में आसान बना सकता है (अभिव्यक्ति टेम्पलेट्स निश्चित रूप से तुच्छ नहीं हैं) लेकिन कम से कम मेरे लिए यह पूरी तरह से स्पष्ट नहीं है कि आप अधिक (यदि कुछ भी) जोड़ रहे हैं वास्तव में नई क्षमता का रास्ता।

+0

क्या आप जिस तरीके से संदर्भित हैं, उदाहरण के लिए, boost :: lambda work? इसके अलावा, मैंने उस पुस्तकालय की तरह चीजें देखी हैं जो संकलन-समय पर ऑपरेटरों में खींचे गए आकारों के क्षेत्रों की गणना करती हैं। लेकिन यह वही बात नहीं है, क्योंकि सबसे पहले मैं अपने इंटरफ़ेस को जो भी चाहूं (कारण की सीमाओं के भीतर) परिभाषित कर सकता हूं, जबकि अभिव्यक्ति टेम्पलेट इंटरफेस सबसे निश्चित रूप से गैर-तुच्छ हैं। दूसरा, मैं कंपाइलटाइम पर रनटाइम व्यवहार करने के बारे में बात नहीं कर रहा हूं, या इसके विपरीत भी, लेकिन एक अन्य प्रकार के साथ एक संकलन/रनटाइम व्यवहार को बदलना जो कि किसी अन्य वेश्या में बेहतर है। – Puppy

+0

कोई और संपादन नहीं :(तीसरा, बहुत कम सीमाएं हैं। उदाहरण के लिए, एक अर्थशास्त्रीय रेग के पास उन संरचनाओं से मेल खाने की शक्ति होती है जिनके साथ कक्षा परिभाषा की तरह उनके साथ कोई संकलन-समय का काम नहीं होता है। आप कक्षा परिभाषा से कैसे मेल करेंगे एक टेम्पलेट के साथ? या एक वीएलए encapsulate? आप उन चीजों में से कोई भी नहीं कर सकते हैं। – Puppy

1

(चेतावनी: Mammoth जवाब आगे)

मुझे लगता है कि यह एक मैक्रो कहा जाता है;) ठीक है, कम से कम C/C++ दुनिया के बाहर (जहाँ "मैक्रो" यह severly सीमित प्रतिस्थापन पूर्वप्रक्रमक प्रदान करता है को संदर्भित करता है)। और यह बहुत उपन्यास नहीं है। हालांकि मुझे लगता है कि एक उचित, शक्तिशाली मैक्रो सिस्टम किसी भी अन्य फीचर की तुलना में किसी भाषा में अधिक शक्ति जोड़ सकता है (बशर्ते हम पर्याप्त प्राइमेटिव्स को सुरक्षित रखें कि यह केवल ट्यूरिंग-पूर्ण नहीं है, बल्कि वास्तविक प्रोग्रामिंग के लिए उपयोगी है), जिसमें एक पर्याप्त स्मार्ट प्रोग्रामर लगभग जोड़ सकता है सभी सुविधाएं जो भविष्य में या किसी विशिष्ट डोमेन के लिए भाषा में नियम (आगे) नियमों के बिना उपयोगी साबित हो सकती हैं।

मूल विचार स्रोत कोड के साथ स्ट्रिंग के ऊपर एक प्रस्तुति में एक वाक्यांश को पार्स करना है, कहें, AST या parse tree। इस तरह के पेड़ कार्यक्रम के बारे में अधिक जानकारी प्रदान करते हैं, और एक और कार्यक्रम इस पेड़ पर चल सकता है और इसे संशोधित कर सकता है। उदाहरण के लिए, VariableDeclaration नोड की तलाश करना संभव होगा, जांचें कि क्या यह T की एक पुरानी पुरानी सरणी घोषित करता है, और इसे VariableDeclaration नोड के साथ प्रतिस्थापित करें जो T के std::variable_array की घोषणा करता है। उदाहरण के लिए यह पेपर के लिए पैटर्न मिलान प्रदान करके परिष्कृत किया जा सकता है, जिससे मेटाप्रोग्रामिंग आसान हो जाती है। एक शक्तिशाली प्रक्रिया, यदि और केवल प्रोग्रामर इस स्तर के सार के साथ सामना कर सकता है और जानता है कि इसे अच्छे उपयोग के लिए कैसे रखा जाए।

ध्यान दें कि जब मैं "पैटर्न मिलान" की बात कर रहा हूं, तो मैं नियमित अभिव्यक्तियों के कार्यात्मक प्रोग्रामिंग में मिलान पैटर्न के बारे में बात करता हूं। नियमित अभिव्यक्ति अनियमित भाषाओं को समझने के लिए अपरिपक्व हैं, इसमें प्रत्येक उपयोगी भाषा शामिल है - केवल संतुलित कोष्ठक समेत आबादी के आकार की अभिव्यक्तियों को अनुमति देना, नियमित अभिव्यक्तियों का नियम बनाना। What is 'Pattern Matching' in functional languages? पर स्वीकार्य उत्तर को पैटर्न मिलान के लिए एक उत्कृष्ट परिचय के लिए देखें, और हो सकता है कि केवल एक सीखने वाली भाषा सीखें जैसे हास्केल ओडर ओ'कैमल अगर केवल यह सीखने के लिए कि पेड़ को कैसे संसाधित किया जाए और अन्य शांत सुविधाओं का एक टन हो !)।

अब आपके द्वारा प्रस्तावित भाषा पर: ईमानदारी से, मुझे संदेह है कि यह उपयोगी होगा। C++ स्वयं एक भाषा को डिज़ाइन नहीं करने का एक आदर्श उदाहरण है (जब तक कि आप सफल नहीं होना चाहते): मौजूदा व्यक्ति को लें, पिछड़ा-संगत रहें = इसे सभी (बुरी चीजों सहित) रखें, और नई सुविधाओं का एक समूह जोड़ें अपने आप से काफी जटिल हैं, फिर उन्हें हजारों बार ट्विक करें और मौजूदा भाषा के वाक्यविन्यास और अर्थशास्त्र के साथ कम या कम काम करने के लिए सौ विशेष मामलों को जोड़ें। यह सफलता की अधिक संभावना बनाता है (यदि आपके द्वारा शुरू की गई भाषा पहले से ही लोकप्रिय है), लेकिन आप एक आर्केन और सुरुचिपूर्ण जानवर के साथ समाप्त हो जाते हैं। ऐसा कहा जा रहा है, मैं वास्तव में एक गैर-लिस्पी भाषा देखना पसंद करूंगा जो ऐसी शक्ति के मैक्रोज़ को अनुमति देता है।

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

ओह, जब हम इसमें हैं: मैक्रोज़ स्वयं हमारे प्रिय उपकरण (स्वत: पूर्ण और कॉल टिप्स, स्थिर कोड विश्लेषण, आदि पीपी) के साथ आईडीई को दुखी कर सकते हैं। कोड के टुकड़े की भावना बनाना काफी कठिन है, लेकिन यह कोड और भी बदतर हो जाता है यदि यह कोड निष्पादित रूप से पहुंचने से पहले, और संभवतः बहुत भारी रूप से परिवर्तित हो जाएगा। सामान्य रूप से, कोड विश्लेषण उपकरण मैक्रोज़ का सामना नहीं कर सकते हैं। पूरा क्षेत्र इतना कठिन है कि clever people make up new languages for research on it and write papers on it neither of us can comprehend. तो ध्यान रखें कि मैक्रोज़ में डाउनसाइड्स हैं।

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