मैं वर्तमान में सी से असेंबली कंपाइलर लिखने की प्रक्रिया में हूं, यह व्यावहारिक नहीं है, लेकिन मैं इसे शैक्षिक मूल्य के लिए करना चाहता हूं। मैं सोच रहा था कि जब मैं खोजशब्दों के लिए परीक्षण कर रहा हूं, तो फाइल में अगले शब्द को पढ़ने के बजाय और फिर खोजशब्दों के लिए परीक्षण करने वाले बयानों के जरिये इसे घोंसले के गुच्छा के माध्यम से चलाकर और अधिक कुशल तरीका है। क्या कोई बेहतर तरीका है?सी कंपाइलर लिखते समय मुझे कीवर्ड का विश्लेषण कैसे करना चाहिए?
उत्तर
आपका प्रश्न वास्तव में काफी विशिष्ट है। आप इस बारे में पूछ रहे हैं कि व्याख्यात्मक विश्लेषक को कैसे बनाया जाए, जिसे स्कैनर भी कहा जाता है, और कुशलतापूर्वक और आसानी से कीवर्ड को कैसे पहचानें। स्कैनर एक ठेठ संकलक का पहला चरण है, और यह स्रोत कोड को परिवर्तित करता है, जो कि टोकन के अनुक्रम में वर्णों का अनुक्रम है, जहां टोकन एक इकाई, एक ऑपरेटर या कीवर्ड जैसी इकाई है।
चूंकि कीवर्ड सामान्य पहचानकर्ताओं के लिए पैटर्न से मेल खाते हैं, इसलिए एक सामान्य चाल सभी कीवर्ड को प्रतीक तालिका में रखना है, साथ ही जानकारी यह है कि यह एक कीवर्ड है। फिर, जब स्कैनर को पहचानकर्ता मिल जाता है, तो यह सामान्य रूप से प्रतीक तालिका को खोजता है यह देखने के लिए कि क्या पहचानकर्ता पहले देखा गया है। यदि यह पहचानकर्ता एक क्यूवार्ड था, तो यह जानकारी मिलेगी कि यह किस कीवर्ड के बारे में है।
क्या आप कक्षा के हिस्से के लिए ऐसा कर रहे हैं? यदि हां, तो पार्सिंग और लेक्सिंग पर दिशानिर्देश होना चाहिए। यदि नहीं, तो आप बहुत सारे काम में हैं!
एक वास्तविक कंपाइलर लिखना सिर्फ बयानों के गुच्छा से गुजरने से कहीं अधिक जटिल है, क्योंकि आपको पर्यावरण का ट्रैक रखने की आवश्यकता है। आपको इस बारे में सोचना होगा कि आप कक्षाओं, कार्यों, फ़ंक्शन कॉल, क्लास इंस्टॉलेशन, रिकर्सिव फ़ंक्शंस को कैसे अनुमति देते हैं ... सूची चालू है।
विषय पर यूसी बर्कले से पाठ्यक्रम व्याख्यान, यानी पार्स, lexing, कोड पीढ़ी पर एक नजर डालें, और उपकरण आप की आवश्यकता होगी:
http://www-inst.eecs.berkeley.edu/~cs164/fa13/
नोट है कि विशेष रूप से इस्तेमाल किया सी में इस पाठ्यक्रम ++ असेंबली कंपाइलर को पायथन 2.5 लिखने के लिए, लेकिन व्याख्यान और रीडिंग में अवधारणाएं और कुछ टूल भाषा-प्रतिबंधित नहीं हैं।
कीवर्ड (सामान्य रूप से टोकन के बजाए) एक बंद सेट है, जिसके लिए टकराव मुक्त हैश फ़ंक्शन उत्पन्न करना व्यावहारिक है। चूंकि सेट छोटा है, इसलिए न्यूनतम हैश फ़ंक्शन होना आवश्यक नहीं है।
यदि आप कथन और strcmp() हैं तो आप इसे एक गुच्छा के साथ कर सकते हैं। हालांकि, सभी खोजशब्दों के लिए लेखन विवरण बहुत जल्दी परेशान हो जाता है। आप हैश टेबल का उपयोग करना बेहतर कर देंगे - संकलन की शुरुआत में आप टेबल में सभी कीवर्ड डालते हैं और फिर आप आवश्यकतानुसार लुकअप करते हैं। इसका दोष यह है कि यदि आपको सी का उपयोग करना है, तो आपको अपनी खुद की हैश टेबल भी लिखनी होगी (या लाइब्रेरी से एक का उपयोग करना होगा)। यदि आप सी ++ का उपयोग कर सकते हैं, तो आप एसटीएल से एक मानचित्र या एक unordered_map का उपयोग कर सकते हैं। किसी भी मामले में, यदि आप प्रदर्शन के बारे में चिंतित हैं, जैसा कि किसी और ने उल्लेख किया है, तो यह बोतल की गर्दन नहीं होगी।
- 1. क्या मुझे 10.5+ के लिए लिखते समय उद्देश्य-सी कचरा संग्रह का उपयोग करना चाहिए?
- 2. मुझे इनलाइन के बजाय __forceinline का उपयोग कब करना चाहिए?
- 3. मुझे "स्वयं" कीवर्ड का उपयोग कब करना चाहिए?
- 4. क्या मुझे गिट स्थिति का विश्लेषण करना चाहिए या गिटारप का उपयोग करना चाहिए?
- 5. सी ++ 14 मुझे कंस्ट्रैक्स का कितनी बार उपयोग करना चाहिए?
- 6. सी # मुझे सूची का उपयोग कब करना चाहिए और मुझे सरणीसूची का उपयोग कब करना चाहिए?
- 7. मुझे अपाचे कॉमन्स 'Validate.isTrue का उपयोग कब करना चाहिए, और मुझे केवल' assert 'कीवर्ड का उपयोग कब करना चाहिए?
- 8. क्लैंग सी कंपाइलर 'कक्षा' कीवर्ड आरक्षित?
- 9. मुझे अपने एसक्यूएल कीवर्ड को कैपिटल क्यों करना चाहिए?
- 10. मुझे कितना अनुकूलित करना चाहिए?
- 11. क्या मुझे स्कैला का अध्ययन करना चाहिए?
- 12. सी # लॉगिंग। मुझे क्या उपयोग करना चाहिए?
- 13. क्या मुझे ढांचे का उपयोग करना चाहिए?
- 14. क्या यह सच है कि मुझे जावास्क्रिप्ट लिखते समय के एंड आर स्टाइल का उपयोग करना चाहिए?
- 15. मुझे बड़ी सी ++ परियोजना में संकलन समय की बाधा का पता कैसे लगाया जाना चाहिए?
- 16. मुझे क्या करना चाहिए?
- 17. प्रोग्राम रनिंग समय का विश्लेषण कैसे करें
- 18. मुझे मेटा सूचनाओं का क्या उपयोग करना चाहिए?
- 19. रिश्तेदार समय का विश्लेषण कैसे करें?
- 20. नया सी ++: क्या मुझे विजुअल स्टूडियो का उपयोग करना चाहिए?
- 21. क्या मुझे स्थिर डेटा सदस्यों का उपयोग करना चाहिए? (सी ++)
- 22. सी # मुझे कभी कोरआउट का उपयोग क्यों नहीं करना चाहिए?
- 23. मुझे उद्देश्य सी में असाइन का उपयोग कब करना चाहिए?
- 24. मुझे एमएक्सएमएल का उपयोग क्यों करना चाहिए?
- 25. क्या मुझे पोर्टेबल कोड के लिए लंबे समय तक या int64_t का उपयोग करना चाहिए?
- 26. मुझे फ्लेक्स का उपयोग क्यों करना चाहिए?
- 27. मुझे किस डीबी का उपयोग करना चाहिए?
- 28. लिनक्स डिमन लिखते समय टीटीई से क्यों अलग होना चाहिए?
- 29. क्या मुझे बूटस्ट्रैप का उपयोग करना चाहिए?
- 30. क्या मुझे गैर-फेंकने वाले स्वैप को लागू करते समय फेंक() का उपयोग करना चाहिए?
आप सही हैशिंग का प्रयास कर सकते हैं, लेकिन यह संभावना नहीं है कि यह चरण आपकी प्रदर्शन बाधा बनने जा रहा है। –
मैं टैग [पार्सिंग] को [स्कैनिंग] में बदलता हूं। व्यक्तिगत टोकन की पहचान संकलक के पहले चरण, स्कैनर द्वारा की जाती है, न कि दूसरे चरण, पार्सर द्वारा। –
और अब मैंने देखा है कि [स्कैनिंग] गलत टैग है। इसे [lexer] करने के लिए फिर से बदल दिया। –