एक भाषा विकास ढांचे का उपयोग करना कितना आसान होना चाहिए?


11

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

संरचनात्मक टाइपिंग से संबंधित एक अन्य पेज यहां देखा जा सकता है । रूपरेखा के बारे में पूछताछ और पोस्ट करने के उचित स्थान के बारे में मेटा-विषय यहां पाया जा सकता है

भाषा विकास फ्रेमवर्क का उपयोग करना कितना आसान होना चाहिए?

मैंने बड़े पैमाने पर कोड जनरेशन फ्रेमवर्क लिखे हैं जिसमें परिणाम को भाषा-विशिष्ट संकलक को भेजने की क्षमता भी शामिल है। उपयोग में आसानी का विषय एक ऐसे फ्रेमवर्क उदाहरण से आता है: कोडडॉम, या कोड डॉक्यूमेंट ऑब्जेक्ट मॉडल।

यह 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));

फ्रेमवर्क का फोकस भाषा के प्रति उत्साही है, साथ ही कोड या एप्लिकेशन बनाने में रुचि रखने वालों के लिए भी है। संकलन, कोड पीढ़ी और भाषा के विकास पर अपना ध्यान केंद्रित करते हुए, क्या ढांचे का उपयोग या कच्ची शक्ति में आसानी पर ध्यान देना चाहिए?

मेरा प्राथमिक लक्ष्य ऐसे उपकरणों की उपलब्धता को बढ़ाना है, इसलिए डोमेन में रुचि रखने वालों को भाषा सिद्धांत डोमेन में बहुत अधिक अनुभव की आवश्यकता नहीं है इससे पहले कि वे अपनी भाषा-केंद्रित परियोजनाओं पर काम करना शुरू कर सकें।

यह देखते हुए कि मैं रूपरेखा का लेखक हूं, "प्रयोज्य" का मेरा दृष्टिकोण पक्षपाती है। इस प्रकार, मुझे एक और पूछना चाहिए अगर फोकस और लक्ष्य उन लोगों के लिए समझ में आता है जो परियोजना से जुड़े नहीं हैं।


1
आपको यह सवाल codereview.stackexchange.com पर पूछना चाहिए ।
रॉबर्ट हार्वे

6
यह प्रश्न कि क्या कच्ची बिजली की कीमत पर एक फ्रेमवर्क का उपयोग आसान होना चाहिए, कोड रिव्यू के लिए बिल्कुल फिट नहीं दिखता है। जहां "उच्च स्तरीय वास्तुकला और सॉफ्टवेयर सिस्टम का डिजाइन" ऑन नहीं है- विषय यहाँ, और यहाँ विषय पर है। कोड की समीक्षा तब होती है जब आपके पास काम करने वाला कोड होता है और आप एक समालोचना चाहते हैं।

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

@kevincline कोड जनरेटर के लिए विशिष्ट उपयोग का मामला एक डोमेन विशिष्ट भाषा है जो सामान्य प्रयोजन कोड पीढ़ी के ढांचे का उपयोग करता है। यह वास्तव में बहुत पसंद नहीं है, विकल्प आपकी आंतरिक मध्यवर्ती भाषा को संकलित करना होगा और इसे वीएम के माध्यम से व्याख्या करना होगा, या खुद को निचले स्तर के निर्माण में अनुवाद करना होगा, लेकिन अंत में आप एक ही काम कर रहे हैं। । इस रूपरेखा का उद्देश्य है, जब आपको कोड को गतिशील रूप से उत्पन्न करने के लिए कार्य करने की आवश्यकता होती है, तो आप इस बनाम उसी चीज़ के अपने कार्यान्वयन को विंग करेंगे।
एलन क्लार्क कोपलैंड जूनियर

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

जवाबों:


2

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

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

यहाँ DMS पर एक तकनीकी पेपर है जैसा कि कई साल पहले था। (हम इसे सुधारते रहते हैं)

जबकि DMS का निर्माण करना कठिन रहा है, हमने पाया कि IBM के COBOL, C # 4.0, Java 1.7, C ++ 11 (और कई अन्य) सहित DMS के लिए वास्तविक लैंगगेज को परिभाषित करने के लिए इंजीनियरिंग का एक बड़ा हिस्सा लिया।

हम जो सोचते हैं वह (यथोचित रूप से) करता है: परिमाण के 1-2 आदेशों द्वारा उपकरण निर्माण की लागत को कम करना। इसका मतलब यह है कि कार्य जो 1-10 साल लग सकते हैं, उन्हें केवल 1 महीने-1 वर्ष की परियोजनाओं के रूप में मात्र नश्वर लोगों द्वारा माना जा सकता है। क्या अभी भी आसान नहीं है:

  • नई भाषाओँ को परिभाषित करना
  • वर्तमान भाषाओं के सभी मुहावरों को संभालना
  • कस्टम कोड को अपने कार्य के लिए विशिष्ट लिखना आसान बनाता है
  • नए, जटिल विश्लेषणों को परिभाषित करना
  • आंशिक कार्यक्रमों, या त्रुटियों वाले कार्यक्रमों को संभालना
  • (अपने प्रारंभिक बिंदु के लिए) इन उपकरणों का उपयोग करने के लिए कोई भी आसान नहीं है

इसलिए, सुधार के लिए बहुत जगह है। कई फूल खिलने दो।


0

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

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


इस उत्तर के साथ मेरा एकमात्र मुद्दा है, यह कोई वास्तविक मूल्य प्रदान नहीं करता है। क्या संदर्भ पुस्तक का एक भाग है और आपके विवरण से केवल सॉफ्टवेयर पैकेज जारी होने के बाद ही लागू होगा। यह मुझे रिलीज से पहले जवाब नहीं देता है, क्योंकि यह मूल रूप से कह रहा है 'यह अच्छा होगा अगर यह उपयोग करना आसान है और डोमेन के लिए प्रासंगिक है।' मैं यह नहीं कह सकता कि यह कितना अच्छा होगा क्योंकि यह अभी तक एक बिंदु पर नहीं है जहां आप इसका उपयोग कर सकते हैं। संकलक के साथ बात यह है कि आप बहुत सारे और बहुत सारे काम करते हैं, केवल यह महसूस करने के लिए कि आप केवल आधा रास्ता पहाड़ हैं, और यह आसान हिस्सा है।
एलन क्लार्क कोपलैंड जूनियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.