संकलक लिखना सीखना [बंद]


699

पसंदीदा भाषाएँ : C / C ++, Java और रूबी।

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


सभी तरह से ANTLR। नीचे प्रस्तावित सभी संसाधन मुझे एक ओवरकिल की तरह लग रहे हैं। ANTLR हमेशा एक संकलक डिजाइनर सबसे अच्छा दोस्त है। A
A_Var

यदि आपका मुख्य ध्यान यह जानना है कि विचारों का संकलन सामान्य रूप से कैसे काम करता है - तो आप स्कीम (सूची) में स्थित कंप्यूटर प्रोग्राम के स्ट्रक्चर्ड इंटरप्रिटेशन के लिए लघु और जाँच कर सकते हैं लेकिन सामान्य सिद्धांतों को सिखाते हैं। mitpress.mit.edu/sicp । मुझे इस पुस्तक की सिफारिश एक अनुभवी व्यक्ति द्वारा की गई थी, जो एक कंपनी के लिए काम करता है और इन कामों को एक जीविका के लिए संकलन और व्याख्या करता है!
निशांत


मैंने अपने ब्लॉग पर एक संकलक बनाने पर एक लेख लिखा: Orangejuiceliberationfront.com/how-to-write-a-compiler यह बहुत मूल बातें और वास्तव में शुरू होने पर केंद्रित है। वहाँ पर एक गुच्छा अधिक संकलक / कोडीन / पार्सर / भाषा डिज़ाइन-संबंधित लेख हैं।
अल्विहार्ट

जवाबों:


1085

संसाधनों की बड़ी सूची:

लीजेंड:

  • PDF एक पीडीएफ फाइल का लिंक
  • $ एक मुद्रित पुस्तक के लिए लिंक

22
मैंने Let's Build a Compiler[ compilers.iecc.com/crenshaw/] सीरीज़ पढ़ी है , यह वास्तव में अच्छा राइटअप है और एक अच्छा शुरुआती बिंदु है।
विलेजइडियोडॉट

5
मुझे लगता है कि उल्लेख के लायक एक कौरसेरा का संकलन पाठ्यक्रम है। इसमें अच्छे वीडियो हैं और भाषा / सरल संकलक जैसे जावा बनाने के माध्यम से चलता है।
कौरसेरा

1
मैं इस उत्तर को यथासंभव मूल रखने के लिए पोस्ट करना चाहता था, इसलिए मैंने इस संदर्भ को यहां पोस्ट करने का निर्णय लिया: tutorialspoint.com/compiler_design/index.htm मुझे इस साइट के बारे में क्या पसंद है कि यह वास्तव में कोई कोड लिखने के साथ शामिल नहीं है एक कंपाइलर बनाने के लिए, लेकिन यह कंपाइलर को उसके भागों में तोड़ता है: चरण और चरण। यह किसी विशिष्ट भाषा के प्रतिमान के बिना तर्क और एल्गोरिदमिक डिजाइन दृष्टिकोण का वर्णन करता है क्योंकि यह एक मनमाना भाषा और वर्णमाला की सूचनाओं को व्यक्त करता है। यह एक त्वरित रीड है, लेकिन आपको यह बताता है कि प्रत्येक भाग के लिए क्या आवश्यक है।
फ्रांसिस कुगलर

70

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

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

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

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


55

मुझे लगता है कि एमएल में आधुनिक कंपाइलर कार्यान्वयन सबसे अच्छा परिचयात्मक कंपाइलर लेखन पाठ है। वहाँ एक है जावा संस्करण और एक सी संस्करण भी, या तो जिनमें से अपने भाषाओं पृष्ठभूमि को देखते हुए और अधिक सुलभ हो सकता है। पुस्तक बहुत सारे उपयोगी मूल सामग्री (स्कैनिंग और पार्सिंग, अर्थ विश्लेषण, सक्रियण रिकॉर्ड, निर्देश चयन, RISC और x86 देशी कोड पीढ़ी) और विभिन्न "उन्नत" विषयों (ओओ और कार्यात्मक भाषाओं, बहुरूपता, कचरा संग्रह, अनुकूलन और) को पैक करती है। एकल स्थैतिक असाइनमेंट फॉर्म) अपेक्षाकृत कम स्थान (~ 500 पृष्ठों) में।

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

मुझे कबूल करना चाहिए कि मेरे पास निकलस विर्थ के संकलक निर्माण के लिए एक गंभीर नरम स्थान है यह पीडीएफ के रूप में ऑनलाइन उपलब्ध है । मुझे लगता है कि Wirth की प्रोग्रामिंग सौंदर्य केवल सुंदर है, हालांकि कुछ लोग उनकी शैली को बहुत कम पाते हैं (उदाहरण के लिए Wirth एहसान पुनरावर्ती वंश परवरिश करता है, लेकिन अधिकांश CS पाठ्यक्रम Parser जनरेटर टूल पर ध्यान केंद्रित करते हैं; Wirth की भाषा डिजाइन काफी रूढ़िवादी है।) Compiler Construction एक बहुत ही सस्पेंशन आसवन है। Wirth के मूल विचारों में, इसलिए आपको उनकी शैली पसंद है या नहीं, मैं इस पुस्तक को पढ़ने की सलाह देता हूं।


कंपाइलर निर्माण पीडीएफ ethoberon.ethz.ch/WirthPubl/CBEAll.pdf
matepal297

मैं "मॉडर्न कंपाइलर इम्प्लीमेंटेशन" के C संस्करण के खिलाफ दृढ़ता से सलाह देता हूं , यह C. के कारण निम्न-स्तरीय विवरणों से अपंग है। यह पुस्तक को पूरी तरह से बंद कर देता है। Java 1st बहुत अच्छा नहीं है क्योंकि इसका OO डिज़ाइन खराब है, Java 2nd ed अब टाइगर भाषा के बारे में नहीं है। इसलिए मैं दृढ़ता से एमएल एक की सिफारिश करता हूं: इसे समझने के लिए एमएल में धाराप्रवाह होना आवश्यक नहीं है। एमएल निश्चित रूप से नौकरी के लिए अच्छी तरह से अनुकूल है।
एकिम

44

मैं ड्रैगन बुक संदर्भ के साथ सहमत हूं; IMO, यह संकलक निर्माण के लिए निश्चित मार्गदर्शिका है। कुछ कट्टर सिद्धांत के लिए तैयार हो जाओ, यद्यपि।

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

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


1
गेम स्क्रिप्टिंग मास्टरी एक महान सीखने का संसाधन है क्योंकि जब आप पूरा कर लेते हैं तो आपके पास एक खेलने योग्य, स्क्रिप्ट योग्य 2D साहसिक खेल होगा। यह प्रत्येक अभ्यास को एक विशिष्ट उद्देश्य पर केंद्रित करता है, और पाठक को प्रेरित करता है।
डोर हाई आर्क

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

27

"लेट्स बिल्ड ए कंपाइलर" कमाल का है, लेकिन यह थोड़ा पुराना है। (मैं यह नहीं कह रहा हूँ यह थोड़ा कम वैध बनाता है।)

या SLANG की जाँच करें । यह "लेट्स बिल्ड ए कंपाइलर" के समान है, लेकिन विशेष रूप से शुरुआती लोगों के लिए बेहतर संसाधन है। यह एक पीडीएफ ट्यूटोरियल के साथ आता है जो आपको एक कंपाइलर सिखाने पर 7 कदम का दृष्टिकोण लेता है। Quora लिंक को जोड़ना क्योंकि इसमें SLANG, C ++, Java और JS के सभी विभिन्न पोर्ट्स के लिंक हैं, यह भी अजगर और जावा में व्याख्याताओं, मूल रूप से C # और .NET प्लेटफॉर्म का उपयोग करके लिखा गया है।


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

23

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

यह पाठ्यक्रम मानक कंपाइलर कंपाइलर सामान पर चला जाता है, जिसे आप कहीं और देखेंगे: पार्सिंग, प्रकार और प्रकार की जाँच, बहुरूपता, प्रतीक तालिकाओं और कोड पीढ़ी। बहुत ही एकमात्र चीज जो कवर नहीं है वह अनुकूलन है। अंतिम परियोजना एक कार्यक्रम है जो सी के सबसेट को संकलित करता है । क्योंकि आप ANTLR और LLVM जैसे टूल का उपयोग करते हैं, इसलिए पूरे कंपाइलर को एक ही दिन में लिखना संभव है (मेरे पास इसका अस्तित्व प्रमाण है, हालांकि मेरा मतलब है ~ 24 घंटे)। यह आधुनिक उपकरणों का उपयोग करते हुए व्यावहारिक इंजीनियरिंग पर भारी है, सिद्धांत पर थोड़ा हल्का है।

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


पहला लिंक मृत है।
लिन

20

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


यदि आपके पास अधिक समय नहीं है, तो एक संकलक नहीं लिखें।
इंगो

17

आप लेक्स / याक (या फ्लेक्स / बाइसन, जो भी आप उन्हें कॉल करना चाहते हैं) में देखना चाहते हैं। फ्लेक्स एक लेक्सिकल एनालाइज़र है, जो आपकी भाषा के शब्दार्थ घटकों ("टोकन") को पार्स और पहचान देगा, और बाइसन का उपयोग यह परिभाषित करने के लिए किया जाएगा कि प्रत्येक टोकन के पार्स होने पर क्या होता है। यह हो सकता है, लेकिन निश्चित रूप से सी कोड को प्रिंट करने के लिए सीमित नहीं है, एक संकलक के लिए जो सी को संकलित करेगा, या गतिशील रूप से निर्देश चलाएगा।

यह अक्सर पूछे जाने वाले प्रश्न आपकी मदद करना चाहिए, और यह ट्यूटोरियल काफी उपयोगी है।


17

सामान्यतया, संकलक के लिए कोई पाँच मिनट का ट्यूटोरियल नहीं है, क्योंकि यह एक जटिल विषय है और संकलक को लिखने में महीनों लग सकते हैं। आपको अपनी खोज स्वयं करनी होगी।

आमतौर पर अजगर और रूबी की व्याख्या की जाती है। शायद आप एक दुभाषिया के साथ भी शुरू करना चाहते हैं। यह आम तौर पर आसान है।

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

अपनी भाषा के लिए एक पार्सर लिखना वास्तव में कठिन हो सकता है, लेकिन यह आपके व्याकरण पर निर्भर करता है। इसलिए मैं आपके व्याकरण को सरल रखने का सुझाव देता हूं (C ++ के विपरीत); इसके लिए एक अच्छा उदाहरण है LISP।

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

यदि आप एक दुभाषिया का निर्माण कर रहे हैं, तो आपको बस मध्यवर्ती प्रतिनिधित्व की व्याख्या करनी होगी। आप इसे समय-समय पर संकलित भी कर सकते हैं। मैं सिर्फ समय-संकलन के लिए LLVM और libjit की सलाह देता हूं। भाषा को उपयोगी बनाने के लिए आपको कुछ इनपुट और आउटपुट फ़ंक्शंस और शायद एक छोटे मानक पुस्तकालय को भी शामिल करना होगा।

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

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

मैं सैद्धांतिक कंप्यूटर विज्ञान और ग्राफ सिद्धांत में एक अच्छी पृष्ठभूमि के ज्ञान की भी सिफारिश करता हूं, यदि आप अपनी परियोजना को गंभीर बनाने जा रहे हैं। कंप्यूटर साइंस में डिग्री भी मददगार होगी।


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


11

जॉन लेविन द्वारा एक पुस्तक अभी तक सुझाई नहीं गई है लेकिन "लिंकर्स एंड लोडर्स" बहुत महत्वपूर्ण है । यदि आप एक बाहरी कोडांतरक का उपयोग नहीं कर रहे हैं, तो आपको एक ऑब्जेक्ट फ़ाइल को आउटपुट करने का एक तरीका चाहिए जो आपके अंतिम कार्यक्रम में जोड़ा जा सकता है। यहां तक ​​कि अगर आप एक बाहरी असेंबलर का उपयोग कर रहे हैं, तो भी आपको संभवतः रिलोकेशन को समझने की आवश्यकता होगी और एक काम करने वाले टूल को बनाने के लिए पूरा प्रोग्राम लोड करने की प्रक्रिया कैसे काम करती है। यह पुस्तक Win32 और Linux सहित विभिन्न प्रणालियों के लिए इस प्रक्रिया के आसपास बहुत सारे यादृच्छिक विद्या एकत्र करती है।


10

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

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


10

यदि आप LLVM का उपयोग करने के इच्छुक हैं, तो इसे देखें: http://llvm.org/docs/tutorial/ । यह आपको एलएलवीएम की रूपरेखा का उपयोग करके खरोंच से एक कंपाइलर लिखने का तरीका सिखाता है, और आपको इस विषय के बारे में कोई ज्ञान नहीं है।

ट्यूटोरियल आपको सुझाव देता है कि आप अपने खुद के पार्सर और लेसर आदि को लिखें, लेकिन मैं आपको सलाह देता हूं कि विचार मिलते ही आप बायसन और फ्लेक्स पर गौर करें। वे जीवन को इतना आसान बनाते हैं।


लेकिन विजुअल स्टूडियो की स्थापना के लिए प्रलेखन बुरी तरह से लिखा गया है, साथ ही कोई उदाहरण नहीं
SpicyWeenie

10

मुझे ड्रैगन की किताब पढ़ने में बहुत कठिन लगती है, जो भाषा के सिद्धांत पर बहुत अधिक ध्यान देने के साथ पढ़ने के लिए है, जो वास्तव में संकलक को लिखने के लिए आवश्यक नहीं है।

मैं ओबेरॉन पुस्तक जोड़ूंगा जिसमें एक आश्चर्यजनक तेज़ और सरल ओबेरॉन संकलक प्रोजेक्ट ओबेरॉन का पूरा स्रोत है ।

वैकल्पिक शब्द


10

मुझे याद है कि यह सवाल सात साल पहले का है जब मैं प्रोग्रामिंग में नया था।

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

और हां, कई लोग कहते हैं कि किताब पढ़ना पागल है और आप इससे कुछ भी नहीं सीखेंगे, लेकिन मैं इससे पूरी तरह असहमत हूं।

कई लोग यह भी कहते हैं कि कंपाइलर लिखना मूर्खतापूर्ण और व्यर्थ है। संकलक विकास उपयोगी होने के कई कारण हैं:

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

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

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

पुस्तक भी अच्छी है यदि आप सीखना चाहते हैं कि पार्सर / दुभाषियों को कैसे लिखना है।


9

"... चलो एक कंपाइलर बनाएँ ..."

मैं @sasb द्वारा दूसरा http://compilers.iecc.com/crenshaw/ लाऊंगा । फिलहाल और किताबें खरीदना भूल जाएं।

क्यों? उपकरण और भाषा।

आवश्यक भाषा पास्कल है और अगर मुझे सही से याद है तो टर्बो-पास्कल पर आधारित है। यह सिर्फ इतना होता है अगर आप http://www.freepascal.org/ पर जाते हैं और पास्कल संकलक को डाउनलोड करते हैं, तो सभी उदाहरण पृष्ठ से सीधे काम करते हैं ~ http://www.freepascal.org/download.var मुफ्त की खूबसूरत बात पास्कल है कि आप इसे लगभग जो भी प्रोसेसर या ओएस आप उपयोग कर सकते हैं का उपयोग कर सकते हैं।

एक बार जब आप पाठ में महारत हासिल कर लेते हैं, तो अधिक उन्नत " ड्रैगन बुक " का प्रयास करें ~ http://en.wikipedia.org/wiki/Dagon.com


9

मैं एक ही अवधारणा को देख रहा हूं, और जोएल पोबर का यह होनहार लेख मिला।

.NET फ्रेमवर्क के लिए एक भाषा संकलक बनाएं - यह सुनिश्चित नहीं करें कि यह कहां गया है

.NET फ्रेमवर्क के लिए एक भाषा संकलक बनाएं - मूल डॉक्टर की पीडीएफ प्रति

वह एक संकलक की एक उच्च स्तरीय अवधारणा पर चर्चा करता है और .Net ढांचे के लिए अपने स्वयं के लैंगगॉव का आविष्कार करने के लिए आगे बढ़ता है। हालाँकि .Net फ्रेमवर्क में इसका उद्देश्य, कई अवधारणाओं को पुन: प्रस्तुत करने में सक्षम होना चाहिए। लेख में शामिल हैं:

  1. लैंग्वेज परिभाषा;
  2. चित्रान्वीक्षक
  3. Parser (बिट im मुख्य रूप से रुचि रखते हैं)
  4. .Net फ्रेमवर्क को लक्षित करना
  5. कोड जनरेटर

अन्य विषय भी हैं, लेकिन आपको यह उचित लगता है।

इसका आरंभ करने वाले लोगों के लिए इसका उद्देश्य C # में लिखा गया है (काफी जावा नहीं)

HTH

हड्डियों


"काफी जावा" का क्या अर्थ नहीं है?
हेजजमैन

haha, माफ करना, मैं इसका मतलब .Net के लिए लिखा था, जो मूल रूप से जावा के समान है। दोनों स्टाइल में JIT हैं। :)
dbones

8

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

C कोड जनरेट करना HTML (सिर्फ प्रिंट, या समतुल्य का उपयोग करना) जनरेट करने में उतना ही आसान है, जो बदले में C parser या HTML parser लिखने से ज्यादा आसान है।


8

से comp.compilers पूछे जाने वाले प्रश्न :

"ब्रिंच हेंसन प्रेंटिस-हॉल 1982 आईएसबीएन 0-13-730283-5 द्वारा" एक व्यक्तिगत कंप्यूटर प्रोग्रामिंग "

दुर्भाग्य से शीर्षक वाली इस पुस्तक में एडिसन नामक पास्कल जैसी भाषा का उपयोग करते हुए माइक्रो के लिए एकल-उपयोगकर्ता प्रोग्रामिंग वातावरण के डिजाइन और निर्माण की व्याख्या की गई है। लेखक एडिसन कंपाइलर और सरल सहायक ऑपरेटिंग सिस्टम के चरण-दर-चरण कार्यान्वयन के लिए सभी स्रोत कोड और स्पष्टीकरण प्रस्तुत करता है, सभी एडिसन में ही लिखे गए हैं (पीडीपी 11/23 के लिए एक प्रतीकात्मक कोडांतरक में लिखे गए एक छोटे सहायक कर्नेल को छोड़कर;) पूरा स्रोत आईबीएम पीसी के लिए भी आदेश दिया जा सकता है)।

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

"ब्रिंच हेन्सन ऑन पास्कल कम्पाइलर्स" प्रति ब्रिंच हेन्सन अप्रेंटिस-हॉल 1985 आईएसबीएन 0-1333030-4-4

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

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

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


8

आपको दारा बेकन के " ichbins " को देखना चाहिए , जो कोड के सिर्फ 6 से अधिक पृष्ठों में एक छोटी सी लिस्प बोली के लिए एक संकलक है, C को लक्षित करता है। अधिकांश खिलौना संकलकों में इसका लाभ यह है कि यह भाषा पर्याप्त रूप से पूरी हो गई है कि संकलक इसमें लिखा गया है। (टारबॉल में चीज़ को बूटस्ट्रैप करने के लिए एक दुभाषिया भी शामिल है।)

मेरे यूआर-स्कीम वेब पेज पर एक कंपाइलर लिखना सीखने में मुझे जो उपयोगी लगा, उसके बारे में अधिक चीजें हैं ।


8
  1. यह एक विशाल विषय है। इस बिंदु को कम मत समझो। और मेरी बात को कम मत समझो इसे कम मत समझना।
  2. मैंने सुना है कि ड्रैगन बुक खोज के साथ शुरू करने के लिए एक (?) जगह है। :) खोज करने में बेहतर हो, आखिरकार यह आपका जीवन होगा।
  3. अपनी खुद की प्रोग्रामिंग भाषा का निर्माण बिल्कुल अच्छा व्यायाम है! लेकिन जानते हैं कि इसका उपयोग अंत में किसी भी व्यावहारिक उद्देश्य के लिए नहीं किया जाएगा। इसके अपवाद कुछ और बहुत कम हैं।

4
यदि आपने ड्रैगन पुस्तक नहीं पढ़ी है। कृपया इसकी अनुशंसा न करें। वास्तव में, क्या आपने कभी एक कंपाइलर लागू किया है?

हाँ, जैसा कि नाम से ही स्पष्ट है, ड्रैगन बुक एक राक्षस है। बहुत गहराई से, लेकिन फिर भी बहुत अच्छा संसाधन। मैं इसे शुरुआती लोगों के लिए नहीं सुझाऊँगा, ...
ज़ाचरी मरे

2
@ नील: आपने मुझे गूगल नहीं किया, क्या आपने? जबरदस्त हंसी। blog.280z28.org लेकिन नहीं, मैंने वह किताब नहीं पढ़ी है।
सैम हरवेल

मैं इसे (ड्रैगन बुक) वर्तमान में पढ़ रहा हूं, और एक ही समय में लेक्स / याक भी, मुझे पुस्तक काफी अच्छी लग रही है। निजी तौर पर।
शिमोन पिलग्रिम

1
निष्पक्ष होने के लिए, मैंने इसे "मैं सुनता हूं ..." के साथ पूर्वनिर्मित किया। :) # 1 और # 3 ऐसे बिंदु हैं जो मुझे लगता है कि यह जानना बेहद जरूरी है लेकिन अक्सर इसका उल्लेख नहीं किया जाता है।
सैम हैवेल

8

फ्रेजर और हैनसन के LCC कंपाइलर ( विकिपीडिया ) ( प्रोजेक्ट होमपेज ) ( github.com/drh/lcc ) का वर्णन उनकी पुस्तक "ए रिटारगेबल सी कंपाइलर: डिज़ाइन एंड इम्प्लीमेंटेशन" में किया गया है। यह काफी पठनीय है और पूरे संकलक को समझाता है, कोड पीढ़ी तक।


यह एक बहुत अच्छा संसाधन धन्यवाद की तरह लगता है ।
गिदोन

7

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


7

क्षमा करें, यह स्पैनिश में है, लेकिन अर्जेंटीना में "कंपिलाडोर्स ई इंटेरिप्टेस" (कंपाइलर और इंटरप्रिटर्स) नामक पाठ्यक्रम की ग्रंथ सूची है।

पाठ्यक्रम औपचारिक भाषा सिद्धांत से संकलक निर्माण तक था, और ये ऐसे विषय हैं जिन्हें आपको बनाने की आवश्यकता है, कम से कम, एक सरल संकलक:

  • सी।
    एलन आई। होलूब

    अप्रेंटिस-हॉल में कंपाइलर डिज़ाइन । 1990।

  • Compiladores। तोरिआ य कॉन्स्ट्रुइकॉन।
    सांची लोरका, एफजे, गैलन पास्कुअल, सी। एडिटोरियल परानिनफो। 1988।

  • संकलक निर्माण।
    निकलॉस विर्थ

    एडिसन-वेस्ले। 1996।

  • लिन्गजेस, ग्रामैटिकास वाई ऑटोमेट्स। अन एनोफ़ेक्ट प्राक्टिको।
    पेड्रो इससी विनुएला, पालोमा मार्टिनेज फर्नांडीज, डैनियल बोरराजो मिलन। एडिसन-वेस्ले इबेरोमेरिकाना (एस्पाना)। 1997।

  • संकलक डिजाइन की कला। सिद्धांत और अभ्यास।
    थॉमस पिटमैन, जेम्स पीटर्स।

    शागिर्द कक्ष। 1992।

  • ऑब्जेक्ट-ओरिएंटेड कम्पाइलर कंस्ट्रक्शन।
    जिम होम्स।
    अप्रेंटिस हॉल, एंगलवुड क्लिफ्स, एनजे 1995

  • Compiladores। कॉन्सेप्टोस फंडामेंटल।
    बी। टेफेल, एस। श्मिट, टी। ट्युफेल।

    एडिसन-वेस्ले इबेरोमेरिकाना। 1995।

  • ऑटोमेटा थ्योरी, भाषा और संगणना का परिचय।

    जॉन ई। होपक्रॉफ्ट। जेफ़री डी। उल्मन।
    एडिसन-वेस्ले। 1979।

  • औपचारिक भाषाओं का परिचय।
    ग्योर्गी ई। रेवेज़।

    मैक ग्रे हिल। 1983।

  • पार्सिंग तकनीक। एक प्रैक्टिकल गाइड।
    डिक ग्रुन, सेरिएल जैकब्स।
    इम्प्रेसो पोर लॉस ऑटोरस। 1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc: फिर भी एक और संकलक-संकलक।
    स्टीफन सी। जॉनसन
    कम्प्यूटिंग साइंस टेक्निकल रिपोर्ट Nº 32, 1975. बेल लेबोरेटरीज। मरे हिल, न्यू
    जर्सी।

  • लेक्स: एक लेक्सिकल एनालाइजर जेनरेटर।
    एमई लेसक, ई। श्मिट। कम्प्यूटिंग विज्ञान तकनीकी रिपोर्ट Nº 39, 1975. बेल प्रयोगशालाओं। मरे हिल, न्यू जर्सी।

  • लेक्स और याक।
    जॉन आर लेविन, टोनी मेसन, डग ब्राउन।
    ओ'रेली एंड एसोसिएट्स। 1995।

  • गणना के सिद्धांत के तत्व।
    हैरी आर लुईस, क्रिस्टोस एच। पापादिमित्रिउ। सेगुंडा एडिसन। शागिर्द कक्ष। 1998।

  • अन अल्गोरिटो एफिसिएंटे पैरा ला कॉन्स्ट्रुइकॉन डेल ग्रेफो डे डिपेंडेंसिया डी कंट्रोल।
    सल्वाडोर वी। कैवादिनी।
    ट्राबाजो फाइनल डे ग्रैडो पैरा ओबटनर एल टीटुलो डी इनगेनिएरो एन कॉम्पुटेसियन।
    फैकल्टाद डी माटेमैटिका अप्लिकाडा। यूसीएसई 2001।


6

यदि आप संकलक (और मेटाकैम्पलर) के बारे में अधिक जानना चाहते हैं, तो एक पुस्तक नहीं, बल्कि एक तकनीकी पेपर और एक बहुत ही मजेदार सीखने का अनुभव ... यह वेबसाइट आपको पूरी तरह से आत्म-संकलक प्रणाली बनाने के माध्यम से चलता है जो स्वयं और अन्य भाषाओं को संकलित कर सकती है:

ट्यूटोरियल: मेटाकैम्पलर भाग 1

यह सब एक अद्भुत छोटे 10-पृष्ठ तकनीकी पेपर पर आधारित है:

वैल स्कोरे मेटा II: एक सिंटेक्स-ओरिएंटेड कम्पाइलर राइटिंग लैंग्वेज

ईमानदार-से-भगवान 1964 से। मैंने सीखा कि 1970 में इस बैक से कंपाइलर कैसे बनाए गए। एक मन उड़ाने वाला पल है जब आप आखिरकार कैसे ग्रिप करते हैं कि कंपाइलर कैसे खुद को फिर से बना सकता है ...।

मैं अपने कॉलेज के दिनों से वेबसाइट लेखक को जानता हूं, लेकिन मुझे वेबसाइट से कोई लेना-देना नहीं है।


जैसा कि दूसरों का कहना है, BIG तर्क है, मुझे लगता है कि सुशी एक काम स्नातक के लिए एक अंतिम काम है, इसके लिए गणित, कंप्यूटर विज्ञान और इतने पर अवधारणाओं की एक बहुत कुछ जानना आवश्यक है।
ingconti

यदि आप इन विषयों को नहीं जानते हैं, तो आपको वास्तव में एक गंभीर संकलक बनाने की कोशिश नहीं करनी चाहिए। हालाँकि, यदि आपके पास 2-3 साल की स्नातक कंप्यूटर विज्ञान की शिक्षा (प्रोग्रामिंग, डेटा संरचनाएं, असेंबली लैंग्वेज) है, तो MetaII पेपर आपके लिए काम करेगा।
इरा बैक्सटर

5

मुझे क्रैंशव ट्यूटोरियल भी पसंद आया , क्योंकि यह पूरी तरह से स्पष्ट करता है कि एक कंपाइलर सिर्फ एक और प्रोग्राम है जो कुछ इनपुट को पढ़ता है और कुछ लिखता है।

इसे पढ़ें।

यदि आप चाहें तो इसे काम करें, लेकिन फिर एक और संदर्भ देखें कि वास्तव में कितने बड़े और अधिक पूर्ण संकलक लिखे गए हैं।

और ट्रस्टिंग ट्रस्ट पर पढ़ें , इस डोमेन में किए जा सकने वाली अस्पष्ट चीजों के बारे में एक सुराग पाने के लिए।


5

यदि आप एक कार्यात्मक भाषा (एक प्रक्रियात्मक एक के बजाय) साइमन पिएटन-जोन्स और डेविड लेस्टर की " कार्यात्मक भाषाओं को लागू करना: एक ट्यूटोरियल " के लिए एक कंपाइलर लिखने में रुचि रखते हैं, तो यह एक उत्कृष्ट मार्गदर्शक है।

कार्यात्मक मूल्यांकन कैसे काम करता है की वैचारिक मूल बातें "कोर" नामक एक सरल लेकिन शक्तिशाली कार्यात्मक भाषा में उदाहरणों द्वारा निर्देशित होती हैं। इसके अतिरिक्त, कोर भाषा संकलक के प्रत्येक भाग को मिरांडा (हस्केल के समान शुद्ध कार्यात्मक भाषा) में कोड उदाहरणों के साथ समझाया गया है।

कई अलग-अलग प्रकार के कंपाइलरों का वर्णन किया गया है, लेकिन अगर आप केवल कोर के लिए तथाकथित टेम्पलेट कंपाइलर का पालन करते हैं, तो आपको कार्यात्मक प्रोग्रामिंग टिक बनाने की उत्कृष्ट समझ होगी।


5

आप Apache Software Foundation द्वारा BCEL का उपयोग कर सकते हैं । इस उपकरण के साथ आप कोडांतरक जैसा कोड उत्पन्न कर सकते हैं, लेकिन यह BCEL API के साथ जावा है। आप सीख सकते हैं कि आप मध्यवर्ती भाषा कोड कैसे बना सकते हैं (इस मामले में बाइट कोड)।

सरल उदाहरण है

  1. इस फ़ंक्शन के साथ एक जावा वर्ग बनाएँ:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

अब इस वर्ग के साथ BCELifier चलाएं

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

आप पूरी कक्षा के लिए कंसोल पर परिणाम देख सकते हैं (बाइट कोड MyClass.java कैसे बनाएं)। फ़ंक्शन का कोड यह है:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

5

यहाँ बहुत सारे अच्छे उत्तर हैं, इसलिए मैंने सोचा कि मैं सूची में एक और जोड़ दूंगा:

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

http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf

निकलॉस विर्थ, जर्ग गुटकेनचट

(उपचार संकलक पर उनकी पुस्तक के रूप में व्यापक नहीं है)

मैंने कंपाइलरों पर कई किताबें पढ़ी हैं, और मैं ड्रैगन बुक को दूसरा स्थान दे सकता हूं, इस पुस्तक पर खर्च किया गया समय बहुत सार्थक है।


4

अभी तक सूची में शामिल नहीं है यह पुस्तक:

कम्पाइलर डिज़ाइन की मूल बातें (टोरेन मोगेन्सेन) (कंप्यूटर विज्ञान के कोपेनहेगन विश्वविद्यालय से)

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


इसे सूची में शामिल किया गया धन्यवाद :)
एंटोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.