2010-07-20 15 views
8

मैं गतिशील भाषा के लिए एक कंपाइलर लिखने की कोशिश करने जा रहा हूं। अधिमानतः कुछ मौजूदा आभासी मशीनों के लिए --- मैं (अभी तक) कचरा संग्रह से निपटना नहीं चाहता हूं और असंख्य अन्य चिंताओं को आपके लिए एक अच्छा वीएम हैंडल करता है। आप क्या वीएम सुझाव देते हैं?एक कंपाइलर लिखना; कौन सा वीएम?

मैं लिनक्स पर हूं, इसलिए मुझे नहीं पता कि .NET (मोनो के माध्यम से) क्या यह एक अच्छा विचार है। मैंने सुना है कि तोता गतिशील भाषाओं के लिए अच्छा है, लेकिन मैंने किसी भी भाषा उपयोग के बारे में नहीं सुना है। क्या मुझे अपना खुद का आविष्कार करना चाहिए? क्या एलएलवीएम भी वीएम के रूप में गिना जाता है, मुझे इसके खिलाफ संकलन करना चाहिए, या यह सीधे x86 जितना कठिन है?

इसके अलावा, स्टैक-आधारित बनाम रजिस्टर-आधारित वीएम के लिए क्या पेशेवर और विपक्ष हैं?

प्रदर्शन और उपकरण समर्थन महत्वपूर्ण होगा। मैं हास्केल में कंपाइलर लिखूंगा, इसलिए इसके साथ एक अच्छा इंटरफ़ेस एक प्लस है।

+0

"मिथिकल मशीन" के बारे में क्या है जो प्रसिद्ध डोनाल्ड ई। कुथ ने अपने एल्गोरिदम को समझाने के लिए उपयोग करने के लिए डिज़ाइन किया है? अभी भी कई MIX अनुकरणकर्ता हैं। – Abel

उत्तर

9

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

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

+0

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

+2

@pavpanchekha: सीएलआर वास्तव में विशेष रूप से सी # के लिए डिज़ाइन नहीं किया गया था - इसकी शुरुआत से ही अन्य भाषाओं (जैसे वीबी.नेट) थी। डीएलआर के साथ भी, यह भी अच्छा है - आयरनपीथन, आयरन रूबी, वीबी.नेट, सी #, और यहां सभी भाषाओं को देखें: http://en.wikipedia.org/wiki/Microsoft_.NET_Languages ​​ –

+1

यही कारण है कि मैंने कहा सीएलआर के यहां कुछ फायदे हैं - इसे 1 दिन से "भाषा तटस्थ" होने के साथ डिजाइन किया गया था - जहां JVM को इस तरह से किया जा सकता है, इसे जावा से शुरुआत के लिए डिज़ाइन किया गया था ... –

1

.NET में डायनामिक भाषा रनटाइम है, जैसा कि रीड कॉपसे द्वारा उल्लिखित है। लेकिन मुझे सीएलआर भी नहीं पता, डीएलआर बहुत कम है - मैं या तो कुछ भी नहीं बता सकता। एलएलवीएम सादा x86 से अच्छा होना चाहिए, लेकिन यह अभी भी निम्न स्तर है। लेकिन मैं इसके बारे में बहुत कुछ नहीं बता सकता, या तो - कुछ ही नज़रें।

मैंने तोते में देखा, हालांकि। विचार स्वयं बहुत बढ़िया है, और कार्यान्वयन ध्वनि दिखता है। अगर मैंने कभी गतिशील भाषा बनाई है, तो मुझे यकीन है कि यह तोते को लक्षित करेगा। PIR (तोता मध्यवर्ती प्रतिनिधित्व) एक वीएम के लिए बहुत उच्च स्तर है। आपके पास सिंटैक्टिक चीनी (आर्मीथिक ऑपरेटर, आकलन, सबराउटिन को कॉल करना और उनसे लौटना केक का एक टुकड़ा है ...), सटीक रजिस्टर नंबरों के साथ गड़बड़ न करें, लेकिन जितना चाहें उतना लें और उन्हें कोई नंबर असाइन करें , और यहां तक ​​कि चर नाम दिया है!

अगर मुझे चुनना पड़ा, तो मुझे लगता है कि मैं एक रजिस्टर-आधारित वीएम पसंद करूंगा। शोध इंगित करता है कि निष्पादन गति के लिए इन व्यापार बाइटकोड आकार, जो मुझे ठीक लगाता है। इसके अलावा, जब मैं उन्हें समझने की कोशिश करता हूं तो बहुत ही जटिल स्टैक ऑपरेशंस मेरे मस्तिष्क को जोड़ते हैं - रजिस्टर-आधारित ऑपरेशंस अधिक प्राकृतिक इम्हो आते हैं।

4

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

उस ने कहा, आपको अपनी भाषा के "गतिशील" भागों की देखभाल करने के लिए अपनी खुद की रनटाइम परत विकसित करना होगा। सिर्फ उस हिस्से के लिए, मैं सीएलआर के साथ रहना पड़ सकता हूं।

+0

आपको * अभी भी * पूरी तरह से चिंता करने की आवश्यकता है अपने आउटपुट को अनुकूलित करना। और यह संदिग्ध है कि क्या पंजीकरण शेड्यूलिंग x86 पर किसी भी प्रयोग का है। आप अपने 6 "सामान्य उद्देश्य" रजिस्टरों से क्या प्रदर्शन लाभ प्राप्त करते हैं? – Cheery

+0

एलएलवीएम के निर्देश सेट एसएसए रजिस्टरों की एक असंबद्ध संख्या का खुलासा करता है। प्रोग्रामर के रूप में, आपको अपने सभी वैरिएबल को रजिस्टरों की संख्या में फ़िट करने के बारे में चिंता करने की ज़रूरत नहीं होगी, वास्तव में एक प्लेटफॉर्म वास्तव में ऑफ़र करता है या सोचता है कि उन्हें स्टैक पर कैसे पहुंचाया जा सकता है। – Karmastan

+0

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

संबंधित मुद्दे