बड़े कार्यक्रम के भीतर स्क्रिप्टिंग भाषा का उपयोग करना कब उपयोगी होगा?


70

मैंने C # में लिखे प्रोग्राम के अंदर, जावास्क्रिप्ट या पायथन (या कुछ) का उपयोग करते हुए लोगों की कई स्थितियों के बारे में सुना है। जब C # प्रोग्राम में कुछ करने के लिए JavaScript जैसी भाषा का उपयोग करना बेहतर होगा तो बस C # में कर रहे हैं?


1
कोई इस सवाल को कम क्यों करेगा? IMHO एक अच्छा सवाल है।
केके

28
यह सॉफ्टवेयर के बेतुके जटिल टुकड़ों को बनाने के लिए बहुत उपयोगी है जिन्हें इसे बनाए रखने के लिए महंगे सलाहकारों की आवश्यकता होती है, खासकर जब स्क्रिप्टिंग भाषा भयानक हो।
whatsisname

2
मेरे पास प्रति उत्तर "उत्तर" नहीं है, लेकिन व्यावहारिक प्रोग्रामर का इस पर एक अध्याय है (# 12 - डोमेन भाषाएँ)। आपके लिए कुछ जानकारी प्रदान कर सकता है।
क्रेगे

1
गेम डेवलपमेंट पर एक समान प्रश्न पर कुछ अच्छे उत्तर हैं: gamedev.stackexchange.com/questions/2913/…
celion

6
कभी-कभी एक स्क्रिप्टिंग लैनुगेज के भीतर एक बड़ी प्रणाली का होना बेहतर होता है - इसे " यूनिक्स तरीका " कहा जाता है । आप एक छोटे स्क्रिप्टिंग परत का उपयोग करके कई अलग-अलग उप प्रणालियों को गोंद कर सकते हैं। यह आर्किटेक्चर बहुत मजबूत और स्केलेबल माना जाता है।
एसके-तर्क

जवाबों:


66

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


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

2
सैंडबॉक्सिंग भी। पाइथन के ब्लेंडर के एकीकरण को देखें।
5

@meawoppl ... या प्रोग्राम में कार्यक्षमता जोड़ने के लिए। आईडीए के पायथन के एकीकरण को देखें (डब्ड आईडीएपीथॉन)
कोल जॉनसन

इसे क्यों नहीं बनाया गया है ताकि आपको केवल एक पुस्तकालय (जैसे विशिष्ट गेम लॉजिक घटकों के साथ) को पुन: स्थापित करने की आवश्यकता हो?
डेन

यदि आप ऑटोकैड, स्पार्क्स एंटरप्राइज आर्किटेक्ट, एमएस वर्ड जैसे अन्य उपकरणों को देखते हैं, तो आपके पास उन्हें सी # में स्क्रिप्ट करने के लिए फिर से नहीं है।
पीट किर्कम

28

इस तकनीक का उपयोग मुख्य तर्क को लागू करने के लिए किया जा सकता है जो विभिन्न भाषा वातावरणों के बीच आसानी से पोर्टेबल है। उदाहरण के लिए, मेरे पास एक कैलकुलेटर सिम्युलेटर है जहां 100% जावास्क्रिप्ट में सभी आंतरिक कैलकुलेटर तर्क को लागू किया गया है। उपयोगकर्ता इंटरफ़ेस कोड प्रत्येक प्लेटफ़ॉर्म के लिए अलग है:

  • वेब ब्राउज़र (जावास्क्रिप्ट)
  • iOS (ऑब्जेक्टिव-सी)
  • विंडोज (Q ++ के साथ C ++)
  • मैक ओएस एक्स (क्यूटी के साथ सी ++)
  • जावा स्विंग (जावा)

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


18

बहुत व्यापक रूप से दो स्थितियाँ हैं जहाँ आप इस पैटर्न को लागू करेंगे:

  1. इसका उपयोग आंतरिक रूप से एम्बेडेड भाषा की कुछ गुणवत्ता का लाभ उठाने के लिए किया जाता है।
  2. इसका उपयोग बाहरी प्रोग्रामबिलिटी प्रदान करने के लिए किया जाता है।

के भीतर

  • आमतौर पर एम्बेडेड भाषा की व्याख्या की जाती है जो बदलावों को फिर से संकलित किए बिना जल्दी से बनाने और परीक्षण करने की अनुमति देती है।
  • एम्बेडेड भाषा उस भाषा की तुलना में अधिक अभिव्यंजक हो सकती है जिस भाषा में आपका कोर एप्लिकेशन लिखा गया है, फिर से तेजी से विकास की अनुमति देता है।
  • सामान्य प्रयोजन की भाषा की तुलना में भाषा कुछ विशेष डोमेन के लिए बेहतर फिट हो सकती है ।
  • भाषा का उपयोग आंतरिक उपयोगकर्ताओं द्वारा किया जाता है, जिन्हें "सरल" प्रोग्रामिंग भाषा / वातावरण की आवश्यकता होती है। लघु प्रोग्राम उन लोगों द्वारा लिखे जाते हैं जो अपेक्षाकृत सरल वाक्यविन्यास / एपीआई का उपयोग करते हुए सॉफ्टवेयर डेवलपर नहीं होते हैं।

यहाँ एक उदाहरण Adobe Lightroom में इस्तेमाल किया गया Lua होगा।

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

बाह्य

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

आईबीएम ने अपने मेनफ्रेम ऑपरेटिंग सिस्टम वीएम-सीएमएस में स्क्रिप्टिंग भाषाओं का बहुत सफलतापूर्वक उपयोग किया । EXEC , EXEC / 2 और बाद में Rexx को पूरे आंतरिक और बाह्य रूप से पूरे सिस्टम में उपयोग किया गया। विभिन्न अनुप्रयोगों (जैसे XEDIT ) को उन्हीं भाषाओं और आंतरिक अनुप्रयोगों / उपयोगिताओं (जैसे ई-मेल) का उपयोग करके स्क्रिप्टिंग भाषा में लिखा गया था और ओएस और अन्य उपकरणों के साथ तंग एकीकरण का लाभ उठाया था। ग्राहकों ने कई स्क्रिप्टेड टूल और एप्लिकेशन बनाए और साझा किए। DEC ने DCL भी प्रदान किया । बाद में Microsoft ने अपने अधिकांश अनुप्रयोगों और हाल ही में PowerShell में एक स्क्रिप्टिंग भाषा के रूप में VBscript का समर्थन किया(यह भी एमएस / डॉस बैच फाइलें)। यूनिक्स के गोले की भी स्क्रिप्टिंग होती है

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


9

वास्तविक दुनिया के उदाहरणों में शामिल होंगे: -

  • अधिकांश वेब ब्राउज़र जो एम्बेडेड जावास्क्रिप्ट का समर्थन करेंगे।

  • Microsoft Office सुइट - एक्सेल वर्ड आदि सभी एम्बेडेड VBA स्क्रिप्ट का समर्थन करते हैं।

  • कई नेटवर्क राउटर में लिपि एपीआई, कई प्रकार की भाषा टीसीएल, पर्ल, लुआ शामिल हैं।

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


@ antony.trupe। आमतौर पर ECMAscript - en.wikipedia.org/wiki/ECMAScript
जेम्स एंडरसन

4

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

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


3

एक आवेदन के अंदर एक पटकथा भाषा का उपयोग करने का एक दिलचस्प तरीका है, जो दूसरों द्वारा अभी तक उल्लेख नहीं किया गया है।

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

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


स्वाभाविक रूप से आपके सामान्य डिबगर की तुलना में बहुत अधिक शक्तिशाली? किस तरह से? आपकी मेजबान भाषा के मुहावरों, मेमोरी मॉडल, ऑब्जेक्ट मॉडल, बुनियादी डेटा प्रकार, आदि के बिना आंतरिक ज्ञान के साथ एक "सरल बाहरी स्क्रिप्टिंग भाषा" संभवतः कोई उपयोगी सुविधा प्रदान कर सकती है जिसे भाषा के साथ काम करने के लिए डिज़ाइन किया गया डिबगर नहीं कर सकता था?
मेसन व्हीलर

@MasonWheeler, क्या आप एक सामान्य डीबगर के साथ कोड को हॉटस्पैप कर सकते हैं? क्या आप अपने रनटाइम की स्थिति के बारे में मनमाने ढंग से जटिल प्रोग्राम कर सकते हैं? क्या आप जटिल नियंत्रित प्रयोग कर सकते हैं? और आप यह मानने में गलत हैं कि एक स्क्रिप्टिंग भाषा में मेजबान भाषा के मुहावरों का कोई आंतरिक ज्ञान नहीं है, ... "। यदि होस्ट और स्क्रिप्टिंग भाषा दोनों एक ही VM (.NET, JVM, V8, जो भी हो) में चल रही हैं, तो आपकी स्क्रिप्टिंग भाषा से सभी हिम्मत की पूरी पहुँच है।
एसके-तर्क

1

मेरी विशिष्ट स्थिति, जब मैं एक प्रमुख एप्लिकेशन में व्याख्या की गई स्क्रिप्टिंग भाषा का उपयोग करता हूं:

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

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

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

इसलिए, इसके बजाय परिमित राज्य मशीन में "नो-वेट फंक्शन निष्पादित करें", "ए ब्लॉकिंग फंक्शन निष्पादित करें", "ब्रांचिंग / कंडीशनल / जंप" फंक्शन निष्पादित करने की अवस्थाएँ हैं, शायद कुल छः राज्य। और नियंत्रण स्क्रिप्ट हैं जो निष्पादन के लिए निर्धारित हो जाती हैं, फिर बाहरी उपकरण को नियंत्रित करने वाले दुभाषिया द्वारा निष्पादित की जाती हैं, और उनके परिणामों को रखा जाता है जहां उन्हें आवश्यकता होती है।

सारांश, एप्लिकेशन: RTOS में, आंतरिक व्याख्या की गई स्क्रिप्टिंग भाषा का उपयोग करके प्रतीक्षा-अवस्थाओं (अवरुद्ध कार्यों) में प्रचुर मात्रा में कार्य करने की जटिलता को कम किया जा सकता है।


1

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

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


-2

कुछ कारण हैं।

  • सीखने की अवस्था। वस्तुतः हर कोई जावास्क्रिप्ट में सीख और लिख सकता है।
  • सुरक्षा। C # या Java में स्क्रिप्ट कोड के सुरक्षा संदर्भ को नियंत्रित करना कठिन है। जावास्क्रिप्ट इसके लिए एकदम सही है। स्क्रिप्ट लेखक कभी भी डिस्क या कहीं भी पहुंच की अनुमति नहीं देता है यदि वे उन्हें अनुमति नहीं देते हैं। कोर जावास्क्रिप्ट इंजन सिर्फ एक उन्नत कैलकुलेटर है।
  • गुणवत्ता की। आपने स्क्रिप्टिंग कोड के लिए बहुत मोटी सीमा लगा दी। जावास्क्रिप्ट या C # / Java के लिए "स्पेगेटी कोड" का स्तर बहुत अलग है। (जो आपको नरक के द्वार खोलने से रोकता है)
  • प्रकार की सुरक्षा। C # / Java टाइप-सेफ एनवायरनमेंट हैं, आप ज्यादातर इसे स्क्रिप्टिंग के माहौल में पसंद नहीं करते हैं। "12" + 3 जैसी अभिव्यक्ति जावास्क्रिप्ट में "123" देती है लेकिन C # / Java भी संकलन नहीं करेगी। पटकथा लेखक ज्यादातर "टाइप" भी नहीं करते हैं
  • गतिशील। किसी भी वस्तु में कोई भी संपत्ति / विधि हो सकती है और वह समय में बदल सकती है। उदाहरण के लिए, मैं स्क्रिप्टिंग वातावरण में एक प्रॉक्सी C # ऑब्जेक्ट प्रदान कर सकता हूं जो गुण के रूप में XML नोड्स को उजागर करता है।
  • उत्पादकता। आमतौर पर स्क्रिप्ट लिखना C # / Java की तुलना में बहुत आसान है। कोई संकलन या "प्लगइन पंजीकरण" की आवश्यकता नहीं है। आप तत्काल परिणाम के साथ आवेदन के भीतर स्क्रिप्ट सामग्री को सीधे संपादित कर सकते हैं।
  • प्रबंध। C # / Java का उपयोग करने के लिए SDK को प्लग इन पर लिंक की आवश्यकता होती है जो दुनिया में आंतरिक कक्षाओं को उजागर करता है। इस प्लगइन आर्किटेक्चर को पुराने एसडीके संस्करणों के लिए "बैकवर्ड-संगतता" की आवश्यकता है। यह आर्किटेक्चर आपको "वर्चुअल" डोमेन ऑब्जेक्ट बनाने के लिए मजबूर करता है जो डोमेन संदर्भ में एप्लिकेशन का आंतरिक तंत्र प्रदान करता है। यह एक एपीआई को उजागर करने की तुलना में अधिक प्रबंधनीय / लचीला है।

3
यह एक बड़े कार्यक्रम के भीतर स्क्रिप्टिंग एम्बेड करने के प्रश्न के बिंदु को याद करता है । उदाहरण के लिए, एक डेवलपर ने जिम्प में स्क्रिप्ट-फू जोड़ने के लिए क्यों चुना ? या लुआ के साथ Civ V की मोडिंग है - एक डेवलपर ने एक एप्लीकेशन में स्क्रिप्टिंग को जोड़ने के लिए क्यों चुना होगा?

-3

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

सीएलआर के साथ, एक सी # प्रोग्राम या एक लुआ प्रोग्राम कॉल को मौजूदा सिस्टम में सक्षम करना विकास लागत में महत्वपूर्ण रूप से भिन्न नहीं है, और .net रनटाइम जहाजों को मक्खी पर उत्पन्न और संकलित करने के लिए उपकरण।

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

उन वातावरणों में, जो मक्खी कोड पीढ़ी और संकलन पर पेश नहीं करते हैं, और एक डोमेन विशिष्ट के बजाय एक सामान्य-उद्देश्य स्वचालन भाषा की पेशकश करने के लिए इसे वांछनीय के रूप में देखा जाता है, आपको अभी भी लुआ या पायथन स्क्रिप्टिंग मिलेगी। COM इंटरफ़ेस की पेशकश करने वाले टूल के लिए, फिर वह स्क्रिप्टिंग भाषा C # या VB.net (MS Office, Sparx Enterprise Architect) होगी। इसलिए एक भाषा में लिखे गए प्रोग्राम के लिए एक स्क्रिप्टिंग भाषा का होना जो कि एक स्क्रिप्टिंग भाषा होने के लिए पर्याप्त सरल है, एक अनावश्यक है।


Lua-scriptable XNA गेम के लिए एक Google खोज शून्य परिणामों को चालू नहीं करती है।
user16764

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