বিভিন্ন কারণে
শিরোনাম ফাইল
প্রতিটি একক সংকলনের ইউনিটকে শত শত বা হাজার হাজার শিরোনাম (1) লোড করা এবং (2) সংকলিত হওয়া প্রয়োজন। তাদের প্রত্যেককে সাধারণত প্রতিটি সংকলন ইউনিটের জন্য পুনরায় সংযুক্ত করতে হবে, কারণ প্রাক প্রসেসর নিশ্চিত করে যে শিরোনাম সংকলনের ফলাফল প্রতিটি সংকলনের ইউনিটের মধ্যে পৃথক হতে পারে। (একটি ম্যাক্রো একটি সংকলন ইউনিটে সংজ্ঞায়িত করা যেতে পারে যা শিরোনামের সামগ্রীকে পরিবর্তন করে)।
এটি সম্ভবত হয় প্রধান কারণ, যেমন কোডের বিশাল পরিমাণ যে সংকলন ইউনিট জন্য কম্পাইল করা প্রয়োজন, এবং অতিরিক্ত হিসাবে, যে হেডার একাধিক বার কম্পাইল করা (প্রতি সংকলন ইউনিট এটি অন্তর্ভুক্ত জন্য একবার) আছে।
সংযোগস্থাপন
একবার সংকলিত হয়ে গেলে সমস্ত অবজেক্ট ফাইলগুলিকে একসাথে যুক্ত করতে হবে। এটি মূলত একটি একক প্রক্রিয়া যা খুব ভালভাবে সমান্তরাল হতে পারে না এবং আপনার পুরো প্রকল্পটি প্রক্রিয়া করতে হবে।
পদান্বয়
বাক্য গঠন পার্স করা অত্যন্ত জটিল, প্রসঙ্গের উপর নির্ভর করে এবং ছিন্নমূল করা খুব কঠিন। এটি অনেক সময় নেয়।
টেমপ্লেট
সি # List<T>
তে একমাত্র টাইপ যা সংকলিত হয় তা আপনার প্রোগ্রামে তালিকার কতগুলি ইনস্ট্যান্টেশন রয়েছে তা বিবেচনা করেই। সি ++ এ, vector<int>
একেবারে পৃথক ধরণের vector<float>
এবং প্রত্যেককে পৃথকভাবে সংকলন করতে হবে।
এটি যুক্ত করুন যে টেমপ্লেটগুলি একটি সম্পূর্ণ টিউরিং-সম্পূর্ণ "উপ-ভাষা" তৈরি করে যা সংকলকটির ব্যাখ্যা করতে হয় এবং এটি হাস্যকরভাবে জটিল হয়ে উঠতে পারে। এমনকি অপেক্ষাকৃত সাধারণ টেম্পলেট মেটাপোগ্র্যামিং কোডটি পুনরাবৃত্ত টেম্পলেটগুলি সংজ্ঞায়িত করতে পারে যা কয়েক ডজন এবং কয়েক ডজন টেম্পলেট ইনস্ট্যান্টেশন তৈরি করে। টেমপ্লেটগুলির ফলে হাস্যকরভাবে দীর্ঘ নাম সহ অত্যন্ত জটিল প্রকারের ফলে লিঙ্কারে আরও অনেক বেশি কাজ যুক্ত করা যেতে পারে। (এটি অনেক চিহ্নের নামের তুলনা করতে হবে, এবং যদি এই নামগুলি হাজার হাজার অক্ষরে বৃদ্ধি পেতে পারে তবে এটি মোটামুটি ব্যয়বহুল হয়ে উঠতে পারে)।
এবং অবশ্যই, তারা শিরোনাম ফাইলগুলির সাথে সমস্যাগুলি আরও বাড়িয়ে তোলে, কারণ টেমপ্লেটগুলি সাধারণত শিরোনামে সংজ্ঞায়িত করতে হয়, যার অর্থ প্রতিটি সংকলনের ইউনিটের জন্য অনেক বেশি কোড পার্স এবং সংকলন করতে হবে। সাদামাটা সি কোডে, একটি শিরোনামটিতে সাধারণত কেবলমাত্র ফরোয়ার্ড ডিক্লেয়ারেশন থাকে তবে প্রকৃত কোড খুব কম থাকে। সি ++ এ, প্রায় সমস্ত কোডেই শিরোনাম ফাইলগুলিতে থাকা অস্বাভাবিক নয়।
অপ্টিমাইজেশান
সি ++ কিছু কিছু নাটকীয় অনুকূলকরণের অনুমতি দেয়। সি # বা জাভা ক্লাসগুলি সম্পূর্ণরূপে মুছে ফেলার অনুমতি দেয় না (তাদের প্রতিবিম্বের উদ্দেশ্যে সেখানে থাকতে হবে), তবে একটি সাধারণ সি ++ টেমপ্লেট মেটাপোগ্রাম সহজেই কয়েক ডজন বা শত শত শ্রেণি তৈরি করতে পারে, যার সবগুলিই অনুকূলিতকরণের সাথে আবার অন্তর্ভুক্ত এবং মুছে ফেলা হয় পর্যায়.
তদুপরি, একটি সি ++ প্রোগ্রাম অবশ্যই সংকলক দ্বারা সম্পূর্ণরূপে অনুকূলিত করা উচিত। এসি # প্রোগ্রামটি লোড-সময়ে অতিরিক্ত অপ্টিমাইজেশানগুলি সম্পাদন করতে JIT সংকলকের উপর নির্ভর করতে পারে, সি ++ এর মতো কোনও "দ্বিতীয় সম্ভাবনা" পাওয়া যায় না। সংকলকটি যা জেনারেট করে তা পেতে চলেছে as
মেশিন
সি ++ মেশিন কোডে সংকলিত হয়েছে যা বাইটকোড জাভা বা। নেট ব্যবহারের চেয়ে কিছুটা জটিল হতে পারে (বিশেষত x86 এর ক্ষেত্রে)। (এটি কেবলমাত্র মন্তব্য এবং এই জাতীয় ক্ষেত্রে উল্লেখ করার কারণে এটি সম্পূর্ণতার বাইরে উল্লেখ করা হয়েছে practice বাস্তবে, এই পদক্ষেপটি মোট সংকলন সময়ের ক্ষুদ্র ভগ্নাংশের চেয়ে বেশি গ্রহণের সম্ভাবনা নেই)।
উপসংহার
এর মধ্যে বেশিরভাগ উপাদান সি কোড দ্বারা ভাগ করা হয়, যা আসলে মোটামুটি দক্ষতার সাথে সংকলন করে। পার্সিং পদক্ষেপটি সি ++ এ অনেক বেশি জটিল এবং উল্লেখযোগ্যভাবে আরও সময় নিতে পারে তবে মূল অপরাধী সম্ভবত টেমপ্লেট। এগুলি দরকারী, এবং সি ++ কে আরও বেশি শক্তিশালী ভাষা বানায় তবে তারা সংকলনের গতির ক্ষেত্রেও তাদের গ্রহণ করে।