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

विस्तारयोग्य प्रोग्रामिंग कंप्यूटर विज्ञान, में कंप्यूटर प्रोग्रामिंग की एक शैली का वर्णन करने के लिए प्रयोग किया जाने वाला एक शब्द है जो प्रोग्रामिंग भाषा, संकलक तथा रन-टाइम सिस्टम को विस्तारित करने वाले तंत्रों पर केंद्रित है। प्रोग्रामिंग की इस कवची का समर्थन करने वाली विस्तारयोग्य प्रोग्रामिंग भाषा, 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) π - एक्सटेंसिबल सिंटैक्स के साथ एक अन्य प्रोग्रामिंग भाषा, जिसे अर्ली पार्सर का उपयोग करके लागू किया गया है

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