यह सवालों की एक श्रृंखला का हिस्सा है जो एब्सट्रैक्शन प्रोजेक्ट नामक एक परियोजना पर केंद्रित है, जिसका उद्देश्य भाषा के डिजाइन में उपयोग की जाने वाली अवधारणाओं को एक रूपरेखा के रूप में अमूर्त करना है।
संरचनात्मक टाइपिंग से संबंधित एक अन्य पेज यहां देखा जा सकता है । रूपरेखा के बारे में पूछताछ और पोस्ट करने के उचित स्थान के बारे में मेटा-विषय यहां पाया जा सकता है ।
भाषा विकास फ्रेमवर्क का उपयोग करना कितना आसान होना चाहिए?
मैंने बड़े पैमाने पर कोड जनरेशन फ्रेमवर्क लिखे हैं जिसमें परिणाम को भाषा-विशिष्ट संकलक को भेजने की क्षमता भी शामिल है। उपयोग में आसानी का विषय एक ऐसे फ्रेमवर्क उदाहरण से आता है: कोडडॉम, या कोड डॉक्यूमेंट ऑब्जेक्ट मॉडल।
यह Microsoft द्वारा लिखा गया एक ढाँचा है जो सामान्य कोड संरचनाओं का वर्णन करता है, लेकिन आम तौर पर बहुत कुछ छोड़ देता है (अभिव्यक्ति coercions) और कुछ निर्माणों के अपने प्रतिनिधित्व में थोड़ा सार होने के लिए, जो आप कर रहे थे, उसके आधार पर खराब कोड को छोड़ देना। कोडडॉम खराब तरीके से उत्सर्जित PrivateImplementationType
होता है CodeMemberMethod
, जब इस्तेमाल किया जाने वाला एक सामान्य इंटरफ़ेस था। कोडडॉम मेरा पहला कोड जनरेटर लिखने का मेरा मूल कारण था।
एक चीज जो मैं करने की कोशिश कर रहा हूं, वह है कि फ्रेमवर्क को सरल बनाना, काम की मात्रा को कम करना जो आपको कुछ करने की आवश्यकता है, और उन कार्यों को बनाने वाले विशिष्ट प्रकारों पर ध्यान केंद्रित करना।
यहाँ एक पक्ष द्वारा की तुलना में मैं कैसे काम कर रहा हूँ रूपरेखा है:
//Truncated...
/* *
* From a project that generates a lexer, this is the
* state->state transition character range selection logic.
* */
var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference()));
//...
char start = rangeElement.B.Value.Start;
char end = rangeElement.B.Value.End;
/* *
* 'start' <= nextChar && nextChar <= 'end'
* */
currentExpression = start.LessThanOrEqualTo(nextChar).LogicalAnd(nextChar.LessThanOrEqualTo(end));
बनाम कोडम:
//Truncated...
var nextChar = new CodeVariableReferenceExpression("nextChar");
//...
var start = new CodePrimitiveExpression(rangeElement.B.Value.Start);
var end = new CodePrimitiveExpression(rangeElement.B.Value.End);
currentExpression = new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(start, CodeBinaryOperatorType.LessThanOrEqual, nextChar), CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(nextChar, CodeBinaryOperatorType.LessThanOrEqual, end));
फ्रेमवर्क का फोकस भाषा के प्रति उत्साही है, साथ ही कोड या एप्लिकेशन बनाने में रुचि रखने वालों के लिए भी है। संकलन, कोड पीढ़ी और भाषा के विकास पर अपना ध्यान केंद्रित करते हुए, क्या ढांचे का उपयोग या कच्ची शक्ति में आसानी पर ध्यान देना चाहिए?
मेरा प्राथमिक लक्ष्य ऐसे उपकरणों की उपलब्धता को बढ़ाना है, इसलिए डोमेन में रुचि रखने वालों को भाषा सिद्धांत डोमेन में बहुत अधिक अनुभव की आवश्यकता नहीं है इससे पहले कि वे अपनी भाषा-केंद्रित परियोजनाओं पर काम करना शुरू कर सकें।
यह देखते हुए कि मैं रूपरेखा का लेखक हूं, "प्रयोज्य" का मेरा दृष्टिकोण पक्षपाती है। इस प्रकार, मुझे एक और पूछना चाहिए अगर फोकस और लक्ष्य उन लोगों के लिए समझ में आता है जो परियोजना से जुड़े नहीं हैं।