गतिशील प्रोग्रामिंग भाषा

From alpha
Jump to navigation Jump to search

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

अधिकांश गतिशील भाषाएँ भी गतिशील टाइपिंग हैं, लेकिन सभी नहीं हैं। गतिशील भाषाओं को अक्सर (लेकिन हमेशा नहीं) स्क्रिप्टिंग भाषाओं के रूप में संदर्भित किया जाता है, हालांकि यह शब्द अपने सबसे छोटे अर्थों में किसी दिए गए रन-टाइम वातावरण के लिए विशिष्ट भाषाओं को संदर्भित करता है।

कार्यान्वयन


इवल

कुछ गतिशील भाषाएँ एक स्पष्ट कार्य प्रदान करती हैं। यह फ़ंक्शन भाषा में कोड युक्त एक स्ट्रिंग या सार वाक्य रचना का पेड़ लेता है और इसे निष्पादित करता है। यदि यह कोड किसी व्यंजक का प्रतिनिधित्व करता है, तो परिणामी मान दिया जाता है। एरिक मीजेर (कंप्यूटर वैज्ञानिक) और पीटर ड्रैटन साझा पुस्तकालयों द्वारा प्रस्तावित गतिशील लोडिंग से eval द्वारा प्रस्तावित रनटाइम कोड पीढ़ी को अलग करते हैं, और चेतावनी देते हैं कि कई मामलों में eval का उपयोग केवल उच्च-क्रम के कार्यों को लागू करने के लिए किया जाता है (कार्यों को तार के रूप में पारित करके) या अक्रमांकन[1]


ऑब्जेक्ट रनटाइम परिवर्तन

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

अनुमान टाइप करें

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

परिवर्तनीय स्मृति आवंटन

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

प्रतिबिंब

परावर्तन (कंप्यूटर विज्ञान) कई गतिशील भाषाओं में आम है, और आम तौर पर जेनेरिक या टाइप बहुरूपता डेटा के प्रकार और मेटाडेटा का आत्मनिरीक्षण (कंप्यूटर विज्ञान) शामिल होता है। हालाँकि, इसमें डेटा के रूप में प्रोग्राम के कोड का पूर्ण मूल्यांकन और संशोधन भी शामिल हो सकता है, जैसे कि लिस्प s-भाव का विश्लेषण करने में प्रदान करता है।

मैक्रोज़

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

सभा की भाषा, सी (प्रोग्रामिंग लैंग्वेज), सी ++, शुरुआती जावा (प्रोग्रामिंग भाषा), और फोरट्रान आमतौर पर इस श्रेणी में नहीं आते हैं।[clarification needed]


उदाहरण कोड

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

रनटाइम और लेट बाइंडिंग पर कोड की गणना

उदाहरण दिखाता है कि गणना किए गए स्रोत कोड से रनटाइम पर फ़ंक्शन को कैसे संशोधित किया जा सकता है

<वाक्यविन्यास प्रकाश लैंग = लिस्प>

स्रोत कोड को एक चर में डेटा के रूप में संग्रहीत किया जाता है

CL-USER > (डिफपैरामीटर *सर्वश्रेष्ठ-अनुमान-सूत्र* '(लैम्ब्डा (x) (* x x 2.5)))

  • सर्वश्रेष्ठ-अनुमान-सूत्र*
एक फ़ंक्शन कोड से बनाया गया है और रनटाइम पर संकलित किया गया है, फ़ंक्शन बेस्ट-अनुमान नाम के तहत उपलब्ध है

CL-USER > (संकलित करें 'सर्वश्रेष्ठ-अनुमान *सर्वश्रेष्ठ-अनुमान-सूत्र*)

  1. <फंक्शन 15 40600152F4>
समारोह कहा जा सकता है

CL-USER> (उत्तम-अनुमान 10.3) 265.225

रनटाइम पर स्रोत कोड में सुधार किया जा सकता है

CL-USER > (सेटफ *सर्वश्रेष्ठ-अनुमान-सूत्र* `(लैम्ब्डा (x) ,(सूची 'sqrt (तीसरा *सर्वश्रेष्ठ-अनुमान-सूत्र*)))) (लैम्ब्डा (एक्स) (एसक्यूआरटी (* एक्स एक्स 2.5)))

समारोह का एक नया संस्करण संकलित किया जा रहा है

CL-USER > (संकलित करें 'सर्वश्रेष्ठ-अनुमान *सर्वश्रेष्ठ-अनुमान-सूत्र*)

  1. <फंक्शन 16 406000085C>
अगली कॉल नए फ़ंक्शन को कॉल करेगी, लेट बाइंडिंग की एक विशेषता

CL-USER> (उत्तम-अनुमान 10.3) 16.28573 </वाक्यविन्यास हाइलाइट>

ऑब्जेक्ट रनटाइम परिवर्तन

यह उदाहरण दिखाता है कि कैसे एक मौजूदा उदाहरण को एक नया स्लॉट शामिल करने के लिए बदला जा सकता है जब इसकी कक्षा बदलती है और एक मौजूदा विधि को एक नए संस्करण से बदला जा सकता है।

<वाक्यविन्यास प्रकाश लैंग = लिस्प>

एक व्यक्ति वर्ग। व्यक्ति का एक नाम होता है।

सीएल-उपयोगकर्ता> (डिफक्लास व्यक्ति () ((नाम: initarg: नाम)))

  1. <मानक-श्रेणी के व्यक्ति 4020081FB3>
वर्ग व्यक्ति की वस्तुओं के लिए एक कस्टम मुद्रण विधि

सीएल-उपयोगकर्ता> (डिफमेथोड प्रिंट-ऑब्जेक्ट ((पी व्यक्ति) स्ट्रीम)

           (प्रिंट-अपठनीय-ऑब्जेक्ट (पी स्ट्रीम: टाइप टी)
             (प्रारूप स्ट्रीम ~a (स्लॉट-मान p 'नाम))))
  1. <मानक-विधि प्रिंट-वस्तु शून्य (व्यक्ति टी) 4020066E5B>
एक उदाहरण व्यक्ति उदाहरण

CL-USER > (सेटफ *व्यक्ति-1* (मेक-इंस्टेंस 'व्यक्ति: नाम ईवा लुएटर))

  1. <व्यक्ति ईवा लुएटर>
वर्ग के व्यक्ति को दूसरा स्लॉट मिलता है। इसके बाद स्लॉट का नाम और उम्र होती है।

CL-USER > (defclass person () ((नाम :initarg :name) (आयु :initarg :age :initform :unknown)))

  1. <मानक-श्रेणी के व्यक्ति 4220333E23>
वस्तु को प्रिंट करने की विधि को अद्यतन करना

सीएल-उपयोगकर्ता> (डिफमेथोड प्रिंट-ऑब्जेक्ट ((पी व्यक्ति) स्ट्रीम)

           (प्रिंट-अपठनीय-ऑब्जेक्ट (पी स्ट्रीम: टाइप टी)
             (प्रारूप धारा ~ एक उम्र: ~ (स्लॉट-वैल्यू पी 'नाम) (स्लॉट-वैल्यू पी' उम्र)))
  1. <मानक-विधि प्रिंट-वस्तु शून्य (व्यक्ति टी) 402022ADE3>
मौजूदा ऑब्जेक्ट अब बदल गया है, इसमें एक अतिरिक्त स्लॉट और एक नया प्रिंट तरीका है

सीएल-यूजर > *व्यक्ति-1*

  1. <व्यक्ति ईवा लुएटर उम्र: अज्ञात>
हम उदाहरण के लिए नए आयु स्लॉट सेट कर सकते हैं

सीएल-यूज़र> (सेटफ़ (स्लॉट-वैल्यू *व्यक्ति-1* 'उम्र) 25) 25

वस्तु को अद्यतन किया गया है

सीएल-यूजर > *व्यक्ति-1*

  1. <व्यक्ति ईवा लुएटर उम्र: 25>

</वाक्यविन्यास हाइलाइट>

उदाहरणों के वर्ग के आधार पर रनटाइम पर कोड का कोडांतरण

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

<वाक्यविन्यास प्रकाश लैंग = लिस्प>

वर्ग व्यक्ति

सीएल-उपयोगकर्ता> (डिफक्लास व्यक्ति () ((नाम: initarg: नाम)))

  1. <मानक-श्रेणी के व्यक्ति 4220333E23>
एक व्यक्ति सिर्फ अपना नाम प्रिंट करता है

सीएल-उपयोगकर्ता> (डिफमेथोड प्रिंट-ऑब्जेक्ट ((पी व्यक्ति) स्ट्रीम)

           (प्रिंट-अपठनीय-ऑब्जेक्ट (पी स्ट्रीम: टाइप टी)
             (प्रारूप स्ट्रीम ~a (स्लॉट-मान p 'नाम))))
  1. <मानक-विधि प्रिंट-वस्तु शून्य (व्यक्ति टी) 40200605AB>
एक व्यक्ति उदाहरण

CL-USER > (डिफपैरामीटर * व्यक्ति -1 * (मेक-इंस्टेंस 'व्यक्ति: नाम ईवा लुएटर))

  • व्यक्ति-1*
एक व्यक्ति उदाहरण प्रदर्शित करना

सीएल-यूजर > *व्यक्ति-1*

  1. <व्यक्ति ईवा लुएटर>
अब एक्स्टेंसिबल होने के लिए प्रिंट पद्धति को फिर से परिभाषित करना
आसपास की विधि प्रिंट विधि के लिए संदर्भ बनाती है और यह अगली विधि को कॉल करती है

सीएल-उपयोगकर्ता> (डिफमेथोड प्रिंट-ऑब्जेक्ट: चारों ओर ((पी व्यक्ति) स्ट्रीम)

           (प्रिंट-अपठनीय-ऑब्जेक्ट (पी स्ट्रीम: टाइप टी)
             (कॉल-नेक्स्ट-मेथड)))
  1. <मानक-विधि प्रिंट-ऑब्जेक्ट (:अराउंड) (व्यक्ति टी) 4020263743>
प्राथमिक विधि नाम प्रिंट करती है

सीएल-उपयोगकर्ता> (डिफमेथोड प्रिंट-ऑब्जेक्ट ((पी व्यक्ति) स्ट्रीम)

           (प्रारूप स्ट्रीम ~a (स्लॉट-मान p 'नाम)))
  1. <मानक-विधि प्रिंट-वस्तु शून्य (व्यक्ति टी) 40202646BB>
एक नया वर्ग आईडी-मिक्सिन एक आईडी प्रदान करता है

सीएल-उपयोगकर्ता> (डीफक्लास आईडी-मिक्सिन () ((आईडी: initarg: आईडी)))

  1. <मानक-वर्ग आईडी-मिक्सिन 422034A7AB>
प्रिंट विधि केवल आईडी स्लॉट के मान को प्रिंट करती है

CL-USER> (डिफमेथोड प्रिंट-ऑब्जेक्ट: के बाद ((ऑब्जेक्ट आईडी-मिक्सिन) स्ट्रीम)

         (प्रारूप स्ट्रीम आईडी: ~a (स्लॉट-वैल्यू ऑब्जेक्ट 'आईडी)))
  1. <मानक-विधि प्रिंट-ऑब्जेक्ट (:बाद) (आईडी-मिक्सिन टी) 4020278E33>
अब हम मिक्सिन आईडी-मिक्सिन को शामिल करने के लिए क्लास पर्सन को फिर से परिभाषित करते हैं

सीएल-यूजर 241> (डीफक्लास व्यक्ति (आईडी-मिक्सिन) ((नाम: initarg: नाम)))

  1. <मानक-श्रेणी के व्यक्ति 4220333E23>
मौजूदा उदाहरण *व्यक्ति-1* के पास अब एक नया स्लॉट है और हम इसे 42 पर सेट करते हैं

सीएल-यूजर 242 > (सेटफ (स्लॉट-वैल्यू *पर्सन-1* 'आईडी) 42) 42

वस्तु को फिर से प्रदर्शित करना। प्रिंट-ऑब्जेक्ट फ़ंक्शन में अब एक प्रभावी विधि है, जो तीन विधियों को कॉल करती है
एक आस-पास विधि, प्राथमिक विधि और बाद की विधि।

सीएल-यूजर 243 > *व्यक्ति-1*

  1. <व्यक्ति ईवा लुएटर आईडी: 42>

</वाक्यविन्यास हाइलाइट>

उदाहरण

लोकप्रिय गतिशील प्रोग्रामिंग भाषाओं में जावास्क्रिप्ट, पायथन (प्रोग्रामिंग भाषा), रूबी (प्रोग्रामिंग भाषा), PHP, लुआ (प्रोग्रामिंग भाषा) और पर्ल शामिल हैं। निम्नलिखित को आमतौर पर गतिशील भाषा माना जाता है:

यह भी देखें

संदर्भ

  1. Meijer, Erik and Peter Drayton (2005), Static Typing Where Possible, Dynamic Typing When Needed: The End of the Cold War Between Programming Languages (PDF), Microsoft Corporation, CiteSeerX 10.1.1.69.5966
  2. Chapter 24. Dynamic language support. Static.springsource.org. Retrieved on 2013-07-17.
  3. < "Groovy - Home". Archived from the original on 2014-03-02. Retrieved 2014-03-02.


अग्रिम पठन


बाहरी संबंध

(Many use the term "scripting languages".)