क्या प्रोग्राम लैंग्वेज इतनी निंदनीय हो सकती है कि प्रोग्राम्स को भाषा के शब्दार्थ को बढ़ाने की अनुमति दे सके


15

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

ex: रूबी एकाधिक वंशानुक्रम की अनुमति नहीं देती है, फिर भी मैं एकाधिक विरासत के कार्यान्वयन की अनुमति देने के लिए डिफ़ॉल्ट भाषा व्यवहार का विस्तार / ओवरराइड कर सकता हूं।

क्या कोई अन्य भाषाएं हैं जो इसे अनुमति देती हैं? क्या यह वास्तव में भाषा डिजाइनरों के लिए चिंता का विषय है? वेब अनुप्रयोग विकास के लिए रेल ढांचे के निर्माण के लिए माणिक का उपयोग करने के विकल्प को देखते हुए, इस तरह की भाषाएं विभिन्न प्रकार के अनुप्रयोगों के लिए डिजाइनिंग फ्रेमवर्क (या डीएसएल) की अनुमति देने के लिए बहुत शक्तिशाली हो सकती हैं।


2
क्या आप सिमेंटिक एक्सटेंशन स्कीम के हाइजीनिक मैक्रोज़ या न्यूजपेपर्स के प्रतिबिंब के रूप में गिनते हैं जो अपवादों को लाइब्रेरी कोड के रूप में लागू करने की अनुमति देते हैं? Perligata: Romana जैसे वाक्यात्मक एक्सटेंशन के बारे में क्या ?

ऐसा प्रतीत होता है कि यह अवधारणा के बजाय भाषाओं की सूची के लिए एक प्रश्न है। लंबित संपादन प्रश्न की दिशा बदल रहा है, मैं वस्तुतः ऑफटॉपिक के रूप में बंद करने के लिए वोट करता हूं।
राफेल

अगर मुझे सही तरीके से याद है, तो भी जावा को ऐसे फीचर्स मिलने वाले हैं, जो प्रोग्राम्स को टाइप सिस्टम का विस्तार करने की अनुमति देते हैं।
राफेल

1
@ राफेल, क्या आप जेएसआर 305 के बारे में सोच रहे हैं ? गिल्ड ब्राचा द्वारा जावा एनोटेशन को डिज़ाइन किया गया था, जिन्होंने समाचार पत्र को डिज़ाइन किया था जिसे मैंने नीचे अपने उत्तर में जोड़ा था और प्लग करने योग्य प्रकार की प्रणालियों को भी चैंपियन बनाया था । जेएसआर 305 आपूर्ति प्रणाली के एनोटेशन की तरह आपूर्ति करता है @Nullableऔर @NonNullजिनका उपयोग बाहरी चेकर्स जैसे फाइबग्यूस द्वारा किया जाता है।
माइक सैमुअल

अस्पष्ट है जिसका अर्थ "इसके शब्दार्थ का विस्तार करना" है। अगर मैं Boost.Spirit को देखता हूं , जो कि पहले से ही "विस्तारित शब्दार्थ" की मेरी व्यक्तिगत सीमा को पार कर रहा है: C ++ के गणितीय ऑपरेटरों को एक भाषा वाक्यविन्यास का वर्णन करने के लिए उपयोग किया जाता है, जो संकलक तब कहा भाषा के लिए एक पार्सर में बदल जाता है। मुझे पता है कि लैब चूहों द्वारा "भाषा के शब्दार्थों का विस्तार" करने का मतलब यह नहीं है, लेकिन मुझे लगता है कि यह बहुत प्रभावशाली है।
देवसोलर

जवाबों:


12

Converge में कुछ बहुत प्रभावशाली मेटा-प्रोग्रामिंग सुविधाएं हैं।

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

जो स्कीम से एक कदम ऊपर है हाइजीनिक मैक्रो जो संदर्भात्मक पारदर्शी मैक्रो परिभाषाओं की अनुमति देता है।

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


समाचार पत्र का प्रतिबिंब पुस्तकालय कोड के रूप में अपवादों को लागू करने की अनुमति देता है।

7.6 अपवाद हैंडलिंग

क्योंकि समाचारपत्र सक्रियण रिकॉर्ड (3.6) को चिंतनशील पहुंच (7.2) प्रदान करता है, अपवाद हैंडलिंग एक पुस्तकालय का मुद्दा है। मंच एक मानक पुस्तकालय प्रदान करेगा, जो अपवादों को फेंकने, पकड़ने और फिर से शुरू करने का समर्थन करता है, जितना कि स्मॉलटाक में।


पर्लीगेटा: रोमाना दर्शाता है कि एक भाषा पर पूरी तरह से नए वाक्यविन्यास को कैसे चमकाया जा सकता है।

इस पत्र में एक पर्ल मॉड्यूल का वर्णन किया गया है - लिंगुआ :: रोमाना :: पर्लीगाटा - जिससे लैटिन में पर्ल प्रोग्राम लिखना संभव हो जाता है।


तर्कपूर्ण रूप से महत्वपूर्ण नहीं है, PyPy उन भाषाओं के लिए एक दुभाषिया जनरेटर है, जिनके शब्दार्थ Python के एक उच्च-सांख्यिकीय-विश्लेषण योग्य उपसमुच्चय में निर्दिष्ट हैं, और वे इसका उपयोग Pyth में नए भाषा निर्माणों के साथ प्रयोग करने के लिए करते हैं जैसे थक्के जोड़ना में भाषा को करने के लिए करते हैं।


इसके अलावा ब्याज ओमेटा हो सकता है ।

यह शोध प्रबंध कंप्यूटर विज्ञान में प्रयोग पर केंद्रित है। विशेष रूप से, मैं दिखाऊंगा कि नई प्रोग्रामिंग भाषाओं और निर्माणों को विशेष रूप से प्रयोग का समर्थन करने के लिए डिज़ाइन किया गया है जो शोधकर्ताओं और प्रोग्रामर के समान काम को सरल बना सकते हैं।

मैं ऐसे काम प्रस्तुत करता हूं जो दो बहुत भिन्न प्रकार के प्रयोग को संबोधित करता है। With rst का उद्देश्य प्रोग्रामिंग भाषा शोधकर्ताओं को अपने विचारों के साथ प्रयोग करने में मदद करना है, जिससे उनके लिए नई प्रोग्रामिंग भाषाओं और मौजूदा भाषाओं के एक्सटेंशन को प्रोटोटाइप करना आसान हो जाता है। अन्य एक प्रोग्रामिंग प्रतिमान के रूप में प्रयोग की जांच करता है, विभिन्न कार्यक्रमों और संभावनाओं के साथ खुद को प्रयोग करने के लिए कार्यक्रमों को सक्षम करता है- दूसरे शब्दों में, यह क्या अगर के लिए भाषा समर्थन प्रदान करने का प्रयास है ...? या संभव दुनिया तर्क।

एलेक्स वॉर्थ के शोध प्रबंध जावास्क्रिप्ट + ओमेता में महत्वपूर्ण रूप से नए शब्दार्थ (दुनिया के माध्यम से व्यवहारिक शब्दार्थ) को परिभाषित करने के लिए एक ओमेटा का उपयोग करते हुए प्रदर्शित करता है।


8

"क्या यह सैद्धांतिक रूप से संभव है?"

निश्चित रूप से यह है। कोई हमेशा किसी भाषा ( दुभाषिया लिख ​​सकता हैएलएस ), और नई भाषा में लिखने कार्यक्रम। लोग अक्सर ऐसा नहीं करते हैं क्योंकि इस तरह के दुभाषिया को लिखने के लिए बहुत सारे काम शामिल हो सकते हैं और व्याख्या की अतिरिक्त परत के लिए एक प्रदर्शन हिट (10-100 का कारक) होगा।

एल को शक्तिशाली मेटाप्रोग्रामिंग सुविधाओं के साथ डिज़ाइन किया जा सकता है ताकि दुभाषियों को लागू करना आसान हो। स्कीम जैसी भाषाओं में यह होता है।

एक आंशिक मूल्यांकनकर्ता को लागू कर सकता है ताकि दुभाषिया को एक संकलक ( तक) में बदल दिया जा सकेएसएल ) । तब आपको प्रदर्शन हिट नहीं होता क्योंकि अतिरिक्त व्याख्या परत समाप्त हो जाती है।

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

वास्तव में, यह प्रोग्रामिंग भाषाओं के लिए "वर्चुअलाइजेशन" तकनीक है।


6

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

रूबी को लिस्प से बहुत प्रेरणा मिली, जिसमें प्रतिबिंबित करने की क्षमता और मेटाप्रोग्रामिंग शामिल है। बहुत सारी गतिशील रूप से टाइप की गई भाषाओं ने लिस्प से इस संबंध में प्रेरणा ली है। (स्टेटिक टाइपिंग चीजों को जटिल बनाता है, क्योंकि कई एक्सटेंशन मूल प्रकार प्रणाली में फिट नहीं होते हैं।)


4

अभी तक उत्तर / टिप्पणियों में उल्लेख नहीं किया गया है:

सर्वेक्षण:

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

तथा

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


1
कृपया प्रत्येक संदर्भ के लिए एक या दो संक्षेप वाक्य लिखें; शुद्ध लिंक संग्रह लगभग "अच्छे" उत्तर नहीं हैं।
राफेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.