আমি ভাবছিলাম যে কেন একটি সংকলক লেখার জন্য সি ++ ভাল পছন্দ। অবশ্যই সি এই উদ্দেশ্যে খুব ভাল, কারণ অনেক সংকলক সি বা সি ++ এ লেখা হয় তবে আমি এবার সি ++ তে বেশি আগ্রহী। কোন ভাল কারণ? আমি ইন্টারনেটে এটি খুঁজছিলাম, তবে আমি কোনও ভাল কারণ খুঁজে পাচ্ছি না।
আমি ভাবছিলাম যে কেন একটি সংকলক লেখার জন্য সি ++ ভাল পছন্দ। অবশ্যই সি এই উদ্দেশ্যে খুব ভাল, কারণ অনেক সংকলক সি বা সি ++ এ লেখা হয় তবে আমি এবার সি ++ তে বেশি আগ্রহী। কোন ভাল কারণ? আমি ইন্টারনেটে এটি খুঁজছিলাম, তবে আমি কোনও ভাল কারণ খুঁজে পাচ্ছি না।
উত্তর:
সি ++ এর দুটি দিক রয়েছে। এটির একটি নিম্ন-স্তরের বিকাশ রয়েছে যা কোড জেনারেশনের মতো নিম্ন স্তরের জিনিস করার জন্য এটি প্রাকৃতিক ভাষার মতো বলে মনে হচ্ছে। এটির একটি উচ্চ-স্তরের দিক (যা সি দেয় না) যা আপনাকে একটি জটিল অ্যাপ্লিকেশন (সংকলকের মতো) কাঠামোগত, অবজেক্ট ওরিয়েন্টেড পদ্ধতিতে গঠন করতে দেয়, তবুও পারফরম্যান্স বজায় রেখে। এটির নিম্ন এবং উচ্চ স্তরের উভয় দিক রয়েছে বলে এটি বড় অ্যাপ্লিকেশনের জন্য একটি ভাল পছন্দ যার জন্য নিম্ন-স্তরের বৈশিষ্ট্য বা সম্পাদনা প্রয়োজন।
আমার অভিজ্ঞতা এখানে আপনার ভিত্তির সাথে একমত নয়। প্রকৃতপক্ষে, উচ্চ-স্তরের সাধারণ-উদ্দেশ্যে ভাষাগুলির জন্য, সোর্স ল্যাঙ্গুয়েজ (ভাষাটি সংকলিত হচ্ছে) হিসাবে একই ভাষায় সংকলক লেখার পক্ষে একটি খুব সাধারণ অভ্যাস । উদাহরণ স্বরূপ:
একটি ব্যতিক্রম হ'ল জিসিসি, এলএলভিএম বা পলিগ্লোটের মতো বিদ্যমান সংকলক ফ্রেমওয়ার্কগুলির জন্য লিখিত সংকলক ফ্রন্ট-এন্ডস যা ফ্রেমওয়ার্কের ভাষায় লেখা হয়, বা ইয়্যাকের মতো বিদ্যমান পার্সার জেনারেটরের উপর নির্ভরশীল সংকলক। যেহেতু জিসিসি, এলএলভিএম এবং ইয়্যাক প্রচলিত, সি এবং সি ++ তে লিখিত প্রতিষ্ঠিত সরঞ্জাম, এটি সংকলক লেখকদের তাদের ব্যবহারের জন্য উত্সাহ দেয়, যার ফলে সি এবং সি ++ সংকলক বাস্তবায়ন ভাষা বিতরণে একটি বড় অংশ পেতে পারে।
javac
কমান্ড-লাইন), যা জাভা বাইকোডে জাভা সংকলন করে। এটি জাভাতে লেখা হয়েছে - আমি নিজে নিজে এটি বহুবার সংশোধন করেছি এবং আপনি এর জাভা উত্সগুলি অনলাইনে ব্রাউজ করতে পারেন । অন্যটি হটস্পট জেভিএম-এ এমবেড করা স -ইন-টাইম সংকলক যা জাভা বাইটকোডকে দেশীয় মেশিন কোডে সংকলন করে । বেশিরভাগ JVM এর মতো এটি সি ++ তে লেখা আছে, তবে এটি কোনও জাভা সংকলক নয় - আসলে এটি জাভা ভাষা সম্পর্কে কিছুই জানে না।
কি সংকলন করতে? একটি সংকলক একটি ভাষা কোড (উত্স ভাষা) থেকে অন্য (গন্তব্য ভাষা) এ রূপান্তর করে, যা গন্তব্য ভাষার নিম্ন-স্তরেরতা সম্পর্কে কিছুই নির্দেশ করে না।
সংকলক লেখার জন্য আপনি যে ভাষাটি বেছে নিয়েছেন তা প্রসঙ্গে নির্ভর করে। উদাহরণস্বরূপ, এমন একটি প্রকল্পে কাজ করা যা পিএইচপি থেকে নেটিভ পিএইচপি কোডে বর্ণিত একটি ভাষা সংকলন করে, আমি সংস্থারটি লেখার জন্য পিএইচপি এবং সি # এর মিশ্রণটি ব্যবহার করেছি, কারণ এটি আমার দক্ষতা প্রদত্তের জন্য আমার পক্ষে সবচেয়ে বেশি অর্থবোধ তৈরি করেছে। অন্য কোনও ব্যক্তি পাইথন বা জাভা এবং পিএইচপি বা সি ++ বা কিছুটা জাভাস্ক্রিপ্ট বা যা কিছু বেছে নিতে পারে।
সংকলক সম্পর্কিত সরঞ্জামগুলির সমর্থন (টেলাস্টিনের উত্তর দেখুন) এবং এই দুটি ভাষা আপনাকে সত্যিকারের নেটিভ যেতে দেয় বলে সি বা সি ++ একটি জনপ্রিয় পছন্দ। তবে অন্য ভাষা বেছে নেওয়ার ক্ষেত্রে কোনও ভুল নেই।
নোট করুন যে আরও কৌতুকপূর্ণ হওয়ার জন্য , আপনি নিজেই সংকলকটি লিখতে উত্স ভাষা বেছে নিতে পারেন। কফিস্ক্রিপ্ট সংকলক এবং অন্যান্য অনেক সংকলকগুলির ক্ষেত্রে এটি ঘটেছিল। এটি আইডিইগুলির সাথেও জনপ্রিয়: প্রথম ভিজ্যুয়াল স্টুডিওগুলির মধ্যে একটি একই ভিজ্যুয়াল স্টুডিও ব্যবহার করে নির্মিত হয়েছিল।
আমি এখানে প্রাথমিক ভিত্তি প্রশ্ন করতে ঝোঁক। সি এবং সি ++ কম্পাইলার লেখার জন্য পুরোপুরি ভালভাবে কাজ করার সময়, বেশ কয়েকটি অন্যান্য ভাষাও টাস্কের জন্য পুরোপুরি ভালভাবে কাজ করে বলে মনে হচ্ছে।
আপনি যে ভাষাটি সংকলন করছেন তার উপর কিছুটা নির্ভর করে। ছোট, সাধারণ ভাষার জন্য, সি এবং পাস্কাল বেশ সুন্দরভাবে কাজ করে। যদি আপনি বড় এবং জটিল কিছু সংকলন করতে চলেছেন তবে আপনার সংকলকটি আরও বড় এবং জটিল হয়ে উঠবে - সেক্ষেত্রে বৃহত্তর প্রোগ্রামগুলি সংগঠিত এবং কাজ করার জন্য সি ++ এর অতিরিক্ত বৈশিষ্ট্যগুলি অবশ্যই কার্যকর হবে। এটি যদিও সংকলনের জন্য খুব সুনির্দিষ্ট নয়, কেবলমাত্র সাধারণভাবে বড় প্রোগ্রামগুলির জন্য দরকারী useful
আমি মনে করি এটি অন্য একটি বিষয় উল্লেখ করাও মূল্যবান। প্রারম্ভিকরা (মনে হয়) সংকলকগুলি বেশিরভাগই পাঠ্য ম্যানিপুলেশন করছেন বলে মনে করেন, তাই তারা মনে করেন পার্লের মতো কিছু সংকলক লেখার ক্ষেত্রে বিশাল সহায়তা হবে। বাস্তবে, সংকলনের বেশ কয়েকটি আকর্ষণীয় অংশগুলি আপনার এএসটি তৈরির পরে সত্যই শুরু হয় না। যদিও আমি নিশ্চিত যে পার্ল কাজটি পুরোপুরি ভালভাবে করতে পারে, এর পাঠ্য ম্যানিপুলেশন সামর্থ্য সত্যিই এটির কোনও বিশাল সুবিধা দেয় না (পাঠ্য ম্যানিপুলেশন বেশিরভাগ লেক্সারে থাকে এবং সি এর মতো বিষয়গুলির জন্য লেক্সার জেনারেটর যাইহোক সমর্থন করে)।
সংকলকগুলি যে কোনও আধুনিক ভাষায় প্রয়োগ করা যেতে পারে। যাইহোক, একটি সংকলক থেকে সবচেয়ে গুরুত্বপূর্ণ প্রয়োজনীয়তাগুলির একটি দ্রুত হওয়া উচিত।
সি ++ এর এখানে একটি স্পষ্ট সুবিধা রয়েছে। সি ++ এ অনুকূলিতকরণ সস্তা হয় না come তবে, এই ভাষার নিম্ন-স্তরের প্রকৃতির কারণে, অন্য যে কোনও ভাষার তুলনায় ম্যানুয়ালি সি ++ কোডটি আরও অনুকূল করা সম্ভব (এসেম্বলি ব্যতীত যা বহনযোগ্য নয়)।
আমি সন্দেহ করি যে তাদের ব্যবহারের প্রধান প্রেরণা হ'ল লে / সি / ইয়্যাক / বাইসন আউটপুট (প্রাথমিকভাবে) সি-তে রয়েছে যেহেতু এত দিন ধরে এটি আদর্শ ছিল, এটির গতি রয়েছে has
এগুলি বিশেষত ভাল কারণ নয় ...
এই বিষয়টি নিয়ে আমার অভিজ্ঞতা আছে। আমি সি এবং সি ++ তে লিখিত সংকলক লিখেছি। সি এবং সি ++ এর মধ্যে মূল পার্থক্যটি হ'ল সিটির স্বয়ংক্রিয় উপায়ে গতিশীল মেমরি পরিচালনা নেই। সি এর সমস্ত মেমরি পরিচালনা স্পষ্টভাবে সম্পন্ন করতে হবে। সংকলক লেখা স্ট্রিং প্রসেসিং এবং অ্যারে পরিচালনার সাথে অনেক কিছু সরবরাহ করে। সি-তে আপনি প্রতিটি স্ট্রিংয়ের আকার এবং আপনি যে অ্যারে ঘোষণা করেন তার আকার সম্পর্কে চিন্তা করতে বাধ্য হন এবং আপনি যখন সেই জিনিসগুলিতে অ্যাক্সেস করেন তখন সূচিগুলিও পরীক্ষা করে (যদি আপনি চান যে আপনার কোডটি সুরক্ষিত এবং স্থিতিশীল হোক)। সিতে আপনার অবশ্যই গতিশীল মেমরি পরিচালনা থাকতে পারে তবে কিছুই স্বয়ংক্রিয় নয়। ম্যালোক () এবং ফ্রি () ব্যবহার করে আপনাকে স্পষ্টভাবে বরাদ্দ এবং ফ্রি মেমোরি দিতে হবে, আপনার গতিশীল অবজেক্টের আকারটি আলাদা ভেরিয়েবেলে রাখা উচিত যাতে আপনি এগুলি সীমানার বাইরে না পৌঁছে।
সি ++ তে আপনার একই ব্যবস্থা থাকতে পারে তবে এটি সত্যিকারের বিকাশের সময় দক্ষ কারণ আপনার সমস্ত মেমরি পরিচালনা কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরের মধ্যে আবশ্যক যা আপনাকে স্পষ্টভাবে কল করতে হবে না। সুতরাং সংকলকটি আপনার জন্য সংস্থানগুলি বরাদ্দ এবং নিখরচায় করছে। আপনি যদি নিজের ক্লাস তৈরি করেন তবে আপনার ডায়নামিক অবজেক্টের আকারও এনক্যাপসুলেটেড হতে পারে এবং ওভারলোডিং অপারেটরের মাধ্যমে সীমানা অ্যাক্সেসের জন্য সূচীগুলি পরীক্ষা করা যেতে পারে []। এই বিমূর্ততাগুলি আপনার কোডটিকে আরও পরিষ্কার, বুঝতে সহজতর এবং ডিবাগ করতে সহায়তা করে এবং স্পষ্টভাবে বিকাশ দ্রুততর করে তোলে।
আপনি যদি সিতে একটি সংকলক তৈরি করেন তবে এটি নিশ্চিত হওয়ার জন্য আপনাকে আরও বেশি সময় লাগবে। সি ++ আপনাকে কম সময়ে আপনার প্রকল্প শেষ করবে। সি এবং সি ++ এর সমান পারফরম্যান্স রয়েছে তবে সি ++ এর অনেক সুবিধা রয়েছে যা সি এর নেই।
CompCert প্রকল্পের একটি গবেষণা সি কম্পাইলার যা সি বা C ++ লেখা হয়, কিন্তু Ocaml এবং Coq বেশি।
লক্ষ্য করুন যে সি ++ সিতে অনুবাদ করা হত ( সিফ্রন্টে )। এখন আপনি জিমিসিতে জিসিসির ফ্রন্ট-এন্ড ব্যবহার করতে পারেন , তারপরে জিম্পলটিকে কিছু ডাটাবেসে ফেলে ফেলুন, তারপরে আপনার এসেম্বলার অনুবাদককে একটি জিম্পল লিখুন। তবে আইনী কারণগুলির ( জিসিসি রানটাইম লাইব্রেরি ব্যতিক্রম ) এর জন্য ওপেন সোর্স হওয়ার জন্য এই ধরনের সংকলক প্রয়োজন। আপনার আইনজীবীকে বিশদে জিজ্ঞাসা করুন, আমি আইনজীবী নই। জিসিসির পুরানো রূপগুলি সি (+ কয়েকটি ডোমেন নির্দিষ্ট ভাষায়) সি ++ এর কিছু বৈকল্পিকের জন্য একটি ফ্রন্ট-এন্ড সহ লেখা হয়েছে। ওপেনট্যাটকম সি-র লিখিত একটি সি ++ সংকলক হতে পারে (আমি আপনাকে এটি পরীক্ষা করে ছাড়ছি )।
প্রতিযোগিতার উত্সটি একাডেমিক এবং গবেষণার উদ্দেশ্যে অবাধে উপলব্ধ for আপনি যদি এটি শিল্প (এবং আইনগতভাবে) ব্যবহার করতে চান তবে আপনাকে অ্যাবসিন্টের কাছ থেকে কিছু লাইসেন্স নেওয়া দরকার।
আরও দেখুন এই এবং যে দুই সংশ্লিষ্ট প্রশ্নের উত্তর।
যদি আমি 2020 সালে tasked ছিল একটি সি (অথবা সি ++) গোড়া থেকে কম্পাইলার লিখতে (লিনাক্সের, হয়তো কিছু চলমান ক্রস কম্পাইলার ) আমি সম্ভবত সি লিখতে হবে না ++,। আমি ওকামল , গো , বা জং ব্যবহার করে এটি লেখার বিষয়ে বিবেচনা করব । এবং যদি অনুমতি দেওয়া হয় তবে আমি এটি ফ্রেম-সিতে ভিত্তি করতে পারি । সি বা সি ++ তে কোডিংয়ের প্রয়োজন হলে আমি প্রথমে এর জন্য কোনও আবর্জনা সংগ্রাহক লাইব্রেরি কোড করব , সম্ভবত কিছু অধ্যবসায় স্তর- পুরো প্রোগ্রামের অপ্টিমাইজেশনের জন্য দরকারী - এবং তারপরে আমি একটি রূপক পদ্ধতির বিবেচনা করব (বেশিরভাগ সি বা সি ++ কোড উত্পন্ন করে আমার অ্যাড-হক সরঞ্জামগুলির সংকলক, সম্ভবত বিসমন বা রেফার্পিসিস যদি তাই অনুমোদিত)।
আপনি সাধারণ লিপ্পে বা পাইথনগুলিতে কোডযুক্ত কিছু (কম বা কম ওপেন সোর্স) সি সংকলকগুলি দেখতে পেলেন (যেমন: শিবাইক বা এনকিউসিসি ) cc মধ্যে এছাড়াও দেখুন ZetaC ।
লক্ষ করুন যে জিসিসির সাম্প্রতিক সংস্করণগুলি প্রযুক্তিগতভাবে খাঁটি সি ++ তে কোডড নয়, তারা জিসিসিতে জড়িত এক ডজন ডোমেন সুনির্দিষ্ট ভাষা (যার বেশিরভাগ টুরিং-সম্পূর্ণ )। আমার পুরানো জিসিসি মেল্ট প্রকল্পটিও দেখুন।
ভবিষ্যতে জিসিসির সংস্করণগুলিতে কিছু পাইথন বা গাইলি ইন্টারপ্রেটার তাদের মধ্যে এম্বেড করা থাকলে (উদাহরণস্বরূপ, জিসিসির পাস ম্যানেজারের প্রতিস্থাপন হিসাবে) আমি অবাক হব না ।
মধ্যে এছাড়াও দেখুন মাইল নির্দেশক স্তম্ভ জিসিসি প্রকল্পের।