के लिए आउटपुट भाषा/प्रारूप मैंने विश्वविद्यालय में एक कंपाइलर कोर्स लिया, और यह बहुत ही जानकारीपूर्ण और बहुत मजेदार था, हालांकि बहुत सारे काम भी थे। चूंकि हमें लागू करने के लिए एक भाषा विनिर्देश दिया गया था, इसलिए एक चीज जिसे मैंने भाषा डिजाइन के बारे में बहुत कुछ नहीं सीखा था। अब मैं मस्ती के लिए एक साधारण खिलौना भाषा बनाने की सोच रहा हूं, ताकि मैं अलग-अलग भाषा डिजाइन सिद्धांतों के साथ खेल सकूं और प्रयोग कर सकूं।खिलौना कंपाइलर
एक बात मैंने अभी तक तय नहीं की है कि भाषा या प्रारूप मैं अपने कंपाइलर को आउटपुट करना चाहता हूं। आदर्श रूप में, मैं एक वर्चुअल मशीन के लिए बाइटकोड आउटपुट करना चाहता हूं जो उपयोग में आसान है और इसमें डिबगिंग के लिए कुछ सुविधाएं भी हैं (उदाहरण के लिए निष्पादन को रोकने में सक्षम होना और किसी भी बिंदु पर स्टैक को देखना।) मुझे कोई ऐसा नहीं मिला है जो मारा गया है हालांकि, मेरी कल्पना अभी भी। आप के लिए मैं क्या देख रहा हूँ की एक विचार देने के लिए, यहाँ विकल्प पर विचार किया है में से कुछ, उनके पक्ष और विपक्ष के साथ साथ कर रहे हैं के रूप में मैं उन्हें देख:
मैं कर सकता उत्पादन शाब्दिक 86 विधानसभा भाषा और फिर NASM या FASM की तरह एक असेंबलर का आह्वान करें। इससे मुझे वास्तविक हार्डवेयर के लिए कुछ अनुभव मिल जाएगा, क्योंकि मेरे पिछले कंपाइलर का काम वीएम पर किया गया था। मैं शायद जीडीबी का उपयोग कर जेनरेट किए गए प्रोग्राम डीबग कर सकता हूं, हालांकि यह डीबगिंग समर्थन के साथ वीएम का उपयोग करने जितना आसान नहीं हो सकता है। इसका मुख्य नकारात्मक पक्ष यह है कि मेरे पास x86 असेंबली के साथ सीमित अनुभव है, और एक सीआईएससी निर्देश सेट के रूप में यह थोड़ा मुश्किल है।
मैं आउटपुट बाइटकोड एक लोकप्रिय वर्चुअल मशीन के लिए जेवीएम या लुआ आभासी मशीन की तरह कर सकता था। इनमें से कौन से विशिष्ट वीएम चुनते हैं, उनके पेशेवरों और विपक्षों में भिन्नता होने की संभावना है, लेकिन आम तौर पर मैं यहां देखता हूं कि संभावित रूप से एक बाइटकोड सीखना है जो मेरी भविष्य की परियोजनाओं तक सीमित प्रयोज्यता हो सकती है। मुझे यह भी यकीन नहीं है कि कौन सी वीएम मेरी आवश्यकताओं के लिए सबसे उपयुक्त होगी।
मैं ही मेरी compilers बेशक, जो इस उद्देश्य के लिए विशेष रूप से मेरे विश्वविद्यालय में डिजाइन किया गया था में इस्तेमाल वी एम इस्तेमाल कर सकते हैं। मैं पहले से ही अपने डिजाइन और निर्देश सेट से परिचित हूं, और इसमें सभ्य डिबगिंग सुविधाएं हैं, इसलिए यह एक बड़ा प्लस है। हालांकि, यह अपनी क्षमताओं में बेहद सीमित है और मुझे लगता है कि अगर मैं कुछ भी मामूली रूप से उन्नत करने की कोशिश करता हूं तो मैं उन सीमाओं के खिलाफ जल्दी से दौड़ूंगा।
मैं एलएलवीएम और आउटपुट LLVM Intermediate Representation का उपयोग कर सकता था। एलएलवीएम आईआर बहुत शक्तिशाली लगता है और इससे परिचित होने से भविष्य में मेरे लिए निश्चित रूप से उपयोग किया जा सकता है। दूसरी ओर, मुझे वास्तव में पता नहीं है कि काम करना और डीबग करना कितना आसान है, इसलिए मैं उस क्षेत्र में अनुभवी किसी से सलाह की सराहना करता हूं।
मैं डिज़ाइन और अपनी खुद की वर्चुअल मशीन को कार्यान्वित कर सकता था। इसमें एक विशाल और स्पष्ट नकारात्मक पक्ष है: मैं अनिवार्य रूप से दो परियोजनाओं में अपनी परियोजना को बदल रहा हूं, जो वास्तव में कुछ भी करने की संभावना को कम करता है। हालांकि, यह अभी भी कुछ हद तक आकर्षक है कि यह मुझे एक वीएम बनाने की इजाजत देता है जिसमें मेरी इच्छित भाषा सुविधाओं के लिए "प्रथम श्रेणी" समर्थन था-उदाहरण के लिए, लुआ वीएम के पास तालिकाओं के लिए प्रथम श्रेणी का समर्थन है, जो इसे आसान बनाता है लुआ बाइटकोड में उनके साथ काम करें।
तो,, संक्षेप में प्रस्तुत करने मैं एक वी एम या कोडांतरक मैं लक्षित कर सकते हैं जो अपेक्षाकृत आसान जानने के लिए और के साथ काम करना, और डिबग करने के लिए आसान है के लिए देख रहा हूँ। चूंकि यह एक शौक परियोजना है, आदर्श रूप में मैं इस अवसर को कम करना चाहता हूं कि मैं कुछ टूल या भाषा सीखने में काफी समय बिताता हूं जिसे मैं कभी भी उपयोग नहीं करूंगा।इस अभ्यास से मुझे प्राप्त होने वाली मुख्य बात भाषा डिजाइन की जटिलताओं की पहली समझ है, हालांकि, अपेक्षाकृत त्वरित कार्यान्वयन की सुविधा देने वाली कोई भी चीज़ बहुत अच्छी होगी।
यदि आप अपनी कोड पीढ़ी बदलते हैं तो एक अच्छा कंपाइलर डिज़ाइन आपको अपने आईआर को किसी भी रूप में परिवर्तित करने की अनुमति देगा।मैं बस अपनी भाषा को कुछ आईआर में परिवर्तित करके शुरू करूंगा और फिर बैकएंड बनाउंगा जो इसे C \ C++ में परिवर्तित कर देगा। इस तरह आप कंपाइलर के विभिन्न घटकों के बारे में जान सकते हैं और एएसएम या बाइटकोड में कुछ निम्न-स्तरीय भाषा संरचनाओं को सत्यापित करने के बारे में चिंता करने की ज़रूरत नहीं है। – linuxuser27