विस्तारयोग्य प्रोग्रामिंग

एक्स्टेंसिबल प्रोग्रामिंग कंप्यूटर विज्ञान, में कंप्यूटर प्रोग्रामिंग की एक कवची का वर्णन करने के लिए प्रयोग किया जाने वाला एक शब्द है जो प्रोग्रामिंग भाषा, संकलक तथा रन-टाइम सिस्टम को विस्तारित करने वाले तंत्रों पर केंद्रित है। प्रोग्रामिंग की इस कवची का समर्थन करने वाली एक्स्टेंसिबल प्रोग्रामिंग भाषा, 1960 के दशक में कार्य का एक सक्रिय क्षेत्र थी, परंतु 1970 के दशक में यह आंदोलन उपेक्षित हो गया। एक्स्टेंसिबल प्रोग्रामिंग 21वीं शताब्दी में नए सिरे से रुचि का विषय बन गया है।

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

ऐतिहासिक आंदोलन का चरित्र
सामान्यतः योजित, एक विस्तारयोग्य प्रोग्रामिंग भाषा में एक मूल भाषा होती थी जो प्राथमिक कम्प्यूटिंग सुविधाएँ प्रदान करती थी, और एक मेटा-भाषा होती थी जो मूल भाषा को संशोधित करने की क्षमता रखती थी। उस समय किसी प्रोग्राम में मेटा-भाषा की संशोधन और संशोधित मूल भाषा में कोड सम्मिलित होता था।

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

स्टैंडिश ने भाषा विस्तार के तीन वर्गों का वर्णन किया है, जिसे उन्होंने पैराफ्रेज़, ऑर्थोफ्रेज और मेटाफ्रेज कहा है।


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

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

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

आधुनिक आंदोलन
आधुनिक संदर्भ में, विस्तारयोग्य प्रोग्रामिंग का समर्थन करने वाली एक सिस्टम निम्नलिखित विशेषताओं का समर्थन प्रदान करेगी:

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

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

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

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

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

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

उदाहरण

 * कैमलप4
 * फेलिक्स
 * नेमर्ले
 * बीज7
 * रिबोल
 * लाल (प्रोग्रामिंग भाषा)
 * रूबी (प्रोग्रामिंग भाषा) (मेटाप्रोग्रामिंग)
 * आईएमपी (प्रोग्रामिंग भाषा)
 * ओपन सी ++
 * एक्सएल (प्रोग्रामिंग भाषा)
 * एक्सएमएल
 * फोर्थ (प्रोग्रामिंग भाषा)
 * लिस्प (प्रोग्रामिंग भाषा)
 * रैकेट (प्रोग्रामिंग भाषा)
 * योजना (प्रोग्रामिंग भाषा)
 * लुआ (प्रोग्रामिंग भाषा)
 * पीएल/आई
 * गपशप

यह भी देखें

 * अनुकूली व्याकरण
 * अवधारणा प्रोग्रामिंग
 * बोली लगाना
 * व्याकरण उन्मुख प्रोग्रामिंग
 * भाषा उन्मुख प्रोग्रामिंग
 * समजातीयता

सामान्य

 * 1) एसीएम कतार में ग्रेग विल्सन का लेख
 * 2) Slashdot चर्चा
 * 3) आधुनिक एक्स्टेंसिबल भाषा - डेनियल जिप्सी का एक पेपर

उपकरण

 * 1) मेटाएल - January/000019.html एक एक्स्टेंसिबल प्रोग्रामिंग कंपाइलर इंजन कार्यान्वयन
 * 2) XPS - एक्स्टेंसिबल प्रोग्रामिंग सिस्टम (विकास में)
 * 3)  — JetBrains मेटाप्रोग्रामिंग सिस्टम

एक्स्टेंसिबल सिंटैक्स
के साथ प्रोग्रामिंग भाषाएं
 * 1) OpenZz
 * 2) xtc — एक्सटेन्सिबल सी
 * 3) English-script
 * 4) Nemerle Macros
 * 5) बू सिंटैक्टिक मैक्रोज़
 * 6) स्टैनफोर्ड यूनिवर्सिटी इंटरमीडिएट फॉर्मेट कंपाइलर
 * 7) Seed7 - एक्सटेंसिबल प्रोग्रामिंग भाषा
 * 8) Katahdin - सिंटैक्स और शब्दार्थ के साथ एक प्रोग्रामिंग भाषा जो रनटाइम पर परिवर्तनशील होती है
 * 9) π - एक्सटेंसिबल सिंटैक्स के साथ एक अन्य प्रोग्रामिंग भाषा, जिसे अर्ली पार्सर का उपयोग करके लागू किया गया है

श्रेणी:एक्स्टेंसिबल सिंटैक्स प्रोग्रामिंग भाषा श्रेणी:प्रोग्रामिंग प्रतिमान