2009-02-17 23 views
6

मुझे एक बहुत ही सरल संकलक लिखने में रूचि है। ELF प्रारूप (* nix) मेंकंपाइलर-प्रोग्रामिंग: सबसे मौलिक सामग्री क्या हैं?

  • उत्पादन
  • इनपुट एक भी textfile
  • है:

    मैं एक छोटे से (C/C++ में) सॉफ्टवेयर का टुकड़ा लिखने के लिए है जो निम्न मानदंडों को पूरा करता चाहते हैं सी-तरह व्याकरण और वाक्य रचना

  • कोई लिंकर
  • कोई पूर्वप्रक्रमक
  • बहुत छोटे (अधिकतम। 1-2 kloc)

भाषा विशेषताएं:

  • देशी डेटा प्रकार: चार, पूर्णांक और
  • सरणियों (सभी देशी डेटा प्रकार के लिए)
  • चर तैरता
  • नियंत्रण संरचनाओं (अगर-बाकी)
  • फ़ंक्शंस
  • लूप (अच्छा होगा)
  • सरल बीजगणित (div, उप, mul, बूलियन अभिव्यक्ति, थोड़ा-शिफ्ट, आदि)
  • इनलाइन एएसएम (सिस्टम कॉल के लिए) जोड़ने के लिए,

किसी को मुझे बताओ कैसे शुरू करने के लिए कर सकते हैं? मुझे नहीं पता कि एक कंपाइलर के किन हिस्सों में शामिल हैं (कम से कम इस अर्थ में कि मैं सिर्फ शेल्फ से दाएं शुरू कर सकता हूं) और उन्हें कैसे प्रोग्राम करना है। आपके विचारों के लिए धन्यवाद।

+0

संभवतः डुप्लिकेट [एक कंपाइलर लिखना सीखना] (http://stackoverflow.com/questions/1669/learning-to-write-a-compiler) – nawfal

उत्तर

5

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

एक बार जब आप अपने निर्णय सबसे पहले

  1. भाषा परिभाषा पालन करने के लिए वहाँ कुछ सामान्य कदम हैं बनाया है, अगर आप अपनी भाषा वाक्य रचना दिखना चाहिए कैसे परिभाषित करने के लिए किया है।

  2. Lexer दूसरे चरण के लिए अपने कोड, टोकन के रूप में जाना कीवर्ड बनाने का है। यहां, हम संख्याओं, अतिरिक्त चिह्न, और तारों जैसे बहुत बुनियादी तत्वों के बारे में बात कर रहे हैं।

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

  4. । अपना खुद का दुभाषिया बनाने का एक आसान तरीका है अपने पेड़ में प्रत्येक नोड प्रकार से जुड़े कुछ तर्क बनाना और पेड़ के माध्यम से या तो नीचे या ऊपर-नीचे चलना। यदि आप किसी अन्य भाषा में संकलित करना चाहते हैं तो आप इसके बजाय नोड्स में कोड का अनुवाद करने का तर्क डाल सकते हैं।

विकिपीडिया अधिक सीखने के लिए बहुत अच्छा है, तो आप here शुरू करना चाहेंगे।

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

4

ये बिल्कुल जरूरी भागों हैं:

  • स्कैनर: यह टोकन में इनपुट फ़ाइल टूट जाता है
  • पार्सर: यह टोकन स्कैनर द्वारा की पहचान से एक सार वाक्य रचना पेड़ (एएसटी) निर्माण करती है।
  • कोड जनरेशन: यह एएसटी से आउटपुट उत्पन्न करता है।

तुम भी शायद चाहता हूँ:

  • त्रुटि निवारण: यह पार्सर अगर यह एक अप्रत्याशित टोकन
  • अनुकूलन का सामना करना पड़ता कि क्या करना है बताता है: यह और अधिक कुशल मशीन का निर्माण करने के लिए सक्षम हो जाएगा संकलक कोड

संपादित करें: क्या आपने पहले ही भाषा तैयार की है? यदि नहीं, तो आप भी भाषा डिजाइन में देखना चाहेंगे।

+0

'भाषा डिज़ाइन में देखें': क्या आपका मतलब एक विशिष्ट संसाधन है या प्रतिमान? या बस मुझे अपने सिर में घूमने की जरूरत है? – prinzdezibel

+0

आपको एक भाषा व्याकरण बनाना होगा जो कि आप जिस पार्सर का उपयोग करना चाहते हैं उसके साथ संगत है। मैं शुरू करने के लिए टॉप-डाउन बनाम तल-अप पार्सर्स पर एक नज़र डालेगा। ब्रिनच हैंनसेन के लिए –

2

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

हालांकि पुस्तक पास्कल को कार्यान्वयन और लक्षित भाषाओं के रूप में उपयोग करती है, लेकिन प्रस्तुत पाठ और तकनीक अन्य सभी भाषाओं के लिए समान रूप से लागू होती है।

+0

+1। यह संकलक डिजाइन पर तकनीकी और व्यावहारिक जानकारी के बीच सबसे अच्छा संतुलन है। –

2

मुझे नहीं पता कि आप इससे क्या बाहर निकलने की उम्मीद करते हैं, लेकिन यदि यह सीख रहा है, और मौजूदा कोड को आपके लिए काम करता है, तो हमेशा tcc होता है।

7

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

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

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

print "hello" 
a = 5 
print a 

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

शुभकामनाएं!

+0

और भी आसान, यह सी को इसके आउटपुट के रूप में उत्पन्न करता है। बहुत सारे सफल कंपाइलर्स इस मार्ग से चले गए हैं। –

+0

ध्यान दें कि NASM सी में लिखा गया है, इसलिए आप अपने अनुवाद में NASM से कोड कोड में कोड का उपयोग करने में सक्षम हो सकते हैं। –

0

मैं हमेशा शुरुआत के रूप में इस तरह के काम के लिए flex और bison की सलाह देता हूं। आप हमेशा अपने स्कैनर और पार्सर लिखने के इंस और आउट सीख सकते हैं, हालांकि वे कोड आकार बढ़ा सकते हैं कम से कम वे आपके लिए टूल द्वारा जेनरेट किए जाएंगे। :)

1

एक नि: शुल्क संदर्भ की वास्तव में अच्छा सेट, IMHO, कर रहे हैं:

कुल मिलाकर संकलक ट्यूटोरियल: चलो जैक Crenshaw (http://compilers.iecc.com/crenshaw/) द्वारा एक संकलक का निर्माण यह अधिक शब्दों वाले है, लेकिन मुझे यह पसंद है।

असेंबलर: एनएसएम (nasm.us) लिनक्स और विंडोज/डॉस के लिए अच्छा है, और सबसे महत्वपूर्ण बात यह है कि डॉको और उदाहरण/ट्यूटोरियल के बहुत सारे हैं। (FASM भी अच्छा लेकिन कम प्रलेखन है/ट्यूटोरियल वहाँ बाहर)

अन्य स्रोतों पीसी विधानसभा पुस्तक (http://www.drpaulcarter.com/pcasm/index.php)

मैं एक लिस्प लिखने के लिए कोशिश कर रहा हूँ, इसलिए मैं Lisp 1.5 Manual उपयोग कर रहा हूँ। आप जो भी भाषा लिख ​​रहे हैं उसके लिए आप भाषा का नमूना प्राप्त करना चाह सकते हैं।

जहां तक ​​1-2 केएलओसीसी मानते हैं कि आप उच्च स्तर की भाषा (जैसे पीई या आरबी) का उपयोग करते हैं, तो आप बहुत महत्वाकांक्षी नहीं होने पर बंद होना चाहिए।

+0

चूंकि वह इसे सी/सी ++ में लिखना चाहता है (जो भी इसका मतलब है), मैं NASM के साथ जाऊंगा। एफएएसएम अच्छा है, लेकिन असेंबली में लिखा गया है, जबकि NASM सी में लिखा गया है। NASM अधिक उपयोगी कोड प्रदान कर सकता है। –

संबंधित मुद्दे