क्या कोई वैयक्तिकृत प्रोग्रामिंग भाषा है जिसका उपयोग आप दूसरों को बदलने के लिए कर सकते हैं?


13

क्या कोई प्रोग्रामिंग भाषा है जिसमें आप अपने स्वयं के सिंटैक्स कॉन्फ़िगरेशन सेट कर सकते हैं और यह कोड को आपके द्वारा चुनी गई भाषा में बदल देगा?

उदाहरण के लिए, आप "पाइथन के अनुक्रमित ब्लॉक" जैसे विशिष्ट कॉन्फ़िगरेशन का चयन करेंगे [a,b,c], ^एक्सप्रेशन और अन्य लोगों के लिए सरणियों को इनिशियलाइज़ करते हैं। एक स्क्रिप्ट इसे आपकी पसंद की भाषा के समकक्ष में बदल देती है।


1
मुझे यकीन है कि आशा नहीं है। TIMTOWTDI यकीनन बुरा है, लेकिन "जितने आप चाहते हैं उतने असंगत तरीके से आविष्कार करें" निश्चित रूप से सौ बार एक ही डाउनसाइड होगा, और इससे भी कम उपयोगी होगा। डीएसएल कभी-कभी इसके लायक होते हैं, लेकिन सिंटैक्स के आधे हिस्से को पुनर्परिभाषित करते हैं (या इससे भी बदतर - दो ऑपरेटरों की अदला

मैं यह पूछता हूं क्योंकि विशिष्ट रूप से मैं जावास्क्रिप्ट पर प्रोग्रामिंग कर रहा हूं और वास्तव में, वास्तव में मेरे कोड पर कुछ सिंटैक्स शर्करा स्थापित करने में सक्षम होना चाहता हूं, लेकिन भाषा अभी इसकी अनुमति नहीं देगी। ऑपरेटर ओवरलोडिंग भी संभव नहीं है।
डॉकटक

2
कुछ हद तक, आप प्रीप्रोसेसर मैक्रोज़ जैसी ध्वनियों का वर्णन कर रहे हैं । अब अगर केवल हम perl के लिए एक समान सुविधा हो सकती है ...
yannis

5
@ डॉककट: कृपया विशेष रूप से यह बताने के लिए कि यह जावास्क्रिप्ट के बारे में है, इस सवाल को अपडेट करें । सवाल - जैसा कि पूछा गया है - एक दुःस्वप्न का रखरखाव और समर्थन है। मौजूदा भाषा में नया वाक्यविन्यास जोड़ना (या अपनी निजी भाषा को सार्वजनिक भाषा में बदलने के लिए पूर्व-प्रोसेसर का उपयोग करना) वास्तव में भयानक है। तथापि। यदि आप विशिष्ट जावास्क्रिप्ट सिंटैक्स चीनी मुद्दों को सूचीबद्ध करते हैं, तो आपको विशिष्ट सहायता मिल सकती है ।
S.Lott

3
इन "व्यक्तिगत प्रोग्रामिंग भाषाओं" को आमतौर पर "डोमेन विशिष्ट भाषाएं" या डीएसएल कहा जाता है।
माइकल डिलन

जवाबों:


14

हां, लेकिन शायद उस तरीके से नहीं जैसा आप सोच रहे हैं।

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


8
मैं किसी भी तरह पता था कि पर्ल जवाब (का हिस्सा) होगा। मुझे लगता है कि सी प्रीप्रोसेसर मैक्रोज़ विवरण को एक छोटे से विस्तार के लिए भी फिट करते हैं।
यानिस २१'११

इसके अलावा C ++ में ऑपरेटर ओवरलोडिंग अच्छा हो सकता है। हैलो वर्ल्ड का उदाहरण दिमाग में आता है। cout << "हाय";
लॉर्ड टाइडस 15

@LordTydus: वास्तव में, और यहां तक ​​कि सिर्फ ऑपरेटर ओवरलोडिंग आपको एक सेंस इंटरफ़ेस के पीछे काफी जादू कर सकता है। यह अच्छा होगा यदि C ++ में अधिक सामान्य ओवरलोडिंग क्षमताएं हैं, कहते हैं, operator[]कई तर्कों के लिए ओवरलोडिंग , या नए ऑपरेटरों को हास्केल के रूप में पेश करना; लेकिन मुझे संदेह है कि समिति पार्सिंग मुद्दों को देखेगी।
जॉन पुरडी

3

कॉन्सेप्ट प्रोग्रामिंग की तरह लगता है ।

मैं इससे परिचित नहीं हूं, लेकिन एक्स्ट्रा लार्ज एक भाषा है जिसे विशेष रूप से इसके लिए डिज़ाइन किया गया है।

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

लिस्प और फोर्थ भी अवधारणा प्रोग्रामिंग का समर्थन करते हैं, हालांकि एक्सएल से कम। मैं लिस्प का सुझाव देता हूं क्योंकि यह बहुत व्यावहारिक और प्रभावी है। सबसे महत्वपूर्ण बात एक स्पष्ट और लचीला वाक्यविन्यास है, न कि संकेतन, जो लिस्प प्रदान करता है।


उदाहरण के लिए, आप विशिष्ट विन्यास चुनेंगे जैसे "पायथन के अनुक्रमित ब्लॉक", "[a, b, c]" घातांक और अन्य के लिए "^" को प्रारंभ करता है।

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


यह वही है जिसे मैं देख रहा था।
Dokkat

2

मेरी जानकारी मे नहीं।

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

निकटतम चीज जो मौजूद है वह संभवतः लिस्प होगी, जहां मैक्रो सिस्टम आपको बहुत ही लचीले तरीके से अपनी नई भाषा के निर्माण को लिखने देता है। आम तौर पर आप अभी भी लिस्प सिंटैक्स के साथ चिपके रहेंगे, लेकिन यदि आप वास्तव में चाहते हैं तो आप हर चीज को प्रभावी ढंग से फिर से परिभाषित कर सकते हैं।

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


2

Scala को अक्सर इस तरह से DSLs, Domain Specific Language बनाने के लिए इस्तेमाल किया जाता है।

मुख्य रूप से इसका कारण यह है कि स्काला के पास कोई ऑपरेटर नहीं है, और वाक्य रचना को कॉल करने वाली स्काला पद्धति को संक्षिप्त किया जा सकता है। उदाहरण के लिए:

5 एक पूर्णांक वस्तु है। 5 प्लस 7 की गणना करने के लिए आप लिख सकते हैं

वैल ans = 5.add (7) सिवाय इसके कि अतिरिक्त विधि को वास्तव में "+" नाम दिया गया है ताकि आप लिख सकें:

वैल ans = 5। + (7) लेकिन स्काला में, आपको "शामिल करने की आवश्यकता नहीं है।" विधि कॉल या कोष्ठक में "()" तर्क 5 के आसपास तो ऑब्जेक्ट 5 पर + विधि को कॉल करने के लिए, आप लिखेंगे

वैल ans = 5 + 7 जो पूरी तरह से काम करता है क्योंकि स्काला के पास आपके चतुर नामकरण योजना में हस्तक्षेप करने के लिए कोई ऑपरेटर नहीं है। अब उस विचार को अपनी अपनी कक्षाओं और वस्तुओं तक विस्तारित करें, इस तथ्य सहित कि आप + जैसे तरीकों को "ओवरराइड" कर सकते हैं और साथ ही >>> या :: नाम से अपनी खुद की विधियाँ बना सकते हैं! या @ * @ या सिर्फ सादे पाठ नाम जैसे fancify।


यह कमाल का है। मैं स्कैला पर एक नज़र डालूँगा।
Dokkat

1

यह कहते हुए कि आपको इसका उपयोग नहीं करना चाहिए क्योंकि यह अभी भी ज्यादातर प्रायोगिक है, लेकिन हाल ही में एक प्रोग्रामिंग प्रोग्रामिंग प्रतिमान भाषा ओरिएंटेड प्रोग्रामिंग (एलओपी) है।

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

सर्गेई दिमित्रिक इसे और अधिक विस्तार से बताते हैं

यह उस की विचारधारा है, लेकिन व्यावहारिक रूप से यह उबलता है कि यह उस व्यवहार का समर्थन करता है जिसे आप पूछ रहे हैं। आप ऐसा कर सकते हैं:

  • मौजूदा भाषा का विस्तार करें।
  • विभिन्न भाषाओं की रचना करें।
  • अपने नए परिभाषित खोजशब्दों को आधार भाषा में बदलने के लिए एक मौजूदा 'परिवर्तन भाषा' का प्रयोग करें।

इस प्रतिमान का अनुसरण करने के बारे में मुझे पता है कि सबसे सक्रिय प्रोग्रामिंग वातावरण JetBrains द्वारा मुफ्त मेटा प्रोग्रामिंग सिस्टम (MPS) है।

यह वास्तव में वाणिज्यिक सॉफ्टवेयर में भी इस्तेमाल किया जाने लगा है, इसलिए शायद यह 'प्रायोगिक' चरण से बाहर निकलना शुरू हो रहा है:

  • Realaxy एक एक्शनस्क्रिप्ट एडिटर है जो पूरी तरह से एमपीएस के शीर्ष पर बनाया गया है। एलओपी की शक्ति का उपयोग करके वे AS3 के लिए उदाहरण के बंद होने को लागू करने में सक्षम थे।
  • mbeddr C MPS पर आधारित एक एक्स्टेंसिबल C भाषा है।

1

TCL समुदाय में डोमेन-विशिष्ट भाषाओं का काफी उपयोग किया जाता है। उदाहरण के लिए, एक Tcl प्रोग्राम को देखना बिल्कुल भी असामान्य नहीं है जिसमें C और SQL दोनों को एम्बेडेड DSLs (क्रिटक्कल और स्केलाइट पैकेज के माध्यम से) शामिल हैं। एक एम्बेडेड डीएसएल पर एकमात्र प्रतिबंध के बारे में यह है कि यह बेहतर है अगर एम्बेडेड भाषा अपने घुंघराले ब्रेस को संतुलित करती है, और यह अभ्यास में एक बहुत ही गैर-जरूरी आवश्यकता है!

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

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


0

AFAIU आप उन भाषाओं की तलाश में हैं जो आपको अपनी खुद की DSL (डोमेन विशिष्ट भाषा) लिखने में मदद कर सकें। कई अच्छे उम्मीदवार हैं। व्यक्तिगत रूप से मैं रूबी या Io की सिफारिश करूंगा, क्योंकि वे 1) आसान ऑपरेटर ओवरलोडिंग, 2) मेटा-प्रोग्रामिंग, और 3) फ़ॉलबैक तंत्र की पेशकश method_missingकरते हैं जैसे कि आप अपना खुद का एपीआई बनाने के लिए उपयोग कर सकते हैं। उदाहरण के लिए, स्क्विर्सल , रूबी में लिखे गए एक डीएसएल पर एक नज़र डालें जो रूबी कोड पढ़कर एसक्यूएल उत्पन्न करता है।


0

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

यह जावास्क्रिप्ट के लिए एक व्याकरण उपलब्ध है प्रतीत होता है । लेकिन, पहले इसका इस्तेमाल नहीं करने पर, मुझे यकीन नहीं है कि यह आपकी मदद कैसे करेगा।


0

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


यहाँ कुछ लिंक: PPWIZARD सामग्री (आधिकारिक डॉक्स), PPWizard - EDM2 (एक बाहरी रेफरी)। उपकरण शक्तिशाली है, लेकिन इसके प्रलेखन को पढ़ना आसान नहीं है (शायद इसकी शक्ति के कारण)।
वुल्फ

0

हो सकता है कि आप जो देख रहे हों वह कंपाइलर कंपाइलर के रूप में हो। एक कंपाइलर कंपाइलर एक औपचारिक भाषा में लिखी गई भाषा की परिभाषा लेता है और इस भाषा के लिए एक कंपाइलर बनाता है।

Http://en.wikipedia.org/wiki/Compiler-compiler पर एक नज़र डालें


0

प्रोग्रामिंग भाषा को आंशिक रूप से निजीकृत करने का एक सामान्य तरीका एक मैक्रो प्री-प्रोसेसर का उपयोग करना है। उदाहरण के लिए, आप "डॉक्कट-लैंग" चला सकते हैं, हालांकि सी प्रीप्रोसेसर परिणाम डालने से पहले जहां कुछ जावास्क्रिप्ट पर्यावरण इसे डाउनलोड करेगा।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.