.NET

2008-09-16 7 views
7

निखिल कोठारी के Script# के लिए साइड-बाय-साइड कंपाइलर कैसे बनाएं, संभवतया मैंने कुछ समय के लिए जावास्क्रिप्ट क्षेत्र में देखी गई सबसे अद्भुत अवधारणाओं में से एक है। यह प्रश्न जावास्क्रिप्ट के बारे में नहीं है, बल्कि .NET रनटाइम में भाषा संकलन के बारे में है।.NET

मुझे .NET प्लेटफ़ॉर्म का उपयोग करने में रुचि रखने में दिलचस्पी है, कोई ऐसी भाषा के लिए एक कंपाइलर लिख सकता है जिसमें पहले से ही एक कंपाइलर (जैसे सी #) है जो मूल कंपाइलर को अलग संकलक की अनुमति देते हुए मूल संकलक से अलग आउटपुट उत्पन्न करेगा एक ही निर्माण ऑपरेशन के दौरान उसी स्रोत के लिए आउटपुट उत्पन्न करने के लिए, अन्य संकलक के आउटपुट का संदर्भ/उपयोग करते समय भी।

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

-

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

उत्तर

2

यह है कि सभी एक संकलक करता है महसूस करने के लिए महत्वपूर्ण है एक स्रोत भाषा लेने (इस मामले में सी #), यह पार्स तो संकलक एक प्रतिनिधित्व है कि यह करने के लिए समझ में आता है है और न मानव (इस सार वाक्य रचना का पेड़ है), और फिर लक्ष्य भाषा में एक बेवकूफ कोड पीढ़ी करता है (एमएसआईएल उन भाषाओं के लिए लक्षित है जो .NET रनटाइम पर चलते हैं)।

अब यदि स्क्रिप्ट # कोड एक असेंबली में बदल गया है और अन्य .NET कोड के साथ इंटरैक्ट करता है, तो इसका मतलब है कि यह कंपाइलर एमएसआईएल उत्पन्न करना चाहिए। स्क्रिप्ट # इस के लिए csc.exe का उपयोग कर रहा है, जो कि मानक सी # कॉमिलर है। अब जावास्क्रिप्ट जेनरेट करने के लिए, इसे सी # या एमएसआईएल लेना चाहिए, इसे पार्स करना होगा, और ब्राउजर को भेजने के लिए जावास्क्रिप्ट जेनरेट करना होगा। दस्तावेज़ों का कहना है कि इसमें कस्टम सी # -> जेएस कंपाइलर है जिसे एसएससीएक्सई कहा जाता है।

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

+0

के साथ समान सामान कर सकते हैं। जिस जादू में मुझे रूचि है, वह यह है कि बिल्डिंग प्रक्रिया में यह आपके कोड संदर्भ से जेनरेट करने के लिए बनाता है यह आपके कोड से उत्पन्न करता है। स्रोत से आधारित ग्राफ को संकलित करने के लिए, लेकिन परिवर्तनों के साथ इसे सीएससी या शायद कोडडॉम से गुजरने से पहले यह स्रोत को बदल सकता है। – TheXenocide

+0

हालांकि सवाल के वास्तविक जवाब के लिए बहुत बहुत धन्यवाद, मैं उम्मीद कर रहा हूं कि कोई इसे प्राप्त करेगा। यदि आप यह स्पष्ट कर सकते हैं कि इस जादू को करने के लिए कुछ मौजूद है या यदि यह हाथ से थोड़ा सा है तो मैं इस जवाब को स्वीकार करने के लिए तैयार हूं। (कुंजी: एक स्रोत - दो परस्पर निर्भर आउटपुट) – TheXenocide

0

तो मान लें कि आप सी # को जावास्क्रिप्ट में संकलित करना चाहते हैं। आप पूछ रहे हैं कि क्या आप मौजूदा सी # कंपाइलर्स का लाभ उठा सकते हैं, इसलिए सी # को जावास्क्रिप्ट में संकलित करने के बजाय आप वास्तव में सी # कंपाइलर द्वारा जावास्क्रिप्ट में उत्पन्न एमएसआईएल को परिवर्तित करते हैं?

निश्चित रूप से, आप यह कर सकते हैं। एक बार आपके पास एमएसआईएल बाइनरी हो जाने के बाद आप जो कुछ भी करना चाहते हैं वह कर सकते हैं।

0

माइक्रोसॉफ्ट के पास एक शोध परियोजना है जिसे Volta कहा जाता है, जो अन्य चीजों के साथ, एमएसआईएल को जावास्क्रिप्ट में संकलित करता है।

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

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

+0

बिल्कुल वही नहीं जो मैं यहां देख रहा था (ऊपर देखें), लेकिन मैं वोल्टा के बारे में जानकारी की सराहना करता हूं, क्योंकि यह इन पंक्तियों के साथ एक और रोमांचक कार्यान्वयन है जिसे मुझे और जानना चाहिए। – TheXenocide

+0

एमएस ने वोल्टा को तोड़ दिया, लेकिन आप http://jsc.sourceforge.net/ – mcintyre321