मैंने C # में लिखे प्रोग्राम के अंदर, जावास्क्रिप्ट या पायथन (या कुछ) का उपयोग करते हुए लोगों की कई स्थितियों के बारे में सुना है। जब C # प्रोग्राम में कुछ करने के लिए JavaScript जैसी भाषा का उपयोग करना बेहतर होगा तो बस C # में कर रहे हैं?
मैंने C # में लिखे प्रोग्राम के अंदर, जावास्क्रिप्ट या पायथन (या कुछ) का उपयोग करते हुए लोगों की कई स्थितियों के बारे में सुना है। जब C # प्रोग्राम में कुछ करने के लिए JavaScript जैसी भाषा का उपयोग करना बेहतर होगा तो बस C # में कर रहे हैं?
जवाबों:
जब आपके पास ऐसा व्यवहार होता है जिसे आप बदलना नहीं चाहते हैं तो कार्यक्रम को फिर से शुरू करना होगा। यही कारण है कि इतने सारे खेल एक स्क्रिप्टिंग / मोडिंग भाषा के रूप में लुआ का उपयोग करते हैं।
इस तकनीक का उपयोग मुख्य तर्क को लागू करने के लिए किया जा सकता है जो विभिन्न भाषा वातावरणों के बीच आसानी से पोर्टेबल है। उदाहरण के लिए, मेरे पास एक कैलकुलेटर सिम्युलेटर है जहां 100% जावास्क्रिप्ट में सभी आंतरिक कैलकुलेटर तर्क को लागू किया गया है। उपयोगकर्ता इंटरफ़ेस कोड प्रत्येक प्लेटफ़ॉर्म के लिए अलग है:
इस व्यवस्था के साथ, विभिन्न ऑपरेटिंग वातावरणों के लिए मेरे कार्यक्रम के संस्करण बनाना, और विशेष रूप से उन्हें अद्यतित रखना, बहुत सरल है।
बहुत व्यापक रूप से दो स्थितियाँ हैं जहाँ आप इस पैटर्न को लागू करेंगे:
के भीतर
यहाँ एक उदाहरण Adobe Lightroom में इस्तेमाल किया गया Lua होगा।
इसलिए हम लुआ के साथ जो करते हैं वह अनिवार्य रूप से यूआई को चलाने से लेकर डेटाबेस में वास्तव में हम क्या करते हैं, तक के सभी एप्लिकेशन लॉजिक हैं। एप्लिकेशन में बहुत अधिक हर कोड है जिसे निर्णय लेने या सुविधाओं को लागू करने के रूप में वर्णित किया जा सकता है, जब तक आप कच्चे प्रसंस्करण के लिए नीचे नहीं आते हैं, जो कि C ++ में है। ( मार्क हैम्बर्ग साक्षात्कार: एडोब फोटोशॉप लाइटरूम )
बाह्य
आईबीएम ने अपने मेनफ्रेम ऑपरेटिंग सिस्टम वीएम-सीएमएस में स्क्रिप्टिंग भाषाओं का बहुत सफलतापूर्वक उपयोग किया । EXEC , EXEC / 2 और बाद में Rexx को पूरे आंतरिक और बाह्य रूप से पूरे सिस्टम में उपयोग किया गया। विभिन्न अनुप्रयोगों (जैसे XEDIT ) को उन्हीं भाषाओं और आंतरिक अनुप्रयोगों / उपयोगिताओं (जैसे ई-मेल) का उपयोग करके स्क्रिप्टिंग भाषा में लिखा गया था और ओएस और अन्य उपकरणों के साथ तंग एकीकरण का लाभ उठाया था। ग्राहकों ने कई स्क्रिप्टेड टूल और एप्लिकेशन बनाए और साझा किए। DEC ने DCL भी प्रदान किया । बाद में Microsoft ने अपने अधिकांश अनुप्रयोगों और हाल ही में PowerShell में एक स्क्रिप्टिंग भाषा के रूप में VBscript का समर्थन किया(यह भी एमएस / डॉस बैच फाइलें)। यूनिक्स के गोले की भी स्क्रिप्टिंग होती है ।
आज का चलन किसी न किसी तरह से एपीआई को प्रकट करता हुआ प्रतीत होता है और उपयोगकर्ताओं को स्क्रिप्टिंग भाषा का विकल्प छोड़ता है जो एपीआई को एक्सेस करने के विभिन्न बाइंडिंग या अन्य साधनों का उपयोग कर सकते हैं।
वास्तविक दुनिया के उदाहरणों में शामिल होंगे: -
अधिकांश वेब ब्राउज़र जो एम्बेडेड जावास्क्रिप्ट का समर्थन करेंगे।
Microsoft Office सुइट - एक्सेल वर्ड आदि सभी एम्बेडेड VBA स्क्रिप्ट का समर्थन करते हैं।
कई नेटवर्क राउटर में लिपि एपीआई, कई प्रकार की भाषा टीसीएल, पर्ल, लुआ शामिल हैं।
कई एम्बेडेड डिवाइस कोर सी फ़ंक्शन के बहुत छोटे सेट का उपयोग करके कार्यान्वित किए जाते हैं जो एक स्क्रिप्टिंग भाषा जैसे लुआ का उपयोग करके एक साथ चिपके होते हैं। तो आपके पास छोटे, तेज सी फ़ंक्शन का एक सेट है जो हार्डवेयर के साथ बातचीत करता है, और, स्क्रिप्टिंग लैंग्वेज में संशोधन करने के लिए एक लचीले में नियंत्रण के अधिकांश तर्क।
कभी-कभी स्क्रिप्टिंग एक एप्लिकेशन में एम्बेडेड होती है क्योंकि यह अन्य डेवलपर्स द्वारा होस्ट एप्लिकेशन को विस्तारित करने का एक साधन है। संभव के रूप में प्रोग्रामिंग भाषा कौशल की एक विस्तृत श्रृंखला को पकड़ने के लिए, कई स्क्रिप्टिंग भाषाओं को मेजबान द्वारा समर्थित किया जा सकता है। उदाहरण के लिए, जेवीएम पर, आप जेएसआर -223 अनुरूप भाषाओं की एक पूरी श्रृंखला को एम्बेड कर सकते हैं , जिसमें पायथन, रूबी, जावास्क्रिप्ट, आदि शामिल हैं।
एक अन्य कारण पहले से ही उल्लेख नहीं किया गया है कि एम्बेडेड भाषा में एक या एक से अधिक स्टैंडआउट विशेषताएं हैं, जो होस्ट भाषा आसानी से डुप्लिकेट नहीं कर सकती है। इसका एक उदाहरण पार्स फंक्शनलिटी या अनायास डीएसएल (डोमेन विशिष्ट भाषा / बोली) निर्माण होगा जो रेबोल जैसी भाषा में पाया जा सकता है।
एक आवेदन के अंदर एक पटकथा भाषा का उपयोग करने का एक दिलचस्प तरीका है, जो दूसरों द्वारा अभी तक उल्लेख नहीं किया गया है।
यदि आपकी होस्ट भाषा में एक समृद्ध, चिंतनशील रनटाइम है, तो यह अक्सर आपके अनुप्रयोगों में REPL के साथ एक सरल भाषा को एम्बेड करने के लिए उपयोगी होता है, इसे एक सॉकेट पर हुक करें और इसे पूरे सिस्टम तक पहुंच प्रदान करें।
यह एक इंटरैक्टिव डिबगिंग के लिए इस्तेमाल किया जा सकता है (और यह स्वाभाविक रूप से आपके सामान्य डिबगर की तुलना में बहुत अधिक शक्तिशाली है), हॉट कोड पैचिंग, विभिन्न निगरानी उद्देश्य, यहां तक कि बैकडोर (यदि आप अच्छे नहीं हैं)।
मेरी विशिष्ट स्थिति, जब मैं एक प्रमुख एप्लिकेशन में व्याख्या की गई स्क्रिप्टिंग भाषा का उपयोग करता हूं:
एक बाहरी उपकरण है जो कई कार्य करता है। माप, नियंत्रण, रीडआउट। यह अपने आप में बहुत "गूंगा" है और सटीक नियंत्रण, चरण-दर-चरण की आवश्यकता है, जिसमें बहुत सारे प्रतीक्षा राज्य और नियंत्रण तंत्र पक्ष पर तदर्थ निर्णय शामिल हैं।
मुख्य अनुप्रयोग के विभिन्न बिंदुओं पर, अलग-अलग समय पर, अक्सर मांग पर डिवाइस की विभिन्न कार्यक्षमताएं आवश्यक हैं। मुख्य ऐप इंतजार करने वाले राज्यों की अनुमति नहीं देता है, सब कुछ परिमित राज्य मशीनों के साथ किया जाना चाहिए।
अब जिसने भी एक परिमित राज्य मशीन लिखी है वह जानता है कि एक प्रतीक्षा अवस्था को लागू करना कम से कम दो, अक्सर मशीन के तीन या चार आंतरिक राज्यों में प्रभावी होता है। विभिन्न कार्यों के लिए बीस प्रतीक्षा-राज्यों को लागू करना (और उनकी प्रतिक्रियाओं की प्रतीक्षा करना और तदनुसार प्रतिक्रिया करना) बाहरी डिवाइस का एक बहुत ही निराशाजनक अनुभव होगा।
इसलिए, इसके बजाय परिमित राज्य मशीन में "नो-वेट फंक्शन निष्पादित करें", "ए ब्लॉकिंग फंक्शन निष्पादित करें", "ब्रांचिंग / कंडीशनल / जंप" फंक्शन निष्पादित करने की अवस्थाएँ हैं, शायद कुल छः राज्य। और नियंत्रण स्क्रिप्ट हैं जो निष्पादन के लिए निर्धारित हो जाती हैं, फिर बाहरी उपकरण को नियंत्रित करने वाले दुभाषिया द्वारा निष्पादित की जाती हैं, और उनके परिणामों को रखा जाता है जहां उन्हें आवश्यकता होती है।
सारांश, एप्लिकेशन: RTOS में, आंतरिक व्याख्या की गई स्क्रिप्टिंग भाषा का उपयोग करके प्रतीक्षा-अवस्थाओं (अवरुद्ध कार्यों) में प्रचुर मात्रा में कार्य करने की जटिलता को कम किया जा सकता है।
मेरे अनुभव से, हमने एक बार एक बड़ा एप्लिकेशन विकसित किया जो एक "प्राचीन" लैंग्यू के यूनिकोड को फिर से लिखने के लिए एक यूनिकोड संगत बनाता है। C # में किया गया था। मैंने केवल इंजन लिखना बंद कर दिया है (जो डेटा मॉडल बनाता है और रीराइट प्रक्रिया के लिए आवश्यक चरणों को करने के लिए साधन प्रदान करता है) C # - वास्तव में चीजों को निष्पादित करने के लिए "गोंद कोड" आयरनपीथॉन में किया जाता है।
एकीकृत आयरनपाइथन के लिए सबसे बड़ा बिंदु: मान लें कि आपने एक बड़ा डेटा मॉडल (लगभग एक घंटे का लोड समय) लोड किया है। फिर आप -मानसिक रूप से जानकारी एकत्र करना चाहते हैं और चीजों को देखना चाहते हैं। एक इंटरैक्टिव कंसोल से पायथन स्क्रिप्ट के साथ ऐसा करना डिबगर के साथ डेटा मॉडल के माध्यम से क्लिक करने की तुलना में कहीं अधिक बेहतर है (प्लस, यह पुन: प्रयोज्य है)।
कुछ कारण हैं।
कब? 1948 और 2008 के बीच - शुरू में संकलित भाषाओं को संकलन और लिंक करने के लिए महत्वपूर्ण समय लगा, इसलिए उपयोगकर्ता अनुकूलन और कॉन्फ़िगरेशन की अनुमति देने के लिए एक स्क्रिप्टिंग भाषा बनाना सामान्य बात थी। यदि आप ऑटोलिस्प के इतिहास को देखते हैं, तो इसका उत्तर है कि ऑटोकैड को शुरू में इसके भीतर एक स्क्रिप्टिंग भाषा के साथ भेज दिया गया है, लेकिन यह एक स्क्रिप्ट योग्य इंटरफ़ेस को वीबीए फिर नेट पर उजागर करने के पक्ष में तैयार किया गया था।
सीएलआर के साथ, एक सी # प्रोग्राम या एक लुआ प्रोग्राम कॉल को मौजूदा सिस्टम में सक्षम करना विकास लागत में महत्वपूर्ण रूप से भिन्न नहीं है, और .net रनटाइम जहाजों को मक्खी पर उत्पन्न और संकलित करने के लिए उपकरण।
अब आपको बड़े कार्यक्रम के भीतर एक स्क्रिप्टिंग भाषा रखने की आवश्यकता नहीं है , बल्कि इसके बजाय रनटाइम की स्क्रिप्टिंग सुविधाओं के लिए बड़े प्रोग्राम को उजागर करें।
उन वातावरणों में, जो मक्खी कोड पीढ़ी और संकलन पर पेश नहीं करते हैं, और एक डोमेन विशिष्ट के बजाय एक सामान्य-उद्देश्य स्वचालन भाषा की पेशकश करने के लिए इसे वांछनीय के रूप में देखा जाता है, आपको अभी भी लुआ या पायथन स्क्रिप्टिंग मिलेगी। COM इंटरफ़ेस की पेशकश करने वाले टूल के लिए, फिर वह स्क्रिप्टिंग भाषा C # या VB.net (MS Office, Sparx Enterprise Architect) होगी। इसलिए एक भाषा में लिखे गए प्रोग्राम के लिए एक स्क्रिप्टिंग भाषा का होना जो कि एक स्क्रिप्टिंग भाषा होने के लिए पर्याप्त सरल है, एक अनावश्यक है।