9

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

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

  • मैं कर सकता उत्पादन शाब्दिक 86 विधानसभा भाषा और फिर NASM या FASM की तरह एक असेंबलर का आह्वान करें। इससे मुझे वास्तविक हार्डवेयर के लिए कुछ अनुभव मिल जाएगा, क्योंकि मेरे पिछले कंपाइलर का काम वीएम पर किया गया था। मैं शायद जीडीबी का उपयोग कर जेनरेट किए गए प्रोग्राम डीबग कर सकता हूं, हालांकि यह डीबगिंग समर्थन के साथ वीएम का उपयोग करने जितना आसान नहीं हो सकता है। इसका मुख्य नकारात्मक पक्ष यह है कि मेरे पास x86 असेंबली के साथ सीमित अनुभव है, और एक सीआईएससी निर्देश सेट के रूप में यह थोड़ा मुश्किल है।

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

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

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

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

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

+3

यदि आप अपनी कोड पीढ़ी बदलते हैं तो एक अच्छा कंपाइलर डिज़ाइन आपको अपने आईआर को किसी भी रूप में परिवर्तित करने की अनुमति देगा।मैं बस अपनी भाषा को कुछ आईआर में परिवर्तित करके शुरू करूंगा और फिर बैकएंड बनाउंगा जो इसे C \ C++ में परिवर्तित कर देगा। इस तरह आप कंपाइलर के विभिन्न घटकों के बारे में जान सकते हैं और एएसएम या बाइटकोड में कुछ निम्न-स्तरीय भाषा संरचनाओं को सत्यापित करने के बारे में चिंता करने की ज़रूरत नहीं है। – linuxuser27

उत्तर

6

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

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

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

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

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

मैं अन्य वीएम के साथ थोड़ा अधिक अनुभव प्राप्त करने से पहले अपनी खुद की आभासी मशीन को डिजाइन और कार्यान्वित करने की अनुशंसा नहीं करता ताकि आप कार्यान्वयन में किए गए ट्रेडऑफ को देख सकें और समझ सकें। यदि आप इस मार्ग पर जाते हैं, तो आप JVM, lua, .NET, और कई अन्य वीएम का अध्ययन समाप्त कर देंगे। मैं यह नहीं कह रहा हूं कि ऐसा करने के लिए, बल्कि ऐसा करने से आपको भाषा डिज़ाइन की खोज के आपके उद्देश्य से दूर ले जाया जाएगा।

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

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

+2

बहुत गहन प्रतिक्रिया के लिए धन्यवाद! मैं अब एलएलवीएम आईआर की तरफ झुका रहा हूं। मैं शायद बाद में अपना खुद का x86 बैकएंड कर रहा हूं। मैं भाषा डिजाइन या कंपाइलर्स में पेशेवर काम करने की योजना नहीं बना रहा हूं, लेकिन x86 असेंबली किसी भी प्रोग्रामर के लिए एक मूल्यवान ज्ञान है, मुझे लगता है। –

5

मेरे Programming Languages ZOO पर एक नज़र डालें। इसमें कुछ वर्चुअल मशीन और मेक-अप असेंबली (एक स्टैक मशीन) सहित कई खिलौने कार्यान्वयन हैं। इसे शुरू करने में आपकी मदद करनी चाहिए।

+0

क्या यह मजेदार कारक को पूरी तरह से बर्बाद नहीं करेगा? आप किसी और के कंपाइलर की प्रतिलिपि बनाकर मशीन पर मशीन का रोमांच नहीं प्राप्त कर सकते हैं। –

+1

मैंने कभी नहीं कहा कि उसे इसकी प्रतिलिपि बनाना चाहिए, लेकिन पहिया को पुनर्निर्मित करने का क्या मतलब है? ये कार्यान्वयन बहुत कम टिप्पणियों सहित 500 लाइनों के क्रम में बहुत कम हैं। वे असली प्रोग्रामिंग भाषा नहीं हैं। –

+0

मुझे लगता है कि ये बहुत अच्छे हैं! भाषा डिजाइन में पूरी तरह से अनुभवहीन होने के बावजूद जो मुझे लगता है कि एक सामान्य रूप से प्रतिमान और सिद्धांतों की एक विस्तृत विविधता है, मैं निश्चित रूप से मेरी पहली कोशिश पर पूरी तरह से उपन्यास का आविष्कार करने की उम्मीद नहीं कर रहा हूं। मुझे अलग-अलग विचारों के साथ खेलने में अधिक दिलचस्पी है, यह देखते हुए कि कौन से लोग अच्छी तरह से जाल करते हैं, और यह देखते हुए कि उन्हें लागू करने के लिए क्या होता है। इसके लिए, मुझे लगता है कि ये उदाहरण बहुत उपयोगी हो सकते हैं। धन्यवाद, Andrej! –

1

यदि आप सिर्फ भाषा डिज़ाइन के साथ खेल रहे हैं तो एक व्याख्या की गई भाषा के बारे में क्या? पूरे एएसटी को अभी भी रन टाइम पर चारों ओर रखने से आप कुछ बहुत अच्छी चीजें कर सकते हैं।