ইন্ট্রো
একটি সাধারণ সংকলক নিম্নলিখিত পদক্ষেপগুলি করে:
- পার্সিং: উত্স পাঠ্যটি একটি বিমূর্ত সিনট্যাক্স ট্রি (এএসটি) তে রূপান্তরিত হয়েছে।
- অন্যান্য মডিউলগুলির রেফারেন্সের রেজোলিউশন (সি এই লিঙ্কটি সংযোগ না করা পর্যন্ত স্থগিত করে)।
- শব্দার্থিক বৈধতা: সিন্থেটিক্যালি সঠিক বিবৃতিগুলি ছড়িয়ে দেওয়া যা কোনও অর্থ দেয় না, উদাহরণস্বরূপ অ্যাক্সেসযোগ্য কোড বা নকল ঘোষণার।
- সমতুল রূপান্তর এবং উচ্চ-স্তরের অপ্টিমাইজেশন: একই শব্দার্থকগুলির সাথে আরও দক্ষ গণনার উপস্থাপনের জন্য এএসটি রূপান্তরিত হয়। এর মধ্যে রয়েছে উদাহরণস্বরূপ প্রচলিত সুবে এক্সপ্রেশন এবং ধ্রুবক অভিব্যক্তিগুলির প্রাথমিক গণনা, অতিরিক্ত স্থানীয় কার্যভার নির্মূল ( এসএসএও দেখুন ) ইত্যাদি elim
- কোড জেনারেশন: এএসটি লম্বা নিম্ন স্তরের কোডে রূপান্তরিত হয়, লাফানো, নিবন্ধকরণ বরাদ্দ এবং এর মতো করে। কিছু ফাংশন কল এই পর্যায়ে ইনলাইন করা যেতে পারে, কিছু লুপ আনরোড করা ইত্যাদি etc.
- পিফহোল অপটিমাইজেশন: সাধারণ স্থানীয় অদক্ষতার জন্য নিম্ন-স্তরের কোডটি স্ক্যান করা হয় যা নির্মূল হয়।
বেশিরভাগ আধুনিক সংকলক (উদাহরণস্বরূপ, সিসিসি এবং ঝনঝন) আরও একবার দুটি শেষ ধাপ পুনরাবৃত্তি করে। তারা প্রাথমিক কোড তৈরির জন্য মধ্যবর্তী নিম্ন স্তরের তবে প্ল্যাটফর্ম-স্বতন্ত্র ভাষা ব্যবহার করে। তারপরে সেই ভাষাটিকে প্ল্যাটফর্ম-অনুকূল কোড (x86, এআরএম, ইত্যাদি) হিসাবে রূপান্তরিত করা হয় প্ল্যাটফর্ম-অনুকূলিতভাবে মোটামুটি একই জিনিস করা। এর মধ্যে রয়েছে উদাহরণস্বরূপ, যখন সম্ভব ভেক্টর নির্দেশাবলীর ব্যবহার, শাখার পূর্বাভাস দক্ষতা বাড়ানোর জন্য নির্দেশ পুনর্নির্মাণ এবং আরও কিছু।
এর পরে, অবজেক্ট কোড লিঙ্ক করার জন্য প্রস্তুত। বেশিরভাগ নেটিভ-কোড সংকলকগুলি এক্সিকিউটেবল উত্পাদন করতে কোনও লিঙ্কারকে কীভাবে কল করবেন তা জানেন তবে এটি প্রতি সংকলনের পদক্ষেপ নয়। জাভা এবং সি # এর মতো ভাষায় লিঙ্কিং সম্পূর্ণ গতিময় হতে পারে, ভিএম দ্বারা লোড সময়ে করা।
বেসিকগুলি মনে রাখবেন
- এটাকে সফল কর
- এটি সুন্দর করুন
- এটি দক্ষ করুন
এই ক্লাসিক ক্রমটি সমস্ত সফ্টওয়্যার বিকাশের ক্ষেত্রে প্রযোজ্য তবে পুনরাবৃত্তি বহন করে।
ক্রমের প্রথম ধাপে মনোনিবেশ করুন। সম্ভবত কাজ করতে পারে এমন সহজতম জিনিসটি তৈরি করুন।
বই পড়ুন!
আহো এবং ওলম্যান দ্বারা ড্রাগন বুক পড়ুন । এটি ক্লাসিক এবং এটি আজও বেশ কার্যকর।
আধুনিক সংকলক ডিজাইন প্রশংসা করা হয়।
যদি এখনই এই জিনিসগুলি আপনার পক্ষে খুব কঠিন হয় তবে প্রথমে পার্সিংয়ের জন্য কিছু ভূমিকা পড়ুন; সাধারণত পার্সিং লাইব্রেরিতে অন্তর্ভুক্ত এবং উদাহরণ অন্তর্ভুক্ত থাকে।
গ্রাফগুলি, বিশেষত গাছগুলির সাথে কাজ করে আপনি স্বাচ্ছন্দ্য বোধ করেন Make এই জিনিসগুলি হ'ল স্টাফ প্রোগ্রামগুলি লজিক্যাল স্তরে তৈরি।
আপনার ভাষাটি ভালভাবে সংজ্ঞা দিন
আপনি যা যা ইঙ্গিত চান তা ব্যবহার করুন তবে নিশ্চিত করুন যে আপনার ভাষার সম্পূর্ণ এবং ধারাবাহিক বিবরণ রয়েছে। এর মধ্যে বাক্য গঠন এবং শব্দার্থক উভয়ই অন্তর্ভুক্ত।
ভবিষ্যতের সংকলকটির পরীক্ষার কেস হিসাবে আপনার নতুন ভাষায় কোডের স্নিপেটগুলি লেখার এটি এখন সময়।
আপনার প্রিয় ভাষা ব্যবহার করুন
পাইথন বা রুবি বা যে কোনও ভাষা আপনার পক্ষে সহজ যে কোনও সংকলক লিখতে একেবারে ঠিক। আপনি ভাল বুঝতে সহজ সরল অ্যালগরিদম ব্যবহার করুন। প্রথম সংস্করণটি দ্রুত, বা দক্ষ, বা বৈশিষ্ট্য-সম্পূর্ণ হতে হবে না। এটি কেবলমাত্র সঠিক এবং সংশোধন করা সহজ হওয়া দরকার।
প্রয়োজনে বিভিন্ন ভাষায় একটি সংকলকের বিভিন্ন স্তরের লেখা ঠিক আছে।
অনেক পরীক্ষা লিখতে প্রস্তুত
আপনার সম্পূর্ণ ভাষা পরীক্ষার কেস দ্বারা আচ্ছাদিত করা উচিত; কার্যকরভাবে এটি তাদের দ্বারা সংজ্ঞায়িত করা হবে । আপনার পছন্দসই পরীক্ষার কাঠামোর সাথে ভালভাবে পরিচিত হন। প্রথম দিন থেকেই পরীক্ষা লিখুন। ভুল কোড সনাক্তকরণের বিপরীতে সঠিক কোড গ্রহণকারী 'পজিটিভ' পরীক্ষায় মনোনিবেশ করুন।
নিয়মিত সমস্ত পরীক্ষা চালান। এগিয়ে যাওয়ার আগে ভাঙ্গা পরীক্ষা ঠিক করুন। বৈধ কোড গ্রহণ করতে পারে না এমন একটি অশুভ-সংজ্ঞায়িত ভাষা দিয়ে শেষ করা লজ্জার বিষয় হবে।
একটি ভাল পার্সার তৈরি করুন
পার্সার জেনারেটর অনেক । আপনি যা চান বাছুন আপনি স্ক্র্যাচ থেকে নিজের পার্সারও লিখতে পারেন, তবে আপনার ভাষার বাক্য গঠনটি যদি মৃত সহজ হয় তবে তা কেবল তার পক্ষে মূল্যবান ।
পার্সারটির সিনট্যাক্স ত্রুটিগুলি সনাক্ত এবং প্রতিবেদন করা উচিত। ইতিবাচক এবং নেতিবাচক উভয় পরীক্ষার কেস লিখুন; ভাষার সংজ্ঞা দেওয়ার সময় আপনি যে কোডটি লিখেছিলেন তা পুনরায় ব্যবহার করুন।
আপনার পার্সারের আউটপুট একটি বিমূর্ত সিনট্যাক্স ট্রি।
যদি আপনার ভাষার মডিউল থাকে তবে পার্সারের আউটপুট আপনার উত্পন্ন উত্স কোডটির সহজতম উপস্থাপনা হতে পারে। কোনও ফাইলকে একটি গাছ ফেলে দেওয়ার এবং এটি দ্রুত লোড করার জন্য প্রচুর সহজ উপায় রয়েছে।
একটি শব্দার্থিক যাচাইকারী তৈরি করুন
সম্ভবত আপনার ভাষা সিনট্যাক্টিক্যালি সঠিক নির্মাণের অনুমতি দেয় যা নির্দিষ্ট প্রসঙ্গে কোনও ধারণা বোধ করতে পারে না। উদাহরণটি হ'ল একই ভেরিয়েবলের সদৃশ ঘোষণা বা কোনও ভুল ধরণের একটি পরামিতি পাস করা। বৈধকারক গাছটির দিকে তাকাতে যেমন ত্রুটি সনাক্ত করবে।
বৈধকরণকারী আপনার ভাষায় লিখিত অন্যান্য মডিউলগুলির রেফারেন্সগুলিও সমাধান করবে, এই অন্যান্য মডিউলগুলি লোড করবে এবং বৈধকরণ প্রক্রিয়াতে ব্যবহার করবে। উদাহরণস্বরূপ, এই পদক্ষেপটি নিশ্চিত করবে যে অন্য মডিউল থেকে কোনও ফাংশনে পাস হওয়া পরামিতিগুলির সংখ্যা সঠিক কিনা is
আবার লিখুন এবং পরীক্ষার প্রচুর মামলা চালান। তুচ্ছ ঘটনাগুলি স্মার্ট এবং জটিল হিসাবে সমস্যা সমাধানের ক্ষেত্রে অপরিহার্য।
কোড উত্পন্ন
আপনার জানা সবচেয়ে সহজ কৌশলগুলি ব্যবহার করুন। if
এইচটিএমএল টেমপ্লেটের বিপরীতে হালকা-প্যারাম্যাট্রাইজড কোড টেমপ্লেটে কোনও ভাষা নির্মাণের ( বিবৃতি দেওয়ার মতো ) সরাসরি অনুবাদ করা ঠিক হয় ।
আবার, দক্ষতা উপেক্ষা করুন এবং সঠিকতার দিকে মনোনিবেশ করুন।
প্ল্যাটফর্ম-স্বতন্ত্র নিম্ন-স্তরের ভিএম লক্ষ্য করুন
আমি মনে করি আপনি হার্ডওয়্যার-নির্দিষ্ট বিশদে আগ্রহী না হলে আপনি নিম্ন-স্তরের জিনিসগুলি উপেক্ষা করবেন। এই বিবরণ গোর এবং জটিল।
আপনার বিকল্পগুলি:
- এলএলভিএম: সাধারণত এক্স 86 এবং এআরএম এর জন্য দক্ষ মেশিন কোড জেনারেশনের অনুমতি দেয়।
- সিএলআর: লক্ষ্যগুলি। নেট, বেশিরভাগ x86 / উইন্ডোজ ভিত্তিক; একটি ভাল JIT আছে।
- জেভিএম: জাভা বিশ্বকে লক্ষ্য করে তোলে, বেশ কয়েকটি মাল্টিপ্লাটফর্ম, একটি ভাল জেআইটি রয়েছে।
অপ্টিমাইজেশন উপেক্ষা করুন
অপ্টিমাইজেশন হার্ড। প্রায় সর্বদা অপ্টিমাইজেশন অকাল হয়। অযোগ্য তবে সঠিক কোড তৈরি করুন। ফলাফলের কোডটি অনুকূলিত করার চেষ্টা করার আগে পুরো ভাষাটি কার্যকর করুন।
অবশ্যই, তুচ্ছ অপ্টিমাইজেশানগুলি প্রবর্তন করা ঠিক। তবে আপনার সংকলক স্থিতিশীল হওয়ার আগে কোনও ধূর্ততা, লোমশ জিনিস এড়িয়ে চলুন।
তাতে কি?
যদি এই সমস্ত জিনিসগুলি আপনার জন্য খুব ভয় দেখায় না তবে দয়া করে এগিয়ে যান! একটি সাধারণ ভাষার জন্য, প্রতিটি ধাপ আপনার ভাবার চেয়ে সহজ হতে পারে।
আপনার সংকলকটি তৈরি করা একটি প্রোগ্রাম থেকে একটি 'হ্যালো ওয়ার্ল্ড' দেখার চেষ্টা করা উপযুক্ত।