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

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

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

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

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

कोई भी प्रोग्रामिंग भाषा जिसमें प्रोग्राम और डेटा अनिवार्य रूप से विनिमेय हैं, को एक विस्तारणीय [sic] भाषा के रूप में माना जा सकता है। ... इसे इस तथ्य से बहुत आसानी से देखा जा सकता है कि लिस्प का उपयोग वर्षों से विस्तारणीय भाषा के रूप में किया जाता रहा है। 

1969 के सम्मेलन में, शुरुआत  को एक एक्स्टेंसिबल प्रोग्रामिंग भाषा के रूप में प्रस्तुत किया गया था।

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


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

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

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

आधुनिक आंदोलन
आधुनिक अर्थ में, एक सिस्टम जो एक्स्टेंसिबल प्रोग्रामिंग का समर्थन करता है, नीचे वर्णित सभी सुविधाएँ प्रदान करेगा.

एक्स्टेंसिबल सिंटैक्स
इसका सीधा सा मतलब है कि संकलित की जाने वाली स्रोत भाषा बंद, निश्चित या स्थिर नहीं होनी चाहिए। स्रोत भाषा(ओं) में नए कीवर्ड्स, अवधारणाओं और संरचनाओं को जोड़ना संभव होना चाहिए। उपयोगकर्ता परिभाषित सिंटैक्स के साथ निर्माण को जोड़ने की अनुमति देने वाली भाषाओं में Coq शामिल है, रैकेट (प्रोग्रामिंग भाषा), Camlp4, OpenC++ (सॉफ़्टवेयर टूल)|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) π - एक्सटेंसिबल सिंटैक्स के साथ एक अन्य प्रोग्रामिंग भाषा, जिसे अर्ली पार्सर का उपयोग करके लागू किया गया है

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