दिलचस्प पोस्ट
एक फ़ाइल पर सीधा पहुंच को ब्लॉक करें, लेकिन PHP स्क्रिप्ट का उपयोग करें क्यों rbindlist rbind की तुलना में "बेहतर" है? सी काम में फंक्शन पॉइंटर्स कैसे करते हैं? एक व्यस्त प्रतीक्षा लूप को अनुकूलित करने से जीसीसी को कैसे रोकें? लूप के अंदर एक वेक्टर के तत्व निकालें कोई एनीमेशन के साथ xcode में segue दबाएं स्विफ्ट में UI_USER_INTERFACE_IDIOM () के साथ वर्तमान उपकरण का पता लगाएं Session_register () नापसंद समस्या को ठीक कैसे करें? खोज के लिए ASP.NET MVC कस्टम रूटिंग Android UI में गोल आयत कैसे आकर्षित करें? मैं कब कोष्ठक का उपयोग करता हूं और कब नहीं करता? सिस्टम टेबल मास्टर का उद्देश्य क्या है … spt_values ​​और उसके मूल्यों के अर्थ क्या हैं? जावा में एक शक्ति के लिए संख्या बढ़ाना नेविगेशनबार में UISearchBar टीसीपी सॉकेट वियोग का पता लगाने के लिए (सी बर्कले सॉकेट के साथ)

एक कंपाइलर लिखना सीखना

पसंदीदा भाषा : सी / सी ++, जावा, और रूबी

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

वेब के समाधान से एकत्रित समाधान "एक कंपाइलर लिखना सीखना"

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

  • कंपाइलर शिक्षा के लिए एक नैनोपास फ्रेमवर्क
  • उन्नत कंपाइलर डिजाइन और कार्यान्वयन $
  • कंपाइलर निर्माण के लिए एक वृद्धिशील दृष्टिकोण
  • एएनटीएलआर 3.x वीडियो ट्यूटोरियल
  • कंपाइलर डिजाइन की मूल बातें
  • एक तोता संकलक का निर्माण
  • कंपाइलर मूल बातें
  • कंपाइलर निर्माण $
  • कंपाइलर डिजाइन और निर्माण $
  • C $ के साथ एक कंपाइलर क्राफ्टिंग
  • सी र्य में संकलक डिजाइन
  • कंपाइलर्स: सिद्धांत, तकनीक, और उपकरण $ – उर्फ "द ड्रैगन बुक" ; कंपाइलर लेखन के लिए व्यापक रूप से "पुस्तक" माना जाता है
  • इंजीनियरिंग एक कंपाइलर $
  • प्रोग्रामिंग भाषाओं की अनिवार्यताएं
  • फ्लिपकोड अनुच्छेद पुरालेख ("जन न्येष्टेड द्वारा एक स्क्रिप्टिंग इंजन को कार्यान्वित करना" देखें)
  • खेल स्क्रिप्टिंग महारत $ $
  • सी # ¶ में खरोंच से वर्चुअल मशीन कैसे तैयार करें
  • कार्यात्मक भाषाओं को कार्यान्वित करना
  • कार्यान्वयन प्रोग्रामिंग भाषाओं (बीएनएफसी के साथ)
  • सी # 4.0 का उपयोग करके प्रोग्रामिंग भाषाओं को कार्यान्वित करना
  • इंटरप्रेटर पैटर्न ( डिजाइन पैटर्न $ में वर्णित) एक भाषा में वाक्यों का मूल्यांकन करने के लिए एक तरीका निर्दिष्ट करता है
  • भाषा कार्यान्वयन पैटर्न: अपनी खुद की डोमेन-विशिष्ट और सामान्य प्रोग्रामिंग भाषाएं बनाएँ
  • चलो जैक क्रेंशो द्वारा एक कंपाइलर बनाएँ – पीडीएफ ¶ संस्करण (उदाहरण पास्कल में हैं, लेकिन सूचना आम तौर पर लागू होती है)
  • लिंकर्स और लोडर $ (Google पुस्तकें)
  • छोटे टुकड़ों में लिस्प (लीज़) $
  • एलएलवीएम ट्यूटोरियल
  • एमएल $ में आधुनिक कंपाइलर कार्यान्वयन – एक जावा $ और सी $ संस्करण भी है – व्यापक रूप से बहुत अच्छी किताब माना जाता है
  • वस्तु-उन्मुख संकलक निर्माण $
  • पार्सिंग तकनीक – एक व्यावहारिक गाइड
  • परियोजना ओबेरन ¶ – अध्याय 13 को देखो
  • प्रोग्रामिंग एक पर्सनल कंप्यूटर $
  • प्रोग्रामिंग भाषाएँ: अनुप्रयोग और व्याख्या
  • खरगोश: योजना ¶ के लिए एक संकलक
  • विश्वास ट्रस्ट पर प्रतिबिंब – एक त्वरित गाइड
  • .NET ढांचे के लिए अपना स्वयं का कंपाइलर रोल करें – MSDN से एक त्वरित ट्यूटोरियल
  • संरचना और कंप्यूटर प्रोग्राम की व्याख्या
  • प्रकार और प्रोग्रामिंग भाषाएँ
  • एक कंपाइलर लिखना चाहते हैं? – एक त्वरित गाइड
  • रूबी नीचे में एक कंपाइलर लेखन

लीजेंड:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

नीचे दी गई पुस्तक को देखें लेखक एएनटीएलआर का निर्माता है

भाषा कार्यान्वयन पैटर्न: अपनी खुद की डोमेन-विशिष्ट और सामान्य प्रोग्रामिंग भाषाएं बनाएँ

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

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

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

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

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

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

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

.NET फ़्रेमवर्क के लिए एक भाषा कंपाइलर बनाएँ

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

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

वहाँ अन्य विषय हैं, लेकिन आप अभी मिलते हैं।

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

HTH

हड्डियों

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

मुझे दूसरा http://compilers.iecc.com/crenshaw/ @sasb होगा पल के लिए और किताबें खरीदने के लिए भूल जाओ

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

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

एक बार जब आप सबक में महारत हासिल कर लेंगे तो अधिक उन्नत " ड्रैगन बुक " की कोशिश करें- http://en.wikipedia.org/wiki/Dragon_book

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

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

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

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

जनरेटिंग सी कोड एचटीएमएल (सिर्फ प्रिंट, या समतुल्य का उपयोग) के रूप में आसान है, जो सी पार्सर या एचटीएमएल पार्सर लिखने से काफी आसान है।

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

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

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

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

"ब्रिस्च हैनसेन ऑन पास्कल कंपाइलर" प्रति ब्रिनंच हंसेंन प्रेंटिस-हॉल 1 9 8 9 आईएसबीएन 0-13-0830 9 4

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

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

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

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

मेरे उर-योजना वेब पेज पर एक कंपाइलर लिखने में सीखने में मुझे कितना उपयोगी मिला है, इसके बारे में और चीजें हैं I

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

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

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

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

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

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

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

फ्रेजर और हैनसन के एलसीसी संकलक ( प्रोजेक्ट होमपेज ) का वर्णन "ए रिटेन्सेडेजबल सी कम्पाइलर: डिज़ाईन एंड इम्प्लिमेंटेशन" में किया गया है। यह काफी पठनीय है और पूरे संकलक को बताता है, नीचे कोड पीढ़ी के लिए।

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

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

  • सी में संकलक डिज़ाइन
    एलन आई। होलब

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

  • Compiladores। तेोरिया वाई कन्स्ट्रुशिओन
    संची लिलोका, एफजे, गलान पास्कुल, सी। संपादकीय परानिन्फो। 1988।

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

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

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

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

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

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

  • Compiladores। संकल्पना निधि
    बी। टेफेल, एस। श्मिट, टी। टेफेल

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

  • ऑटोमेटा सिद्धांत, भाषा और कम्प्यूटेशन का परिचय

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

  • औपचारिक भाषाओं का परिचय
    György E. Révész

    मैक गॉ हिल हिल 1983।

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

  • Yacc: अभी तक एक और संकलक-संकलक
    स्टीफन सी। जॉनसन
    कंप्यूटिंग साइंस तकनीकी रिपोर्ट एन.ओ. 32, 1 9 75. बेल लेबोरेटरीज मुर्रे हिल, नई
    जर्सी।

  • लेक्स: एक लेक्सिकल एनालाइज़र जेनरेटर
    एमई लेस्क, ई। श्मिट कम्प्यूटिंग साइंस तकनीकी रिपोर्ट एनओएन 39, 1 9 75. बेल लेबोरेटरीज मरे हिल, न्यू जर्सी

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

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

  • कंट्रोलसिओन डेल ग्रेफ़ो डि डिप्टेंसिया डि कंट्रोल
    साल्वाडोर वी। कवडिनी
    Trabajo अंतिम डे grado के लिए खोज करने के लिए इंटीरियर में तैनात
    मैत्रेटिक एपिकडाड की सुविधा यूसीएसई 2001

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

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

http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf

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

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

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

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

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

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

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

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

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

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

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

ईमानदारी से देवता 1 9 64 से। मैंने सीखा है कि 1 9 70 में इस पीठ से कम्पाइलर बनाने का तरीका क्या था। जब आप आखिरकार संकलक को खुद को पुनर्जन्म कर सकते हैं, तो मन-उड़ाने का क्षण होता है ….

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

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

इसे पढ़ें।

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

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

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

सरल उदाहरण

  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"; } } 

Now run BCELifier with this class

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

You can see the result on the console for the whole class (how to build byte code MyClass.java). The code for the function is this:

 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(); } 

The Dragon Book is too complicated. So ignore it as a starting point. It is good and makes you think a lot once you already have a starting point, but for starters, perhaps you should simply try to write an math/logical expression evaluator using RD, LL or LR parsing techniques with everything (lexing/parsing) written by hand in perhaps C/Java. This is interesting in itself and gives you an idea of the problems involved in a compiler. Then you can jump in to your own DSL using some scripting language (since processing text is usually easier in these) and like someone said, generate code in either the scripting language itself or C. You should probably use flex/bison/antlr etc to do the lexing/parsing if you are going to do it in c/java.