मैं अपनी प्रोग्रामिंग भाषा और उसके लिए एक संकलक कैसे बनाऊं [बंद]


427

मैं प्रोग्रामिंग के साथ पूरी तरह से हूं और बेसिक्स, फोरट्रान, कोबोल, एलआईएसपी, लोगो, जावा, सी ++, सी, मैटलैब, मैथमैटिका, पायथन, रूबी, पर्ल, जावास्क्रिप्ट, असेंबली और आदि भाषाओं में आया हूं। मैं समझ नहीं पा रहा हूं कि कैसे लोग प्रोग्रामिंग लैंग्वेज बनाते हैं और इसके लिए कंपाइलर तैयार करते हैं। मुझे यह भी समझ में नहीं आया कि लोग विंडोज, मैक, यूनिक्स, डॉस और इतने पर ओएस कैसे बनाते हैं। दूसरी बात जो मेरे लिए रहस्यमयी है, वह यह है कि लोग कैसे OpenGL, OpenCL, OpenCV, कोको, MFC और इतने पर लाइब्रेरियों का निर्माण करते हैं। आखिरी बात मैं यह पता लगाने में असमर्थ हूं कि वैज्ञानिकों ने एक विधानसभा भाषा और एक माइक्रोप्रोसेसर के लिए एक असेंबलर कैसे तैयार किया है। मैं वास्तव में इन सभी चीजों को सीखना चाहूंगा और मैं 15 साल का हूं। मैं हमेशा बैबेज, ट्यूरिंग, शैनन, या डेनिस रिची जैसे कंप्यूटर वैज्ञानिक बनना चाहता था।


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


आप यूनिक्स / लिनक्स पर हैं, तो आप समर्पित उपकरणों के बारे में जानकारी प्राप्त कर सकते हैं: lex, yaccऔर bison
मौविसील

मेरा पहला सुझाव अहो द्वारा ड्रैगन बुक पढ़ना होगा। amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/…
जूलियन

1
शायद बहुत उपयोगी नहीं है, लेकिन मैं के माध्यम से जा करने की सलाह देते sites.google.com/site/steveyegge2/blog-rants (स्टीव येग के ब्लॉग), और steve-yegge.blogspot.com/ (स्टीव येग के अन्य ब्लॉग)।
केके

3
जितनी हो सके उतनी प्रोग्रामिंग लैंग्वेज सीखें। इस तरह आप उनकी अवधारणाओं के साथ-साथ उनकी गलतियों से भी सीखेंगे। जब आप दिग्गजों के कंधे पर खड़े हो सकते हैं, तो बौनों के साथ क्यों रहें?
sbi

1
संकेत: एक दुभाषिया एक संकलक की तुलना में आसान है; यह सिर्फ एक वर्ग है जो इनपुट टेक्स्ट के आधार पर "कुछ करता है" जो लाइन द्वारा लाइन को पढ़ता है। एक और संकेत: इसे प्रतिबिंब के लिए टाई करें और आप अपनी स्क्रिप्ट के साथ मनमानी वस्तुओं को नियंत्रित कर सकते हैं।
डेव कजिनो

जवाबों:


407

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

उस ने कहा, मैं एक दरार ले जा सकते हैं:

मैं समझ नहीं पा रहा हूं कि कैसे लोग प्रोग्रामिंग लैंग्वेज बनाते हैं और इसके लिए कंपाइलर तैयार करते हैं।

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

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

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

वैकल्पिक रूप से, उस डोमेन पर विचार करें जिसे आप रुचि रखते हैं और फिर एक डोमेन-विशिष्ट भाषा (DSL) डिज़ाइन करें जो उस डोमेन में समस्याओं के समाधान को निर्दिष्ट करता है। आपने लोगो का उल्लेख किया; यह "लाइन ड्राइंग" डोमेन के लिए एक डीएसएल का एक शानदार उदाहरण है। "स्ट्रिंग में एक पैटर्न खोजें" डोमेन के लिए नियमित अभिव्यक्ति एक डीएसएल है। LINQ in C # / VB "फ़िल्टर, जॉइन, सॉर्ट और प्रोजेक्ट डेटा" डोमेन के लिए एक डीएसएल है। HTML एक "पृष्ठ पर पाठ के लेआउट का वर्णन" डोमेन के लिए एक डीएसएल है, और इसी तरह। बहुत सारे डोमेन हैं जो भाषा-आधारित समाधानों के लिए उत्तरदायी हैं। मेरा पसंदीदा में से एक Inform7 है, जो "टेक्स्ट-बेस्ड एडवेंचर गेम" डोमेन के लिए एक डीएसएल है; यह शायद उच्चतम स्तर की गंभीर प्रोग्रामिंग भाषा है जिसे मैंने कभी देखा है।

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

  1. शाब्दिक : भाषा में शब्दों के लिए क्या नियम हैं, कौन से वर्ण कानूनी हैं, संख्याएँ क्या दिखती हैं, इत्यादि।
  2. वाक्यात्मक : भाषा के शब्द बड़ी इकाइयों में कैसे संयोजित होते हैं? C # में बड़ी इकाइयाँ अभिव्यक्तियों, कथनों, विधियों, वर्गों और इसी तरह की चीजें हैं।
  3. सिमेंटिक : एक वाक्य्यात्मक रूप से कानूनी कार्यक्रम दिया गया, आप यह कैसे पता लगाते हैं कि प्रोग्राम क्या करता है ?

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

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

मैं सी #, वीबी, वीबीएसस्क्रिप्ट, जावास्क्रिप्ट और अन्य भाषाओं और उपकरणों के डिजाइन के बारे में एक ब्लॉग लिखता हूं; यदि यह विषय आपको पसंद करता है, तो इसे देखें। http://blogs.msdn.com/ericlippert (ऐतिहासिक) और http://ericlippert.com (वर्तमान)

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

http://blogs.msdn.com/b/ericlippert/archive/2010/02/04/how-many-passes.aspx

अंत में, यदि आप बड़े होने पर इस सामान को करने के लिए नौकरी की तलाश कर रहे हैं, तो Microsoft को कॉलेज इंटर्न के रूप में आने और डेवलपर डिवीजन में लाने की कोशिश करने पर विचार करें। यही कारण है कि मैं आज अपनी नौकरी के साथ समाप्त हो गया!


क्या आपने इस बारे में लिखा है कि अब कौन से डिग्री संकलक अनुकूलन नहीं किए जा रहे हैं क्योंकि सीएलआर उन्हें स्वचालित रूप से कर सकता है?

6
@ थोरबजोर्न: चलो शब्दावली के बारे में स्पष्ट हो। एक "कंपाइलर" कोई भी उपकरण है जो एक प्रोग्रामिंग भाषा से दूसरे में अनुवाद करता है। C # संकलक होने के बारे में एक अच्छी बात है जो C # को IL में बदल देता है, और एक IL कंपाइलर ("घबराना") जो IL को मशीन कोड में बदल देता है, वह यह है कि आपको C # कंपाइलर को IL (आसान!) लिखना है। प्रोसेसर-विशिष्ट अनुकूलन को घबराहट में रखें। यह नहीं है कि संकलक अनुकूलन "नहीं किया जा रहा है", यह है कि जिट संकलक टीम उन्हें हमारे लिए करती है। ब्लॉगs.msdn.com/b/ericlippert/archive/2009/06/11/…
एरिक

6
@ Cyclotis04: Inform6 Z- कोड के लिए संकलित करता है, जो कि एक बाईटेकोड आधारित आभासी मशीन का एक प्रसिद्ध अत्यंत प्रारंभिक उदाहरण है। यही कारण है कि 1980 के दशक में उन सभी इन्फोकॉम गेम्स स्मृति और पोर्टेबल से कई आर्किटेक्चर से बड़े हो सकते हैं; खेल को जेड-कोड के लिए संकलित किया गया और फिर कोड मेमोरी पेजिंग के साथ जेड-कोड दुभाषियों को कई मशीनों के लिए लागू किया गया। आजकल बेशक आप एक कलाई घड़ी पर एक ज़ेडकोड ​​दुभाषिया चला सकते हैं यदि आपको ज़रूरत है, लेकिन उस दिन में वापस जो उच्च तकनीक थी । देखें en.wikipedia.org/wiki/Z-machine जानकारी के लिए।
एरिक लिपर्ट

@ EricLippert कंपाइलर एक डिवाइस नहीं है, डिवाइस कुछ है जिसमें हार्डवेयर शामिल है। हम एक पूर्वनिर्धारित कार्यक्रम कह सकते हैं जिसमें इनपुट डेटा को मशीन कोड में बदलने के लिए नियमों का एक सेट है
dharam

2
@dhams: एक डिवाइस किसी विशेष उद्देश्य के लिए बनाई गई कोई भी चीज है। मेरे द्वारा लिखे गए प्रत्येक कंपाइलर को हार्डवेयर पर चलाया गया था जो कि कंपाइलरों को अस्तित्व में लाने के लिए उद्देश्य से बनाया गया था।
एरिक लिपर्ट

127

हो सकता है कि आपको जैक क्रेंशॉ द्वारा कम्पाइलर और असेंबली लैंग्वेज लिखने के लिए एक दिलचस्प परिचय मिल जाए।

लेखक ने इसे बहुत सरल रखा और वास्तविक कार्यक्षमता के निर्माण पर ध्यान केंद्रित किया।


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

3
@ मानवता, आपको यह महसूस करने की आवश्यकता है कि साधनों का उपयोग करने का एक कारण है।

72

"मैं वास्तव में इस सामान को सीखना चाहूंगा"। यदि आप लंबे समय तक गंभीर हैं:

  • कॉलेज जाएं, सॉफ्टवेयर इंजीनियरिंग में विशेषज्ञता हासिल करें। प्रत्येक संकलक वर्ग लें जो आप प्राप्त कर सकते हैं। वे लोग जो कक्षाएं प्रदान करते हैं वे आपसे बेहतर शिक्षित और अनुभवी हैं; अपने विशेषज्ञ दृष्टिकोणों का उपयोग करने के लिए अच्छा है कि आप उन तरीकों से जानकारी प्रस्तुत करें जो आपको पढ़ने के कोड से कभी नहीं मिलेंगे।

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

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

  • एक कंपाइलर बनाएँ। एक सड़ा हुआ निर्माण करके अब शुरू करो। यह आपको कुछ मुद्दों को सिखाएगा। एक दूसरा निर्माण करो। दोहराएँ। यह अनुभव आपकी पुस्तक सीखने के साथ बहुत बड़ा तालमेल बनाता है।

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

यदि आप संकलन के लिए एक महान पहला परिचय चाहते हैं, और बीएनएफ का प्रत्यक्ष मूल्य न केवल प्रलेखन के लिए, बल्कि एक उपकरण-प्रक्रिया योग्य मेटलंगेज के रूप में, इस ट्यूटोरियल ("मेरा नहीं)" मेटा "कंपाइलरों (संकलनकर्ता जो कंपाइलरों का निर्माण करते हैं) के आधार पर देखें कागज 1964 से (हाँ, आपने पढ़ा है कि सही) ["META II एक सिंटैक्स-उन्मुख संकलक भाषा लेखन" Val Schorre द्वारा। (http://doi.acm.org/10.1145/800257.808896)] यह IMHO अब तक के लिखे गए सबसे अच्छे कंप-साइज़-पेपर में से एक है: यह आपको 10 पन्नों में कंपाइलर-कंपाइलर बनाना सिखाता है। मैंने शुरुआत में इस पेपर से सीखा।

मैंने ऊपर जो लिखा है वह व्यक्तिगत अनुभव से बहुत कुछ है, और मुझे लगता है कि इसने मुझे बहुत अच्छी तरह से सेवा दी है। YMMV, लेकिन IMHO, बहुत से नहीं।


54
-1 उपरोक्त में से कोई भी आवश्यक नहीं है।
नील बटरवर्थ

77
@nbt उपरोक्त में से कोई भी आवश्यक नहीं है। लेकिन उपरोक्त सभी मदद करता है। वास्तव में बहुत कुछ।
कोनराड रुडोल्फ

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

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

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

46

यहाँ एक ऑनलाइन पुस्तक / पाठ्यक्रम है जिसे आप कम्प्यूटिंग सिस्टम के तत्वों का पालन ​​कर सकते हैं : पहले सिद्धांतों से एक आधुनिक कंप्यूटर का निर्माण

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

अध्याय:

  1. पाठ्यक्रम अवलोकन
  2. बूलियन लॉजिक
  3. कंबाइनोरियल चिप्स
  4. अनुक्रमिक चिप्स
  5. मशीन भाषा
  6. कंप्यूटर आर्किटेक्चर
  7. कोडांतरक
  8. वर्चुअल मशीन I: अंकगणित
  9. वर्चुअल मशीन II: नियंत्रण
  10. प्रोग्रामिंग भाषा
  11. कंपाइलर I: सिंटेक्स एनालिसिस
  12. कंपाइलर II: कोड जेनरेशन
  13. ऑपरेटिंग सिस्टम
  14. सामग्री सूचीबद्ध करें

अधिक मज़ा करने के लिए जाओ


संपादन के लिए धन्यवाद, अज्ञात व्यक्ति। मैंने कई बार कोशिश की लेकिन अपने विचारों को वर्णन के लिए पर्याप्त रूप से केंद्रित नहीं कर पाया ... लेकिन पुस्तक का उल्लेख नहीं करना चाहता था। पुस्तक अब स्टडी प्लान लिंक पर ऑनलाइन है: www1.idc.ac.il/tecs/plan.html । यह बहुत ही उचित ऑनलाइन मूल्य है। सभी का आनंद लें।
जो इंटरनेट

मैं खुद यह सुझाव देने जा रहा था ... आलसी के लिए, 10 मिनट के इंट्रो की जाँच करें: नंद से लेकर टेट्रिस तक 12 चरणों में @ youtube.com/watch?v=JtXvUoPx4Qs
रिचर्ड एंथनी हेन

46

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

भाषाओं को प्रोग्रामिंग भाषा होने की आवश्यकता नहीं है। वे कोई भी भाषा हो सकती है जिसके नियम नीचे लिखे जा सकते हैं। आपने शायद Google अनुवाद देखा है ; यह एक संकलक है क्योंकि यह एक भाषा (जैसे जर्मन) को दूसरे (जापानी, शायद) में अनुवाद कर सकता है।

कंपाइलर का एक अन्य उदाहरण एक HTML रेंडरिंग इंजन है। इसका इनपुट एक HTML फ़ाइल है और आउटपुट स्क्रीन पर पिक्सेल खींचने के लिए निर्देशों की एक श्रृंखला है।

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

क्या आप एक प्रोग्राम लिख सकते हैं जो एक स्ट्रिंग में प्रत्येक शब्द को उलट देता है? उदाहरण के लिए:

When the cat's away, the mice will play.

हो जाता है

nehW eht s'tac yawa, eht ecim lliw yalp.

यह लिखने के लिए एक कठिन कार्यक्रम नहीं है, लेकिन आपको कुछ चीजों के बारे में सोचने की जरूरत है:

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

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

इसके बारे में कैसे: क्या आप एक प्रोग्राम लिख सकते हैं जो ड्राइंग निर्देशों की एक श्रृंखला लेता है और एक पीएनजी (या जेपीईजी) फ़ाइल को आउटपुट करता है? शायद कुछ इस तरह:

image 100 100
background black
color red
line 20 55 93 105
color green
box 0 0 99 99

फिर, आपको भाषा को परिभाषित करने के लिए कुछ सोचने की आवश्यकता होगी:

  • आदिम निर्देश क्या हैं?
  • "लाइन" शब्द के बाद क्या आता है? "रंग" के बाद क्या आता है? इसी तरह "पृष्ठभूमि", "बॉक्स", आदि के लिए।
  • एक संख्या क्या है?
  • क्या खाली इनपुट फ़ाइल की अनुमति है?
  • क्या शब्दों को भुनाना ठीक है?
  • क्या नकारात्मक संख्या की अनुमति है?
  • यदि आप "छवि" निर्देश नहीं देते हैं तो क्या होता है?
  • क्या रंग निर्दिष्ट नहीं करना ठीक है?

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

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


7
myFirstCompiler = (str) -> ("" + (str || ""))। विभाजन ('')। jsfiddle.net/L7qSr
लैरी बैटल

21

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


4
ध्यान दें, इस पुस्तक का अधिकतम लाभ उठाने के लिए आपको थोड़ा और वास्तविक अनुभव की आवश्यकता हो सकती है। महान संदर्भ, हालांकि।

13
-1 केवल कोई व्यक्ति जो इसे नहीं पढ़ सकता है वह सोच सकता है कि ड्रैगन बुक कोई अच्छी है। और यह विशेष रूप से प्रश्न को संबोधित नहीं करता है।
नील बटरवर्थ

33
ड्रैगन बुक? एक उत्साही पंद्रह वर्षीय के लिए? मैं नहीं बल्कि उसे अपने उत्साह को थोड़ी देर रखना होगा।
डेविड थॉर्नले


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

10

"चलो एक कंपाइलर का निर्माण करें" पहले से ही सुझाया गया था। टर्बो पास्कल के बजाय हास्केल का उपयोग करके एक "आधुनिक" संस्करण है: http://alephnullplex.appspot.com/blog/view/2010/01/12/lbach-1-introduction

हास्केल को ध्यान में रखते हुए, एक बहुत ही शिक्षाप्रद योजना दुभाषिया है जो आगे के विचार दे सकता है: 48 घंटे में खुद को एक योजना लिखें


10

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

हर कार्यक्रम के तीन चरण होते हैं:

  1. कुछ सामान पढ़ें
  2. उस सामान को प्रोसेस करें: इनपुट डेटा को आउटपुट डेटा में ट्रांसलेट करें
  3. कुछ अन्य सामान लिखें - आउटपुट डेटा

इसके बारे में सोचो: संकलक के लिए इनपुट क्या है? स्रोत फ़ाइल से वर्णों की एक स्ट्रिंग।

संकलक से आउटपुट क्या है? बाइट्स की एक स्ट्रिंग जो लक्ष्य कंप्यूटर को मशीन निर्देशों का प्रतिनिधित्व करती है।

तो संकलक की "प्रक्रिया" चरण क्या है? वह चरण क्या करता है?

आप समझते हैं कि संकलक - किसी भी अन्य कार्यक्रम की तरह - है इन तीन चरणों शामिल करने के लिए, आप कैसे एक संकलक का निर्माण किया है की एक अच्छा विचार होगा।


3
जैसा कि नील ने कहा, सच है लेकिन उपयोगी नहीं है। एक पुनरावर्ती व्याकरण और प्रतीक तालिकाओं जैसे मौलिक संकलक पहलू सहज ज्ञान युक्त नहीं हैं।
मेसन व्हीलर

1
@ मेसन व्हीलर: मुझे लगता है कि कोई भी वास्तविक रूप से एक कंपाइलर (और लक्ष्य भाषा डिजाइन करने के लिए?) लिखने की आकांक्षा रखता है, सबसे अधिक संभावना यह है कि पुनरावर्ती व्याकरण और प्रतीक तालिकाएं बहुत बुनियादी अवधारणाएं होंगी ।
FumbleFingers

8

मैं एक विशेषज्ञ नहीं हूँ, लेकिन यहाँ मेरा छुरा है:

आप एक संकलनकर्ता, बस एक कोडांतरक लिखने के बारे में नहीं पूछ रहे हैं। यह वास्तव में जादू नहीं है।

एसओ ( https://stackoverflow.com/questions/3826692/how-do-i-translate-assembly-to-binary ) से किसी का जवाब चोरी करना , विधानसभा इस तरह दिखता है:

label:  LDA #$00
        JMP label

फिर आप इसे एक कोडांतरक के माध्यम से चलाते हैं, और कुछ इस तरह से मुड़ते हैं:

$A9 $00
$4C $10 $00

केवल यह सब कुछ इस तरह है:

$A9 $00 $4C $10 $00

यह वास्तव में जादू नहीं है।

आप नोटपैड में नहीं लिख सकते, क्योंकि नोटपैड ASCII (हेक्स नहीं) का उपयोग करता है। आप एक हेक्स संपादक का उपयोग करेंगे, या बस प्रोग्राम के बाहर बाइट्स लिखेंगे। आप उस फ़ाइल को हेक्स लिखते हैं, इसे "a.exe" या "a.out" नाम दें, फिर OS को इसे चलाने के लिए कहें।

बेशक, आधुनिक सीपीयू और ऑपरेटिंग सिस्टम वास्तव में काफी जटिल हैं, लेकिन यह मूल विचार है।

यदि आप एक नया संकलक लिखना चाहते हैं, तो यहां बताया गया है:

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

2) एक अनुवादक लिखें। अपनी भाषा का अनुवाद, कहना, जावास्क्रिप्ट। अब आपकी भाषा एक ब्राउज़र में चलेगी।

3) एलएलवीएम, सी, या विधानसभा जैसे कुछ निचले स्तर के लिए एक अनुवादक लिखें।

आप यहां रुक सकते हैं, यह एक संकलक है। यह एक अनुकूलन संकलक नहीं है, लेकिन यह सवाल नहीं था। आपको एक लिंकर और कोडांतरक लिखने पर विचार करने की आवश्यकता हो सकती है, लेकिन क्या आप वास्तव में चाहते हैं?

4) (पागल) एक अनुकूलक लिखें। इस पर दशकों से बड़ी टीमें काम करती हैं।

4) (साने) किसी मौजूदा समुदाय में शामिल हों। GCC, LLVM, PyPy, किसी भी दुभाषिया पर काम करने वाली कोर टीम।


8

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

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

अंत में, मैंने उल्लेख किया कि ऐपल के सी, जावा और मानक एमएल में उसका पाठ है - यदि आप संकलक निर्माण और प्रोग्रामिंग भाषाओं के बारे में गंभीर हैं, तो मैं एमएल सीखने और ऐपल के उस संस्करण का उपयोग करने की सलाह देता हूं। एमएल-परिवार की भाषाओं में मजबूत प्रकार की प्रणालियां मुख्य रूप से कार्यात्मक हैं - ऐसी विशेषताएं जो कई अन्य भाषाओं से भिन्न होंगी, इसलिए यदि आप पहले से ही एक कार्यात्मक भाषा नहीं जानते हैं तो उन्हें सीखना आपके भाषा शिल्प को बेहतर बनाएगा। इसके अलावा, उनके पैटर्न-मिलान और कार्यात्मक मानसिकताएं एक संकलक में अक्सर किए जाने वाले हेरफेर के प्रकार के लिए बहुत अच्छी तरह से अनुकूल हैं, इसलिए एमएल-आधारित भाषाओं में लिखे गए कंपाइलर आमतौर पर सी में लिखे गए संकलक की तुलना में बहुत कम और समझने में आसान होते हैं, जावा, या इसी तरह की भाषाएं। हार्पर की किताबमानक एमएल पर आप शुरू करने के लिए एक बहुत अच्छा मार्गदर्शक है; इसके माध्यम से काम करते हुए आपको एपल के मानक एमएल कंपाइलर कार्यान्वयन पुस्तक को लेने के लिए तैयार करना चाहिए। यदि आप मानक ML सीखते हैं, तो बाद के काम के लिए OCaml को चुनना बहुत आसान हो जाएगा; IMO, इसमें काम करने वाले प्रोग्रामर के लिए बेहतर टूलिंग है (आसपास के OS वातावरण के साथ अधिक सफाई से एकीकृत करता है, निष्पादन योग्य प्रोग्राम आसानी से तैयार करता है, और इसमें कुछ शानदार कंपाइलर-निर्माण उपकरण जैसे ulex और Menhir) हैं।


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


संपादित : सेठी के साथ गलत अहो संदर्भ को बदलें, CTMCP का उल्लेख करें।


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

मुझे निरंतरता के साथ ऐपल का संकलन पसंद है लेकिन मैंने पाया कि उनकी किताबें बहुत सारे पूर्व ज्ञान हैं।
जॉन हैरोप

6

मुझे कॉलेज में क्लास के लिए कंपाइलर बनाना था।

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

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

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

सौभाग्य!


8
वैचारिक रूप से सरल? हाँ। वास्तव में सरल? नंबर
नील बटरवर्थ

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

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

6

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

अब जब मैंने यह लिख दिया है, तो मुझे इसे फिर से पढ़ना होगा।



5

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

पहला सवाल यह है कि कंप्यूटर कैसे काम करता है? यह इस प्रकार है: इनपुट -> गणना -> आउटपुट।

पहले "गणना" भाग पर विचार करें। हम बाद में देखेंगे कि इनपुट और आउटपुट कैसे काम करते हैं।

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

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

अब कंप्यूटर इनपुट / आउटपुट कैसे करता है? मैं बहुत ही सरल उत्तर दूंगा। Http://en.wikipedia.org/wiki/Input/output और http://en.wikipedia.org/wiki/Interrupt देखें। अधिक जानकारी के लिए। यह दो चीजों का उपयोग करता है, मेमोरी का तीसरा भाग और कुछ जिसे इंटरप्ट कहा जाता है। कंप्यूटर से जुड़ा प्रत्येक उपकरण प्रोसेसर के साथ डेटा का आदान-प्रदान करने में सक्षम होना चाहिए। यह पहले उल्लेखित मेमोरी के तीसरे भाग का उपयोग करता है। प्रोसेसर प्रत्येक डिवाइस को मेमोरी का एक टुकड़ा आवंटित करता है और डिवाइस और प्रोसेसर मेमोरी के उस स्लाइस के माध्यम से संचार करता है। लेकिन प्रोसेसर को कैसे पता चलता है कि किस उपकरण को किस स्थान पर संदर्भित किया जाता है और किसी उपकरण को डेटा का आदान-प्रदान करने की आवश्यकता होती है। यह वह जगह है जहाँ व्यवधान आता है। एक रुकावट अनिवार्य रूप से प्रोसेसर के लिए एक संकेत है कि यह वर्तमान में क्या है और यह सब एक ज्ञात स्थान पर रजिस्टर को बचा लेता है और फिर कुछ और करना शुरू कर देता है। वहाँ कई व्यवधान, प्रत्येक एक अद्वितीय संख्या से पहचाना जाता है। प्रत्येक रुकावट के लिए, इसके साथ एक विशेष कार्यक्रम जुड़ा हुआ है। जब व्यवधान उत्पन्न होता है, प्रोसेसर इंटरप्ट के अनुरूप प्रोग्राम को निष्पादित करता है। अब बायोस पर निर्भर करता है और हार्डवेयर डिवाइस कंप्यूटर मदरबोर्ड से कैसे जुड़े हैं, हर डिवाइस को एक अनोखा व्यवधान और मेमोरी का एक टुकड़ा मिलता है। बायोस की मदद से ऑपरेटिंग सिस्टम को बूट करते समय, प्रत्येक डिवाइस के इंटरप्ट और मेमोरी लोकेशन को निर्धारित करता है और डिवाइस को ठीक से हैंडल करने के लिए इंटरफेयर के लिए विशेष प्रोग्राम सेट करता है। इसलिए जब किसी उपकरण को कुछ डेटा की आवश्यकता होती है या वह कुछ डेटा में भेजना चाहता है, तो यह एक बाधा का संकेत देता है। प्रोसेसर रुकता है कि वह क्या कर रहा है, रुकावट को संभालता है और फिर वापस वही करता है जो वह कर रहा है। कई प्रकार के व्यवधान हैं, जैसे कि hdd, कीबोर्ड आदि के लिए एक महत्वपूर्ण सिस्टम टाइमर है, जो नियमित अंतराल पर एक बाधा को आमंत्रित करता है। इसके अलावा ऑपकोड हैं जो इंटरप्ट को ट्रिगर कर सकते हैं, जिन्हें सॉफ्टवेयर इंटरप्ट कहते हैं।

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

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

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

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

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

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

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


4

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

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

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

जावा में एक डिकम्पॉइलर और हैलो, वर्ल्ड क्लास के साथ खेलें। जेवीएम कल्पना पढ़ें और समझने की कोशिश करें कि क्या चल रहा है। यह आपको संकलक क्या कर रहा है बस में अंतर्दृष्टि प्रदान करेगा ।

फिर कोड के साथ खेलें जो हैलो, वर्ल्ड क्लास बनाता है। (वास्तव में आप एक विशेष विशिष्ट भाषा के लिए एक एप्लिकेशन-विशिष्ट कंपाइलर बना रहे हैं, जिसमें आप केवल हैलो, वर्ल्ड कह सकते हैं।)

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

अब संकलन (जावा में) एक वर्ग का प्रयास करें जो कुछ अंकगणितीय अभिव्यक्ति की गणना करता है, जैसे "2 * (3 + 4)"। इस कक्षा को अलग करें, एक "खिलौना संकलक" लिखें जो इसे फिर से एक साथ रख सके।


3

1) वाशिंगटन विश्वविद्यालय से महान वीडियो व्याख्यान:

सीएसई पी 501 कम्पाइलर निर्माण - ऑटम 2009 www.cs.washington.edu/education/courses/csep501/09au/lectures/video.html *

2) SICP http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/ और इसी नाम की पुस्तक। यह वास्तव में किसी भी सॉफ्टवेयर इंजीनियर के लिए अनिवार्य है।

3) इसके अलावा, कार्यात्मक प्रोग्रामिंग के बारे में, हास्केल, लैम्ब्डा कैलकुलस, शब्दार्थ (सांकेतिक सहित) और कार्यात्मक भाषाओं के लिए संकलक कार्यान्वयन। यदि आप पहले से ही हास्केल जानते हैं, तो आप 2005-SS-FP.V10.2005-05-24.HDV से शुरू कर सकते हैं। Uxx वीडियो जवाब हैं। कृपया पहले Vxx वीडियो का अनुसरण करें ।

http://video.s-inf.de/#FP.2005-SS-Giesl.(COt).HD_Videoaufzeichnung

(वीडियो अंग्रेजी में हैं, अन्य पाठ्यक्रम हालांकि जर्मन में हैं।)

  • नए उपयोगकर्ता केवल दो हाइपरलिंक पोस्ट कर सकते हैं।

3

ANTLR एक अच्छा शुरुआती बिंदु है। यह लेक्स और Yacc के समान एक भाषा जनरेटिंग फ्रेमवर्क है। एएनटीएलआरवर्क्स नामक एक गुई है जो प्रक्रिया को सरल करता है।

.NET की दुनिया में डायनेमिक भाषा रनटाइम है जिसका उपयोग .NET दुनिया में कोड उत्पन्न करने के लिए किया जा सकता है। मैंने Zentrum नामक एक अभिव्यक्ति भाषा लिखी है जो DLR का उपयोग करके कोड उत्पन्न करता है। यह आपको दिखाएगा कि कैसे सांख्यिकीय और गतिशील रूप से टाइप किए गए भावों को पार्स और निष्पादित करें।


2

कंपाइलर कैसे काम करते हैं और अपनी खुद की प्रोग्रामिंग भाषा बनाने के लिए एक सरल परिचय के लिए, मैं नई पुस्तक http://createyourproglang.com की सिफारिश करूंगा, जो ओएस / सीपीयू इंटर्नल, यानी लेक्सर्स, पियर्स के बारे में जाने बिना भाषा डिजाइन सिद्धांत पर अधिक ध्यान केंद्रित करता है। , दुभाषियों, आदि

यह उन्हीं उपकरणों का उपयोग करता है जो हाल ही में लोकप्रिय कॉफी स्क्रिप्ट और फैंसी प्रोग्रामिंग भाषाओं को बनाने के लिए उपयोग किए गए थे ।


2

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

स्टैनफोर्ड विश्वविद्यालय में प्रतीकात्मक प्रणाली कार्यक्रम (एसएसपी) कंप्यूटर और दिमाग पर केंद्रित है: कृत्रिम और प्राकृतिक प्रणालियां जो सूचना का प्रतिनिधित्व करने के लिए प्रतीकों का उपयोग करती हैं। SSP मानव-कंप्यूटर संबंधों के विभिन्न पहलुओं में रुचि रखने वाले छात्रों और संकायों को एक साथ लाता है, जिसमें शामिल हैं ...

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

2

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

मेरे सुझाव के कई कारण हैं:

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

  2. पायथन का मानक कार्यान्वयन (सीपीथॉन) खुला-स्रोत और अच्छी तरह से प्रलेखित है, जिससे यह समझना आसान हो जाता है कि भाषा हुड के तहत कैसे काम करती है।

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

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

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

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

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

  8. पायथन में पार्सिंग के लिए अच्छे पुस्तकालय हैं। आप पायथन कोड को एक सार सिंटैक्स ट्री में पार्स कर सकते हैं और फिर एएसटी मॉड्यूल का उपयोग करके इसे हेरफेर कर सकते हैं। PyParsing मॉड्यूल मनमानी भाषाओं को पार्स करने के लिए उपयोगी है, जैसे कि आप डिज़ाइन करते हैं। यदि आप चाहते थे कि सिद्धांत में आप अपना पहला भाषा संकलक लिख सकते हैं (और यदि यह C, असेंबली, या यहाँ तक कि पायथन आउटपुट उत्पन्न कर सकता है)।

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

मज़े करो!


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

1

ठीक है, मुझे लगता है कि आपके प्रश्न को फिर से लिखा जा सकता है, "कंप्यूटर विज्ञान की डिग्री की मुख्य व्यावहारिक अवधारणाएं क्या हैं", और कुल उत्तर, निश्चित रूप से, कंप्यूटर विज्ञान में अपने स्वयं के स्नातक प्राप्त करने के लिए है।

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

एक ऑपरेटिंग सिस्टम का दिल कर्नेल है, जो संसाधनों (जैसे, मेमोरी आवंटन / डील्लोकेशन) का प्रबंधन करता है, और कार्यों / प्रक्रियाओं / कार्यक्रमों के बीच स्विच करता है।

एक कोडांतरक एक पाठ है-> बाइट परिवर्तन।

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

मैं इसे C में लिखने की सलाह दूंगा; सी उस स्तर के काम के लिए लिंगुआ फ्रेंका है।


1
दूसरी ओर, यह एक उच्च-स्तरीय भाषा के लिए एक अच्छी जगह है। जब तक आप अलग-अलग बाइट्स को एक फ़ाइल में निर्धारित कर सकते हैं, तब तक आप किसी भी भाषा में एक कंपाइलर / असेंबलर (जो आसान है) बना सकते हैं। कहते हैं, पर्ल। या वी.बी.ए. हेवन्स, संभावनाएं!
इयान

1

केनेथ लाउडेन की पुस्तक "कम्पाइलर कंस्ट्रक्शन" देखें

http://www.cs.sjsu.edu/~louden/cmptext/

यह संकलक विकास के लिए एक बेहतर हाथ-दृष्टिकोण प्रदान करता है।

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


1

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

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


0

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

मैं अत्यधिक अनुशंसा करता हूं कि आप पहले ऑपरेटिंग सिस्टम की बेहतर समझ प्राप्त करें और सामान्य रूप से मौजूदा भाषाओं को एक वीएम (जावा) में या एक दुभाषिया (पायथन / जावास्क्रिप्ट) द्वारा संकलित / निष्पादित (अर्थात मूल रूप से (C / C ++) कैसे करें।

मेरा मानना ​​है कि हमने अपने ऑपरेटिंग सिस्टम पाठ्यक्रम (2 वें वर्ष में) में अब्राहम सिलबर्सचैट, पीटर बी। गैल्विन, ग्रेग गेगिन द्वारा पुस्तक ऑपरेटिंग सिस्टम कॉन्सेप्ट्स का उपयोग किया। यह एक उत्कृष्ट पुस्तक थी जिसने एक ऑपरेटिंग सिस्टम के प्रत्येक घटक को पूरी तरह से वॉकथ्रू दिया - थोड़ा सा लेकिन अच्छी तरह से इसके लायक और पुरानी / उपयोग की गई प्रतियां चारों ओर तैरती होनी चाहिए।


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

यह कहने के तुरंत बाद कि वह भाषा का डिज़ाइन और संकलन सीखना चाहते थे, उन्होंने कहा कि वे OSes के बारे में सीखना चाहते हैं।
डेविड थॉर्नले

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

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

0

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

अधिकांश संकलक और / या व्याख्याकार इस तरह काम करते हैं:

टोकन : कोड टेक्स्ट को स्कैन करें और इसे टोकन की सूची में तोड़ दें।

यह कदम मुश्किल हो सकता है क्योंकि आप रिक्त स्थान पर स्ट्रिंग विभाजित नहीं कर सकते हैं, आपको यह पहचानना होगा कि if (bar) foo += "a string";8 टोकन की एक सूची है: WORD, OPEN_PAREN, WORD, CLOSE_PAREN, WORD, ASIGN__DD, STRING_LITERAL, TERMINATOR। जैसा कि आप देख सकते हैं, केवल रिक्त स्थान पर स्रोत कोड को विभाजित करने से काम नहीं चलेगा, आपको प्रत्येक वर्ण को एक अनुक्रम के रूप में पढ़ना होगा, इसलिए यदि आप एक अल्फ़ान्यूमेरिक वर्ण से सामना करते हैं, तो आप तब तक वर्णों को पढ़ते रहते हैं जब तक कि आप एक गैर-अल्फ़ान्यूम वर्ण और उस स्ट्रिंग को हिट नहीं करते हैं अभी पढ़ा है एक बाद में वर्गीकृत किया जा करने के लिए एक शब्द है। आप अपने लिए तय कर सकते हैं कि आपका टोकन कितना दानेदार है: क्या यह "a string"एक टोकन के रूप में निगलता है, जिसे STRING_LITERAL कहा जाता है, जिसे बाद में पार्स किया जाता है, या क्या यह देखता है"a string" OPEN_QUOTE, UNPARSED_TEXT, CLOSE_QUOTE, या जो भी हो, यह सिर्फ कई विकल्पों में से एक है, जिसे आपको खुद तय करना है जैसे आप इसे कोड कर रहे हैं।

लेक्स : तो अब आपके पास टोकन की एक सूची है। आपने संभवतः WORD जैसे अस्पष्ट वर्गीकरण के साथ कुछ टोकन को टैग किया है क्योंकि पहले पास के दौरान आप प्रत्येक स्ट्रिंग के संदर्भ को जानने की कोशिश में बहुत अधिक प्रयास खर्च नहीं करते हैं। तो अब आप स्रोत के टोकन की फिर से सूची को पढ़ें और अपनी भाषा में कीवर्ड के आधार पर अधिक विशिष्ट टोकन प्रकार के साथ प्रत्येक अस्पष्ट टोकन को पुन: लिखें। तो आपके पास एक WORD है जैसे कि "if", और "if" यदि आपके द्वारा बनाए गए विशेष कीवर्ड्स की सूची में है, जिसे IF कहा जाता है, तो आप WORD से IF तक के प्रतीक प्रकार को बदल दें, और कोई भी WORD जो आपके विशेष कीवर्ड सूची में नहीं है , जैसे WORD foo, एक IDENTIFIER है।

पार्स : तो अब आप बदल गया if (bar) foo += "a string";lexed टोकन कि इस तरह दिखता है की एक सूची: यदि OPEN_PAREN पहचानकर्ता CLOSE_PAREN IDENTIFIER ASIGN_ADD STRING_LITERAL TERMINATOR। कदम बयानों के रूप में टोकन के दृश्यों को पहचान रहा है। यह पार्सिंग है। आप ऐसा व्याकरण का उपयोग करके करते हैं जैसे:

STATEMENT: = ASIGN_EXPRESSION | IF_STATEMENT

IF_STATEMENT: = IF, PAREN_EXPRESSION, STATEMENT

ASIGN_EXPRESSION: = IDENTIFIER, ASIGN_OP, मूल्य

PAREN_EXPRESSSION: = OPEN_PAREN, VALUE, CLOSE_PAREN

VALUE: = IDENTIFIER | STRING_LITERAL | PAREN_EXPRESSION

ASIGN_OP: = EQUAL | ASIGN_ADD | ASIGN_SUBTRACT | ASIGN_MULT

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

आप इसका उपयोग कैसे करते हैं? पहले टोकन से शुरू करते हुए, इन प्रस्तुतियों के साथ टोकन के अपने क्रम से मिलान करने का प्रयास करें। इसलिए पहले आप STATEMENT के साथ अपनी टोकन सूची का मिलान करने का प्रयास करें, इसलिए आप STATEMENT के लिए नियम पढ़ें और यह कहता है कि "STATEMENT या तो ASIGN_EXPRESSION या IF_STATEMENT" है, इसलिए आप पहले ASAS_EXPRESSION से मिलान करने का प्रयास करें, इसलिए आप ASIGN_EXPRESSION के लिए व्याकरण नियम देखें। और यह कहता है "ASIGN_EXPRESSION एक IDENTIFIER है जिसके बाद एक ASUE_OP है, जिसके बाद एक VALUE है, इसलिए आप IDENTIFIER के लिए व्याकरण नियम की खोज करते हैं और आप देखते हैं कि IDFIFIER के लिए कोई व्याकरण रूक नहीं है, इसलिए IDENTIFIER का अर्थ है" टर्मिनल "जिसका अर्थ है कि इसे आगे की आवश्यकता नहीं है" इसे मिलान करने के लिए पार्स करना ताकि आप इसे अपने टोकन से सीधे मिलान करने का प्रयास कर सकें। लेकिन आपका पहला स्रोत टोकन एक IF है, और IF एक IDENTIFIER के समान नहीं है इसलिए मैच विफल हो गया। अब क्या? आप स्थिति नियम पर वापस जाते हैं और अगले कार्यकाल से मेल खाने का प्रयास करते हैं: IF_STATEMENT। यदि आप IF_STATEMENT देख रहे हैं, तो यह IF के साथ शुरू होता है, IF, लुकअप IF है, यदि टर्मिनल है, तो अपने पहले टोकन के साथ टर्मिनल की तुलना करें, यदि टोकन मेल खाता है, तो भयानक चलता रहता है, अगला शब्द PAREN_EXPRESSION है, PAREN_EXPRESSION देखना, यह कोई टर्मिनल नहीं है, यह पहला शब्द क्या है, PAREN_EXPRESSION OPEN_PAREN के साथ शुरू होता है, OPEN_PAREN को देखते हुए, यह एक टर्मिनल है, OPEN_PAREN को अपने अगले टोकन से मिलाएं, यह मेल खाता है, .... और इसी तरह।

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

हर बार पार्स () ASIGN_EXPRESSION जैसे एक उत्पादन से मेल खाता है जो आप उस कोड का प्रतिनिधित्व करते हुए एक संरचना बनाते हैं। इस संरचना में मूल स्रोत टोकन के संदर्भ शामिल हैं। आप इन संरचनाओं की एक सूची बनाना शुरू करते हैं। हम इस पूरे ढांचे को सार सिंटैक्स ट्री (एएसटी) कहेंगे

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

तो आइए आपके एएसटी के टुकड़े को देखें जिसमें ASIGN_ADD टाइप है। तो एक दुभाषिया के रूप में आपके पास ASIGN_ADD_execute () फ़ंक्शन है। इस फ़ंक्शन को एएसटी के टुकड़े के रूप में पारित किया जाता है जो पार्स ट्री से मेल खाता है foo += "a string", इसलिए यह फ़ंक्शन उस संरचना को देखता है और यह जानता है कि संरचना में पहला शब्द एक IDENTIFIER होना चाहिए, और दूसरा शब्द VALUE है, इसलिए ASIGN_DD_execute () VALUE_eval () फ़ंक्शन के लिए VALUE शब्द को पास करता है, जो स्मृति में मूल्यांकित मान का प्रतिनिधित्व करने वाली एक वस्तु देता है, फिर ASIGN_ADD_execute () आपके चर तालिका में "foo" की खोज करता है, और eval_value () द्वारा जो कुछ भी लौटाया गया था, उसका संदर्भ संग्रहीत करता है समारोह।

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

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

मेरी सलाह छोटी है: एक छोटी सी भाषा, एक छोटे से व्याकरण के साथ, और कुछ सरल कथनों को पार्स करने और निष्पादित करने का प्रयास करें, फिर वहां से बढ़ें।

इन्हें पढ़ें, और शुभकामनाएँ!

http://www.iro.umontreal.ca/~felipe/IFT2030-Automne2002/Complements/tinyc.c

http://en.wikipedia.org/wiki/Recursive_descent_parser


2
जब आप लोग संकलन के बारे में सोचते हैं, तो आप एक ऐसी गलती करते हैं, जो यह मानती है: कि समस्या पर विश्वास करने के बारे में है। पार्सिंग आसान है; इसे करने के लिए बेहतरीन प्रौद्योगिकियां हैं। संकलन के बारे में कठिन हिस्सा अर्थ विश्लेषण है, जो प्रोग्राम के प्रतिनिधित्व के उच्च और निम्न स्तरों पर अनुकूलन करता है, और कोड की पीढ़ी, इन दिनों PARALLEL कोड पर जोर देने के साथ। आप अपने जवाब में इसे पूरी तरह से प्रमाणित करते हैं: "कंपाइलर को एएसटी को ट्रांसलेट बाइट कोड में हैंडलर फ़ंक्शन करना होगा"। कंपाइलर थ्योरी और इंजीनियरिंग में 50 साल बीत चुके हैं।
इरा बैक्सटर

0

कंप्यूटर क्षेत्र केवल जटिल है क्योंकि इसमें कई दिशाओं में विकसित होने का समय है। इसके दिल में सिर्फ गणना करने वाली मशीनों के बारे में है।

मेरा पसंदीदा बहुत ही बुनियादी कंप्यूटर हैरी पोर्टर का रिले कंप्यूटर है । यह एक स्वाद देता है कि कंप्यूटर आधार स्तर पर कैसे काम करता है। फिर आप सराहना करना शुरू कर सकते हैं कि भाषाओं और ऑपरेटिंग सिस्टम जैसी चीजों की आवश्यकता क्यों है।

बात यह है, यह समझने की आवश्यकता के बिना कुछ भी समझना मुश्किल है कि इसकी आवश्यकता क्या है । गुड लक, और सिर्फ सामान नहीं पढ़ें । सामान करो



-1

एक और अच्छी परिचयात्मक पुस्तक है एन। वीर्थ की "कम्पाइलरबाऊ" 1986 से (संकलक निर्माण) जो लगभग 100 पृष्ठ लंबी है और संक्षिप्त रूप से बताती है, खिलौना भाषा PL / 0 के लिए अच्छी तरह से डिज़ाइन किया गया कोड, जिसमें पार्सर, कोड जनरेटर और वर्चुअल मशीन शामिल हैं। यह यह भी दर्शाता है कि EBNF संकेतन में व्याकरण में पढ़ने वाले पार्सर को कैसे लिखना है। पुस्तक जर्मन में है, लेकिन मैंने एक सारांश लिखा और एक अभ्यास के रूप में पायथन को कोड का अनुवाद किया, http://www.d12k.org/cmplr/w86/intro.html देखें ।


-1

यदि आप प्रोग्रामिंग भाषाओं के सार को समझने में रुचि रखते हैं, तो मैं सुझाव दूंगा कि आप PLAI (http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/) पुस्तक के माध्यम से अवधारणाओं को समझने के लिए काम करें और उनका कार्यान्वयन। यह आपकी अपनी भाषा के डिजाइन में भी आपकी मदद करेगा।


-1

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

  • अनुमत संख्याएँ
  • अनुमत संचालक
  • ऑपरेटर प्राथमिकताएं
  • सिंटेक्स सत्यापन
  • चर देखो तंत्र
  • चक्र का पता लगाना
  • अनुकूलन

उदाहरण के लिए, आपके पास निम्न सूत्र हैं, आपका कैलकुलेटर x के मूल्य की गणना करने में सक्षम होना चाहिए:

a = 1
b = 2
c = a + b
d = (3 + b) * c
x = a - d / b

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

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