2009-07-30 14 views
5

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

+0

कई अन्य लोगों के बीच http://stackoverflow.com/questions/479013/requirements-for-compiler-design/479048 का डुप्पी। इसके अलावा, आप बहुत सारे प्रश्न पूछ रहे हैं - एक समय में एक अच्छा नियम है। –

+1

और यह http://stackoverflow.com/questions/1669/learning-to-write-a-compiler विषय क्षेत्र पर निश्चित SO उत्तर है। –

+0

ठीक है मुझे खेद है कि मैंने नहीं देखा कि यह एक डुप्लिकेट था, इसे सिर्फ डुप्लिकेट के रूप में बंद किया जाना चाहिए या क्या मुझे प्रश्न हटा देना चाहिए? –

उत्तर

3

बहुत सारे तरीके हैं ...

आप ढेर भाषाओं और आगे की जांच कर सकता है। जब यह अन्य भाषाओं को डिजाइन करने की बात आती है तो यह बहुत उपयोगी नहीं है, लेकिन ऐसा कुछ है जो बहुत जल्दी किया जा सकता है।

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

और फिर, पारंपरिक भाषाएं। वे सबसे कठिन हैं। आपको पार्सिंग विश्लेषकों, पार्सर्स, एलएएलआर व्याकरण, एलएल व्याकरण, ईबीएनएफ और नियमित भाषाएं सिर्फ पार्सिंग को पाने के लिए सीखने की आवश्यकता होगी।

बाइटकोड को लक्षित करना सिर्फ एक अच्छा विचार नहीं है - अन्यथा करना सीखना अभ्यास में केवल पागल और अधिक बेकार है।

अपने आप को एक पक्ष बनाओ, और संकलक के बारे में किताबें और ट्यूटोरियल देखें।

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

+0

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

+0

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

+0

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

1

आप पहले a book on compilers पढ़ना चाहेंगे।

वास्तव में समझ क्या हो रहा है के लिए, आप की संभावना सी

में अपने कोड लिखने के लिए

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

में
1

आसान हो सकता है मैं निम्नलिखित किताबें पढ़ने की सलाह देते हैं:

ANTLR

Language Design Patterns

यह आपको दे देंगे कस्टम भाषाओं के लिए पार्सर्स, लेक्सर्स और कंपाइलर्स बनाने के लिए टूल और तकनीकें।

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