সি ++ সংকলনটি এত দীর্ঘ সময় নেয় কেন?


540

সি # এবং জাভার তুলনায় সি ++ ফাইল সংকলন করতে খুব দীর্ঘ সময় লাগে। এটি একটি সাধারণ আকারের পাইথন স্ক্রিপ্ট চালানোর চেয়ে সি ++ ফাইল সংকলন করতে উল্লেখযোগ্যভাবে বেশি সময় নেয়। আমি বর্তমানে ভিসি ++ ব্যবহার করছি তবে যে কোনও সংকলক এর সাথে এটি একই। কেন?

আমি দুটি কারণ যা ভাবতে পেরেছি তা হ'ল হেডার ফাইলগুলি লোড করা এবং প্রিপ্রসেসর চালানো ছিল, তবে এটি কেন এত বেশি সময় নেয় তা ব্যাখ্যা করা উচিত বলে মনে হয় না।


58
ভিসি ++ প্রিম্পম্পাইল্ড হেডারগুলিকে সমর্থন করে। তাদের ব্যবহার সাহায্য করবে। অনেক.
ব্রায়ান

1
হ্যাঁ আমার ক্ষেত্রে (বেশিরভাগ সি সহ কয়েকটি শ্রেণি - কোনও টেমপ্লেট নেই) প্রম্পম্পাইল্ড শিরোনামগুলি 10x প্রায় বাড়িয়ে তোলে
লোথার

@ ব্রায়ান যদিও আমি কোনও লাইব্রেরিতে প্রাক সংকলিত মাথাটি কখনই ব্যবহার করব না
কোল জনসন

13
It takes significantly longer to compile a C++ file- আপনার কি 1 সেকেন্ডের তুলনায় 2 সেকেন্ড মানে? অবশ্যই এটি দ্বিগুণ, তবে খুব কমই তাৎপর্যপূর্ণ। অথবা আপনি 5 সেকেন্ডের তুলনায় 10 মিনিট মানে? অনুমান করুন।
নিক গ্যামন

2
আমি আমার বাজিটি মডিউলগুলিতে রেখেছি; আমি আশা করি না যে অন্যান্য প্রোগ্রামিং ভাষার চেয়ে মডিউলগুলির চেয়ে সি ++ প্রকল্পগুলি দ্রুত গতিময় হয়ে উঠবে, তবে এটি বেশিরভাগ প্রকল্পের জন্য কিছু ব্যবস্থাপনার সাথে সত্যই নিকটবর্তী হতে পারে। আমি মডিউলগুলির পরে কারুকার্য সংহতকরণের সাথে একটি ভাল প্যাকেজ ম্যানেজারটি দেখতে পাব আশা করি
আব্দুররহিম

উত্তর:


800

বিভিন্ন কারণে

শিরোনাম ফাইল

প্রতিটি একক সংকলনের ইউনিটকে শত শত বা হাজার হাজার শিরোনাম (1) লোড করা এবং (2) সংকলিত হওয়া প্রয়োজন। তাদের প্রত্যেককে সাধারণত প্রতিটি সংকলন ইউনিটের জন্য পুনরায় সংযুক্ত করতে হবে, কারণ প্রাক প্রসেসর নিশ্চিত করে যে শিরোনাম সংকলনের ফলাফল প্রতিটি সংকলনের ইউনিটের মধ্যে পৃথক হতে পারে। (একটি ম্যাক্রো একটি সংকলন ইউনিটে সংজ্ঞায়িত করা যেতে পারে যা শিরোনামের সামগ্রীকে পরিবর্তন করে)।

এটি সম্ভবত হয় প্রধান কারণ, যেমন কোডের বিশাল পরিমাণ যে সংকলন ইউনিট জন্য কম্পাইল করা প্রয়োজন, এবং অতিরিক্ত হিসাবে, যে হেডার একাধিক বার কম্পাইল করা (প্রতি সংকলন ইউনিট এটি অন্তর্ভুক্ত জন্য একবার) আছে।

সংযোগস্থাপন

একবার সংকলিত হয়ে গেলে সমস্ত অবজেক্ট ফাইলগুলিকে একসাথে যুক্ত করতে হবে। এটি মূলত একটি একক প্রক্রিয়া যা খুব ভালভাবে সমান্তরাল হতে পারে না এবং আপনার পুরো প্রকল্পটি প্রক্রিয়া করতে হবে।

পদান্বয়

বাক্য গঠন পার্স করা অত্যন্ত জটিল, প্রসঙ্গের উপর নির্ভর করে এবং ছিন্নমূল করা খুব কঠিন। এটি অনেক সময় নেয়।

টেমপ্লেট

সি # List<T>তে একমাত্র টাইপ যা সংকলিত হয় তা আপনার প্রোগ্রামে তালিকার কতগুলি ইনস্ট্যান্টেশন রয়েছে তা বিবেচনা করেই। সি ++ এ, vector<int>একেবারে পৃথক ধরণের vector<float>এবং প্রত্যেককে পৃথকভাবে সংকলন করতে হবে।

এটি যুক্ত করুন যে টেমপ্লেটগুলি একটি সম্পূর্ণ টিউরিং-সম্পূর্ণ "উপ-ভাষা" তৈরি করে যা সংকলকটির ব্যাখ্যা করতে হয় এবং এটি হাস্যকরভাবে জটিল হয়ে উঠতে পারে। এমনকি অপেক্ষাকৃত সাধারণ টেম্পলেট মেটাপোগ্র্যামিং কোডটি পুনরাবৃত্ত টেম্পলেটগুলি সংজ্ঞায়িত করতে পারে যা কয়েক ডজন এবং কয়েক ডজন টেম্পলেট ইনস্ট্যান্টেশন তৈরি করে। টেমপ্লেটগুলির ফলে হাস্যকরভাবে দীর্ঘ নাম সহ অত্যন্ত জটিল প্রকারের ফলে লিঙ্কারে আরও অনেক বেশি কাজ যুক্ত করা যেতে পারে। (এটি অনেক চিহ্নের নামের তুলনা করতে হবে, এবং যদি এই নামগুলি হাজার হাজার অক্ষরে বৃদ্ধি পেতে পারে তবে এটি মোটামুটি ব্যয়বহুল হয়ে উঠতে পারে)।

এবং অবশ্যই, তারা শিরোনাম ফাইলগুলির সাথে সমস্যাগুলি আরও বাড়িয়ে তোলে, কারণ টেমপ্লেটগুলি সাধারণত শিরোনামে সংজ্ঞায়িত করতে হয়, যার অর্থ প্রতিটি সংকলনের ইউনিটের জন্য অনেক বেশি কোড পার্স এবং সংকলন করতে হবে। সাদামাটা সি কোডে, একটি শিরোনামটিতে সাধারণত কেবলমাত্র ফরোয়ার্ড ডিক্লেয়ারেশন থাকে তবে প্রকৃত কোড খুব কম থাকে। সি ++ এ, প্রায় সমস্ত কোডেই শিরোনাম ফাইলগুলিতে থাকা অস্বাভাবিক নয়।

অপ্টিমাইজেশান

সি ++ কিছু কিছু নাটকীয় অনুকূলকরণের অনুমতি দেয়। সি # বা জাভা ক্লাসগুলি সম্পূর্ণরূপে মুছে ফেলার অনুমতি দেয় না (তাদের প্রতিবিম্বের উদ্দেশ্যে সেখানে থাকতে হবে), তবে একটি সাধারণ সি ++ টেমপ্লেট মেটাপোগ্রাম সহজেই কয়েক ডজন বা শত শত শ্রেণি তৈরি করতে পারে, যার সবগুলিই অনুকূলিতকরণের সাথে আবার অন্তর্ভুক্ত এবং মুছে ফেলা হয় পর্যায়.

তদুপরি, একটি সি ++ প্রোগ্রাম অবশ্যই সংকলক দ্বারা সম্পূর্ণরূপে অনুকূলিত করা উচিত। এসি # প্রোগ্রামটি লোড-সময়ে অতিরিক্ত অপ্টিমাইজেশানগুলি সম্পাদন করতে JIT সংকলকের উপর নির্ভর করতে পারে, সি ++ এর মতো কোনও "দ্বিতীয় সম্ভাবনা" পাওয়া যায় না। সংকলকটি যা জেনারেট করে তা পেতে চলেছে as

মেশিন

সি ++ মেশিন কোডে সংকলিত হয়েছে যা বাইটকোড জাভা বা। নেট ব্যবহারের চেয়ে কিছুটা জটিল হতে পারে (বিশেষত x86 এর ক্ষেত্রে)। (এটি কেবলমাত্র মন্তব্য এবং এই জাতীয় ক্ষেত্রে উল্লেখ করার কারণে এটি সম্পূর্ণতার বাইরে উল্লেখ করা হয়েছে practice বাস্তবে, এই পদক্ষেপটি মোট সংকলন সময়ের ক্ষুদ্র ভগ্নাংশের চেয়ে বেশি গ্রহণের সম্ভাবনা নেই)।

উপসংহার

এর মধ্যে বেশিরভাগ উপাদান সি কোড দ্বারা ভাগ করা হয়, যা আসলে মোটামুটি দক্ষতার সাথে সংকলন করে। পার্সিং পদক্ষেপটি সি ++ এ অনেক বেশি জটিল এবং উল্লেখযোগ্যভাবে আরও সময় নিতে পারে তবে মূল অপরাধী সম্ভবত টেমপ্লেট। এগুলি দরকারী, এবং সি ++ কে আরও বেশি শক্তিশালী ভাষা বানায় তবে তারা সংকলনের গতির ক্ষেত্রেও তাদের গ্রহণ করে।


38
পয়েন্ট 3 সম্পর্কিত: সি সংকলন সি ++ এর চেয়ে লক্ষণীয়ভাবে দ্রুত। এটি অবশ্যই সীমান্ত যা মন্দার কারণ এবং কোড তৈরির কারণ নয়।
টম

72
টেমপ্লেটগুলি সম্পর্কে: কেবল ভেক্টর <int> ভেক্টর <ডাবল> থেকে পৃথকভাবে সংকলন করতে হবে না, তবে ভেক্টর <int> প্রতিটি সংকলন ইউনিটে এটি পুনরায় সংকলিত হয় যা এটি ব্যবহার করে। অপ্রয়োজনীয় সংজ্ঞাগুলি লিঙ্কারের মাধ্যমে মুছে ফেলা হয়।
ডেভিড রদ্রিগেজ - ড্রিবিস

15
ড্রিবাস: সত্য, তবে এটি টেমপ্লেটগুলির জন্য নির্দিষ্ট নয়। শিরোনামে ইনলাইন ফাংশন বা অন্য যে কোনও কিছু সংজ্ঞায়িত করা হয়েছে যেখানেই এটি অন্তর্ভুক্ত রয়েছে সেদিকেই পুনরায় সংযুক্ত করা হবে। তবে হ্যাঁ, এটি টেমপ্লেটগুলির সাথে বিশেষত বেদনাদায়ক। :)
জাল্ফ

15
@ কনফিগ্রেটর: ভিজ্যুয়াল স্টুডিও এবং জিসিসি উভয়ই পূর্বনির্ধারিত শিরোলেখের জন্য অনুমতি দেয়, যা সংকলনের জন্য কিছু গুরুতর গতি-আপ আনতে পারে।
small_duck

5
অপ্টিমাইজেশন সমস্যা কিনা তা নিশ্চিত নন, যেহেতু আমাদের ডিইবিইউজি বিল্ডগুলি রিলিজ মোডের তুলনায় প্রকৃতপক্ষে ধীর হয়। পিডিবি প্রজন্মও অপরাধী।
gast128

40

মন্দাটি কোনও সংকলকের সাথে অগত্যা একই নয়।

আমি ডেলফি বা ক্যালিক্স ব্যবহার করি নি তবে এমএস-ডস-এর দিনগুলিতে, একটি টার্বো পাস্কাল প্রোগ্রাম প্রায় তাত্ক্ষণিকভাবে সংকলন করবে, যখন সমতুল্য টার্বো সি ++ প্রোগ্রামটি কেবল ক্রল হবে।

দুটি প্রধান পার্থক্য ছিল খুব শক্তিশালী মডিউল সিস্টেম এবং একটি সিনট্যাক্স যা একক-পাস সংকলনের অনুমতি দেয়।

এটি অবশ্যই সম্ভব যে সংকলন গতি কেবল সি ++ সংকলক বিকাশকারীদের পক্ষে অগ্রাধিকার হিসাবে দেখা যায় নি, তবে সি / সি ++ বাক্য গঠনতে এমন কিছু সহজাত জটিলতা রয়েছে যা প্রক্রিয়া করা আরও কঠিন করে তোলে difficult (আমি সি-তে বিশেষজ্ঞ নই, তবে ওয়াল্টার ব্রাইট, এবং বিভিন্ন বাণিজ্যিক সি / সি ++ সংকলক তৈরির পরে তিনি ডি ভাষা তৈরি করেছিলেন। তার একটি পরিবর্তন ভাষাকে আরও সহজে পার্স করার জন্য একটি প্রসঙ্গমুক্ত ব্যাকরণ প্রয়োগ করা ছিল ।)

এছাড়াও, আপনি লক্ষ্য করবেন যে মেকফিলগুলি সাধারণত সেট আপ করা হয় যাতে প্রতিটি ফাইল সি-তে আলাদা আলাদাভাবে সংকলিত হয়, সুতরাং যদি 10 উত্স ফাইলগুলি একইভাবে ব্যবহার করে তবে ফাইলটি অন্তর্ভুক্ত করে 10 বার প্রক্রিয়া করা হয়।


38
পাস্কেলের সাথে তুলনা করা আকর্ষণীয়, যেহেতু নিক্লাস রাইথ তার ভাষা এবং সংকলকগুলি ডিজাইন করার সময় একটি মানদণ্ড হিসাবে নিজেকে সংকলিত করতে সংকলকটি সময়টি ব্যবহার করেছিলেন। একটি কাহিনী রয়েছে যে দ্রুত প্রতীক দেখার জন্য মডিউলটি সাবধানতার সাথে লেখার পরে, তিনি এটিকে একটি সরল রৈখিক অনুসন্ধানের সাথে প্রতিস্থাপন করেছিলেন কারণ হ্রাসকৃত কোডের আকারটি কম্পাইলারটিকে দ্রুততরভাবে সংকলন করে made
ডায়েটরিচ এপ্প

1
পছন্দ করুন
টমাস জুবিরি

39

পার্সিং এবং কোড জেনারেশন আসলে বরং দ্রুত। আসল সমস্যাটি ফাইলগুলি খোলার এবং বন্ধ করার। মনে রাখবেন, অন্তর্ভুক্ত রক্ষীদের সাথেও, সংকলকটিতে এখনও .H ফাইলটি খোলা আছে এবং প্রতিটি লাইন পড়ুন (এবং তারপরে এটিকে উপেক্ষা করুন)।

একটি বন্ধু একবার (কাজে বিরক্ত হয়ে) তার সংস্থার অ্যাপ্লিকেশন নিয়েছিল এবং সমস্ত উত্স এবং শিরোনাম ফাইলগুলি - একটি বড় ফাইলে রেখে দেয়। সংকলনের সময়টি 3 ঘন্টা থেকে 7 মিনিটে নেমে গেছে।


14
ঠিক আছে, ফাইল অ্যাক্সেসের অবশ্যই এতে একটি হাত রয়েছে কিন্তু জাল্ফ যেমন বলেছে, এর মূল কারণটি অন্য কিছু হবে, যথা অনেকগুলি, বহু, অনেক (নেস্টেড) শিরোনাম ফাইলগুলি যা আপনার ক্ষেত্রে সম্পূর্ণভাবে বাদ যায় of
কনরাড রুডলফ

9
এটি সেই মুহুর্তে আপনার বন্ধুর প্রাক্পম্পাইল্ড শিরোনাম স্থাপন করতে হবে, বিভিন্ন শিরোনামের ফাইলগুলির মধ্যে নির্ভরতা ভেঙে দেওয়া উচিত (একের সাথে অন্য একটি শিরোনাম এড়াতে চেষ্টা করুন, পরিবর্তে ফরওয়ার্ড ডিক্লেয়ার করুন) এবং দ্রুত এইচডিডি পাওয়া উচিত। একপাশে, একটি দুর্দান্ত আশ্চর্যজনক মেট্রিক।
টম লেস

6
যদি পুরো শিরোলেখ ফাইলটি (সম্ভাব্য মন্তব্য এবং খালি লাইনগুলি বাদ দিয়ে) শিরোনাম রক্ষীদের মধ্যে থাকে, জিসিসি সঠিক চিহ্নটি সংজ্ঞায়িত করা হলে ফাইলটি মনে রাখতে এবং এড়িয়ে যেতে সক্ষম হয়।
সিজারব

11
পার্সিং একটি বড় ব্যাপার। আন্তঃনির্ভরতার সাথে একই জাতীয় আকারের উত্স / শিরোলেখ ফাইলগুলির N জোড়ার জন্য হেডার ফাইলগুলির মধ্য দিয়ে ও (এন ^ 2) পাস হয়। সমস্ত পাঠ্যকে একটি ফাইলে রেখে দেওয়া সেই অনুলিপি পার্সিং কেটে দিচ্ছে।
টম

9
ছোট দিকের নোট: অন্তর্ভুক্ত রক্ষীরা সংকলন ইউনিট প্রতি একাধিক পার্সিংয়ের বিরুদ্ধে রক্ষা করে। সামগ্রিকভাবে একাধিক পার্সিংয়ের বিরুদ্ধে নয়।
মার্কো ভ্যান ডি ভুর্ট

16

আর একটি কারণ হ'ল ঘোষণার জন্য সি প্রসেসর ব্যবহার। এমনকি শিরোনাম রক্ষীদের সাথেও .H এখনও প্রতিবার অন্তর্ভুক্ত করার পরে বার বার পার্স করতে হবে। কিছু সংকলক প্রাক-সংকলিত শিরোনামগুলি সমর্থন করে যা এটির সাথে সহায়তা করতে পারে তবে সেগুলি সর্বদা ব্যবহৃত হয় না।

আরও দেখুন: সি ++ প্রায়শই প্রশ্নযুক্ত উত্তরসমূহ


আমি মনে করি আপনার উত্তরের এই গুরুত্বপূর্ণ অংশটি নির্দেশ করার জন্য আপনার পূর্বনির্ধারিত শিরোনামগুলিতে মন্তব্য করা উচিত।
কেভিন

6
যদি পুরো শিরোলেখ ফাইলটি (সম্ভাব্য মন্তব্য এবং খালি লাইনগুলি বাদ দিয়ে) শিরোনাম রক্ষীদের মধ্যে থাকে, জিসিসি সঠিক চিহ্নটি সংজ্ঞায়িত করা হলে ফাইলটি মনে রাখতে এবং এড়িয়ে যেতে সক্ষম হয়।
সিজারব

5
@ সিজারবি: এটি এখনও একবারে সংকলন ইউনিট (.cpp ফাইল) এ সম্পূর্ণ প্রক্রিয়া করতে হবে।
স্যাম হারওয়েল

16

সি ++ মেশিন কোডে সংকলিত হয়। সুতরাং আপনার প্রি-প্রসেসর, সংকলক, অপ্টিমাইজার এবং শেষ পর্যন্ত এসেম্বলারের রয়েছে, যার সবগুলিই চালাতে হবে।

জাভা এবং সি # বাইট-কোড / আইএল এবং জাভা ভার্চুয়াল মেশিন /। নেট ফ্রেমওয়ার্ক কার্যকর (বা জেআইটি মেশিন কোডে সংকলন) কার্যকর করার পূর্বে সংকলিত হয়।

পাইথন একটি ব্যাখ্যামূলক ভাষা যা বাইট-কোডেও সংকলিত হয়।

আমি নিশ্চিত যে এর অন্যান্য কারণগুলিও রয়েছে তবে সাধারণভাবে, স্থানীয় মেশিন ভাষার সংকলন না করা সময় সাশ্রয় করে।


15
প্রাক প্রসেসিং দ্বারা যুক্ত করা ব্যয় তুচ্ছ। মন্দার জন্য প্রধান "অন্যান্য কারণ" হ'ল সংকলনটি পৃথক কার্যগুলিতে বিভক্ত করা হয়েছে (প্রতিটি বস্তু ফাইলের জন্য), তাই সাধারণ শিরোনাম বারবার প্রক্রিয়াজাত হয়। এটি ও (এন ^ 2) সবচেয়ে খারাপ ক্ষেত্রে, বনাম বেশিরভাগ অন্যান্য ভাষা ও (এন) পার্সিংয়ের সময়।
টম

12
আপনি একই যুক্তি থেকে বলতে পারেন যে সি, পাস্কাল ইত্যাদি সংকলক ধীর, যা গড় হিসাবে সত্য নয়। এটি সি ++ এর ব্যাকরণ এবং একটি সি ++ সংকলককে রক্ষণাবেক্ষণ করতে থাকা বিশাল রাজ্যের সাথে আরও অনেক কিছু করতে পারে।
সেবাস্তিয়ান মাচ

2
সি ধীর। এটি একই শিরোনাম পার্সিং সমস্যায় ভুগেছে যেমন গ্রহণযোগ্য সমাধান। উদাহরণস্বরূপ একটি সাধারণ উইন্ডোজ জিইউআই প্রোগ্রাম গ্রহণ করুন যাতে কয়েকটি সংকলনের ইউনিটে উইন্ডোজ এইচ অন্তর্ভুক্ত রয়েছে এবং সংক্ষিপ্ত সংকলনের ইউনিট যুক্ত করার সাথে সংকলনের কার্যকারিতাটি পরিমাপ করুন।
মার্কো ভ্যান ডি ভুর্ট

13

বৃহত্তম সমস্যাগুলি হ'ল:

1) অসীম শিরোনামটি পুনর্বার করছে। ইতিমধ্যে উল্লেখ করা হয়েছে। প্রশমনগুলি (একবারে # প্রাগমা মত) সাধারণত প্রতি সংকলন ইউনিট প্রতি কাজ করে, প্রতি বিল্ড প্রতি নয়।

২) সত্য যে টুলচেনটি প্রায়শই একাধিক বাইনারি (মেক, প্রিপ্রোসেসর, সংকলক, এসেম্বারার, আর্কিভার, ইমপিড, লিঙ্কার এবং চূড়ান্ত ক্ষেত্রে dlltool) এ বিভক্ত হয় যে সকলকে প্রতিটি অনুরোধের জন্য সমস্ত সময় পুনরায় নতুন করে পুনরায় লোড করতে হয় ( সংকলক, একত্রিতকারী) বা ফাইলের প্রতিটি দম্পতি (অর্চিভার, লিঙ্কার এবং dlltool)।

এই আলোচনাটি কমপ্লেক্স.পিলারগুলিতেও দেখুন: http://compilers.iecc.com/comparch/article/03-11-078 বিশেষভাবে এটি:

http://compilers.iecc.com/comparch/article/02-07-128

দ্রষ্টব্য যে জন, কম.কম্পেলার্সের মডারেটর রাজি বলে মনে হচ্ছে এবং এর অর্থ সি'র জন্যও একই ধরণের গতি অর্জন করা সম্ভব হবে যদি কেউ সরঞ্জামচেনকে পুরোপুরি একীভূত করে এবং প্রাকম্পম্পাইল্ড শিরোনাম প্রয়োগ করে। অনেক বাণিজ্যিক সি সংকলক কিছুটা ডিগ্রি করে এটি করে।

মনে রাখবেন যে ইউনিক্স মডেলটিকে পৃথক বাইনারি হিসাবে সবকিছু নির্ধারণের জন্য উইন্ডোজের (ধীর প্রক্রিয়া তৈরির সাথে) এক ধরণের নিকৃষ্টতম মডেল। উইন্ডোজ এবং * নিক্সের মধ্যে জিসিসি বিল্ড সময়গুলির সাথে তুলনা করার সময় এটি খুব লক্ষণীয়, বিশেষত যদি মেক / কনফিগার সিস্টেমটি কেবল কিছু তথ্য অর্জনের জন্য কিছু প্রোগ্রামকে কল করে।


12

বিল্ডিং সি / সি ++: আসলে কী ঘটে এবং কেন এটি এত বেশি সময় নেয়

সফ্টওয়্যার বিকাশের সময়ের তুলনামূলকভাবে বড় অংশটি লেখার, চালানো, ডিবাগিং বা কোড ডিজাইনের জন্য ব্যয় হয় না, তবে এটি সংকলন শেষ হওয়ার অপেক্ষায় থাকে। জিনিসগুলি দ্রুত করার জন্য, প্রথমে আমাদের বুঝতে হবে যখন সি / সি ++ সফ্টওয়্যার সংকলন করা হয় তখন কী ঘটছে। পদক্ষেপগুলি মোটামুটি নিম্নরূপ:

  • কনফিগারেশন
  • বিল্ড টুল স্টার্টআপ
  • নির্ভরতা পরীক্ষা করা
  • সংকলন
  • সংযোগস্থাপন

কীভাবে কীভাবে দ্রুত তৈরি করা যায় সেদিকে মনোনিবেশ করে আমরা এখন প্রতিটি ধাপে আরও বিশদে দেখব।

কনফিগারেশন

এটি নির্মাণ শুরু করার সময় প্রথম পদক্ষেপ। সাধারণত মানে একটি কনফিগার স্ক্রিপ্ট বা সিএমকেক, জিপ, এসসিএস বা অন্য কোনও সরঞ্জাম চালানো। এটি খুব বড় অটোটুলস-ভিত্তিক কনফিগার স্ক্রিপ্টগুলির জন্য এক সেকেন্ড থেকে কয়েক মিনিট সময় নিতে পারে।

এই পদক্ষেপটি অপেক্ষাকৃত বিরল ঘটে। কনফিগারেশন পরিবর্তন করতে বা বিল্ড কনফিগারেশন পরিবর্তন করার সময় এটি চালানো দরকার। বিল্ড সিস্টেম পরিবর্তন করার সংক্ষিপ্ততা, এই পদক্ষেপটি দ্রুত করার জন্য খুব বেশি কিছু করার দরকার নেই।

বিল্ড টুল স্টার্টআপ

আপনি যখন আইডিইতে বিল্ড আইকনটিতে মেক চালানোর বা ক্লিক করার সময় যা ঘটে থাকে (যা সাধারণত মেকের জন্য একটি উপাধি হয়)। বিল্ড টুল বাইনারি তার কনফিগারেশন ফাইলগুলির পাশাপাশি বিল্ড কনফিগারেশনটি শুরু করে এবং পড়ে যা সাধারণত একই জিনিস same

জটিলতা এবং আকারের উপর নির্ভর করে এটি এক সেকেন্ডের ভগ্নাংশ থেকে কয়েক সেকেন্ড পর্যন্ত যে কোনও জায়গায় নিতে পারে। নিজেই এটি এত খারাপ হবে না। দুর্ভাগ্যক্রমে বেশিরভাগ মেক-বেসড বিল্ড সিস্টেমগুলি প্রতি একক বিল্ডের জন্য দশকে দশবার আহ্বান জানায়। সাধারণত এটি মেকের পুনরাবৃত্তিমূলক ব্যবহারের কারণে ঘটে (যা খারাপ)।

এটি লক্ষ করা উচিত যে মেকটি এত ধীরে ধীরে হয় তা কোনও বাস্তবায়ন বাগ নয়। মেকফিলসের সিনট্যাক্সটিতে এমন কিছু কীর্তি রয়েছে যা সত্যিই দ্রুত বাস্তবায়নকে অসম্ভব তবে অসম্ভব করে তোলে। পরবর্তী পদক্ষেপের সাথে একত্রিত হলে এই সমস্যাটি আরও বেশি লক্ষণীয়।

নির্ভরতা পরীক্ষা করা

একবার বিল্ড টুলটি এর কনফিগারেশনটি পড়ার পরে এটি নির্ধারণ করতে হবে যে কোন ফাইলগুলি পরিবর্তন হয়েছে এবং কোনটি পুনরায় সংকলন করা দরকার। কনফিগারেশন ফাইলগুলিতে বিল্ড নির্ভরতা বর্ণনা করে একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ থাকে। এই গ্রাফটি সাধারণত কনফিগার পদক্ষেপের সময় নির্মিত হয়। বিল্ড টুল স্টার্টআপ সময় এবং নির্ভরতা স্ক্যানার প্রতিটি একক বিল্ডে চালিত হয়। তাদের সম্মিলিত রানটাইম সম্পাদনা-সংকলন-ডিবাগ চক্রের নিম্ন সীমা নির্ধারণ করে। ছোট প্রকল্পগুলির জন্য এই সময়টি সাধারণত কয়েক সেকেন্ড বা তার বেশি হয়। এটি সহনীয়। মেক করার বিকল্প রয়েছে। এর মধ্যে দ্রুততম হল নিনজা, যা ক্রোমিয়ামের জন্য গুগল ইঞ্জিনিয়াররা তৈরি করেছিলেন। আপনি যদি সিএমকে বা জিপ তৈরি করতে ব্যবহার করেন তবে তাদের নিনজা ব্যাকএন্ডে স্যুইচ করুন। বিল্ড ফাইলগুলিতে আপনাকে নিজের কোনও পরিবর্তন করতে হবে না, কেবল গতি বাড়ানো উপভোগ করুন। নিনজা বেশিরভাগ বিতরণে প্যাকেজ করা হয় না, যদিও,

সংকলন

এই মুহুর্তে আমরা শেষ পর্যন্ত সংকলকটি প্রার্থনা করি। কিছু কোণ কাটা, আনুমানিক পদক্ষেপ নেওয়া হয়েছে।

  • মার্জ অন্তর্ভুক্ত
  • কোডটি পার্সিং করা হচ্ছে
  • কোড তৈরি / অপ্টিমাইজেশন

জনপ্রিয় বিশ্বাসের বিপরীতে, সি ++ সংকলন আসলে সমস্ত ধীর নয়। এসটিএল ধীর এবং সি ++ সংকলন করতে ব্যবহৃত বেশিরভাগ বিল্ড সরঞ্জামগুলি ধীর। তবে ভাষার ধীর অংশগুলি প্রশমিত করার জন্য দ্রুত সরঞ্জাম এবং উপায় রয়েছে are

এগুলি ব্যবহার করতে কিছুটা কনুই গ্রীস লাগে তবে সুবিধাগুলি অনস্বীকার্য। দ্রুত গড়ার সময়গুলি সুখী বিকাশকারী, আরও তত্পরতা এবং শেষ পর্যন্ত আরও ভাল কোডের দিকে নিয়ে যায়।


9

একটি সংকলিত ভাষা সর্বদা একটি ব্যাখ্যা করা ভাষার চেয়ে আরও বড় প্রাথমিক ওভারহেডের প্রয়োজন হয়। উপরন্তু, সম্ভবত আপনি খুব ভাল আপনার সি ++ কোড গঠন করেন নি। উদাহরণ স্বরূপ:

#include "BigClass.h"

class SmallClass
{
   BigClass m_bigClass;
}

এর চেয়ে অনেক ধীরগতির সংকলন করে:

class BigClass;

class SmallClass
{
   BigClass* m_bigClass;
}

3
বিশেষত সত্য যদি বিগক্লাসটি আরও 5 টি ফাইল ব্যবহার করে যা আপনার প্রোগ্রামের সমস্ত কোড অন্তর্ভুক্ত করে include
টম লিজ

7
এটি সম্ভবত একটি কারণ। তবে উদাহরণস্বরূপ পাসকাল একটি সমমানের সি ++ প্রোগ্রামের জন্য সংকলিত সময়ের দশমাংশ সময় নেয়। এটি কারণ এটি নয় যে জিসিসি: এর অপ্টিমাইজেশানটি বেশি সময় নেয় তবে এটি নয় যে পাস্কেল পার্স করা আরও সহজ এবং কোনও প্রিপ্রসেসরের সাথে ডিল করতে হবে না। ডিজিটাল মার্স ডি সংকলকও দেখুন।
ড্যানিয়েল ও

2
এটি সহজে পার্সিং নয়, এটি এমন মডুলারিটি যা উইন্ডোজের পুনরায় ব্যাখ্যা করা এড়িয়ে যায় এবং প্রতিটি সংকলনের ইউনিটের জন্য অন্যান্য হেডারকে সরিয়ে দেয়। হ্যাঁ, পাস্কেল সহজে পার্স করে (যদিও পরিপক্করা, ডেলফির মতো আরও জটিল), তবে এটিই বড় পার্থক্যের কারণ নয়।
মার্কো ভ্যান ডি ভুর্ট

1
এখানে প্রদর্শিত কৌশল যা সংকলনের গতির উন্নতি প্রস্তাব করে তা ফোরওয়ার্ড ডিক্লেয়ারেশন হিসাবে পরিচিত ।
ডেভিডআরআর

মাত্র একটি ফাইলে ক্লাস লেখার। এটা কি অগোছালো কোড হবে না?
Fennekin

7

বৃহত্তর সি ++ প্রকল্পে সংকলনের সময় হ্রাস করার একটি সহজ উপায় হ'ল একটি * .cpp ফাইল অন্তর্ভুক্ত করে যা আপনার প্রকল্পের সমস্ত সিপিপি ফাইল অন্তর্ভুক্ত করে এবং এটি সংকলন করে। এটি একবারে শিরোনাম বিস্ফোরণ সমস্যা হ্রাস করে। এর সুবিধাটি হ'ল সংকলন ত্রুটিগুলি এখনও সঠিক ফাইলটি উল্লেখ করবে।

উদাহরণস্বরূপ, ধরে নিই আপনার কাছে a.cpp, b.cpp এবং c.cpp আছে .. একটি ফাইল তৈরি করুন: Every.c.c:

#include "a.cpp"
#include "b.cpp"
#include "c.cpp"

তারপরে প্রজেক্টটি কেবল সবকিছু.পিপি তৈরি করে সংকলন করুন


3
আমি এই পদ্ধতিতে আপত্তি দেখতে ব্যর্থ। ধরে নিই যে আপনি কোনও স্ক্রিপ্ট বা মেকফিল থেকে এতে অন্তর্ভুক্ত করেছেন এটি কোনও রক্ষণাবেক্ষণের সমস্যা নয়। এটি সংকলনের সমস্যাগুলিকে অবহেলা না করে সংকলনের গতি বাড়িয়ে তোলে। আপনি সংকলনে মেমরির ব্যবহারের পক্ষে তর্ক করতে পারেন তবে এটি আধুনিক মেশিনে খুব কমই সমস্যা। সুতরাং এই পদ্ধতির আপত্তি কি (এটি ভুল যে দাবী বাদ দিয়ে)?
রিলেবার্টন

9
@ রিলিবার্টন (যেহেতু কেউ আপনার মন্তব্যকে সমর্থন করেছেন) আমাকে এটি বানান করতে দিন: না এটি সংকলনের গতি বাড়ায় না। বস্তুত, এটা নিশ্চিত যে কোন কম্পাইল লাগে তোলে সময় সর্বোচ্চ পরিমাণ দ্বারা না অনুবাদ ইউনিট আলাদা। তাদের সম্পর্কে মহান জিনিস আপনি হয় না সব .cpp-এস পুনরায় কম্পাইল করতে যদি তারা পরিবর্তন না করে প্রয়োজন। (এটি স্টাইলিস্টিক যুক্তি উপেক্ষা করে)। সঠিক নির্ভরতা পরিচালন এবং সম্ভবত পূর্বনির্ধারিত শিরোনামগুলি আরও অনেক ভাল।
সেপ্টেম্বর

7
দুঃখিত, কিন্তু এই করতে , সংকলন দ্রুত গাড়ী চালানোর আপ জন্য একটি খুব দক্ষ পদ্ধতি কারণ আপনার (1) প্রায় কাছাকাছি লিঙ্ক নিষ্কাশন, এবং (2) শুধুমাত্র সাধারণভাবে ব্যবহৃত হেডার একবার প্রক্রিয়া আছে। এছাড়াও, এটি ব্যবহারে কার্যকর হয় , যদি আপনি এটি চেষ্টা করে বিরক্ত করেন। দুর্ভাগ্যক্রমে, এটি ক্রমবর্ধমান পুনর্নির্মাণকে অসম্ভব করে তোলে, তাই প্রতিটি বিল্ড পুরোপুরি স্ক্র্যাচ থেকে। কিন্তু একটি পূর্ণ এই পদ্ধতিতে পুনর্নির্মাণের হয় অনেক দ্রুত কি আপনি অন্যথায় পেতে চাই চেয়ে
jalf

4
@ বারটেকবাঞ্চেউইচজ নিশ্চিত, তবে আপনি যা বলেছিলেন তা কোনও " বাছাইকারী" ছাড়াই "এটি সংকলনের গতি বাড়ায় না"। যেমনটি আপনি বলেছিলেন, এটি প্রতিটি সংকলন সর্বাধিক পরিমাণে (আংশিক পুনর্গঠন করে না) সময় নেয়, তবে একই সাথে এটি অন্যথায় যা হবে তার তুলনায় নাটকীয়ভাবে সর্বাধিক হ্রাস করে। আমি শুধু বলছি এটি "এটি করবেন না" এর চেয়ে কিছুটা বেশি প্রয়োজন
জালফ

2
স্ট্যাটিক ভেরিয়েবল এবং ফাংশন দিয়ে মজা করুন। যদি আমি একটি বড় সংকলন ইউনিট চাই, আমি একটি বড় .cpp ফাইল তৈরি করব।
gnasher729

6

কিছু কারণ হ'ল:

1) সি ++ ব্যাকরণ সি # বা জাভার চেয়ে জটিল এবং পার্স করতে আরও সময় নেয়।

2) (আরও গুরুত্বপূর্ণ) সি ++ সংকলক মেশিন কোড উত্পাদন করে এবং সংকলনের সময় সমস্ত অপ্টিমাইজেশন করে। সি # এবং জাভা ঠিক অর্ধেক যান এবং এই পদক্ষেপগুলি JIT- এ ছেড়ে যান।


5

আপনি যে বাণিজ্যটি পাচ্ছেন তা হ'ল প্রোগ্রামটি খুব দ্রুত গতিতে চলে। উন্নয়নের সময় এটি আপনার জন্য একটি শীতল স্বাচ্ছন্দ্য হতে পারে, তবে উন্নয়ন শেষ হয়ে গেলে এটি বেশ বড় বিষয় হতে পারে এবং কেবলমাত্র ব্যবহারকারীরা প্রোগ্রামটি চালাচ্ছেন।


3

বেশিরভাগ উত্তর উল্লেখ করার ক্ষেত্রে কিছুটা অস্পষ্ট হয়ে গেছে যে সি ++ কম্পাইল করার সময় কেবল একবার সম্পাদন করা হয় এমন ক্রিয়াকলাপের ব্যয়ের কারণে সি # সর্বদা ধীর গতিতে চলবে, এই পারফরম্যান্স ব্যয়ের কারণে রানটাইম নির্ভরতাগুলিও প্রভাবিত হবে (সক্ষম হতে আরও বেশি কিছু লোড করতে সক্ষম হবে) চালানোর জন্য), সি # প্রোগ্রামগুলির সর্বদা উচ্চতর মেমরির পদচিহ্ন থাকবে তা উল্লেখ না করে, ফলস্বরূপ কর্মক্ষমতা উপলব্ধ হার্ডওয়্যারটির সামর্থ্যের সাথে আরও ঘনিষ্ঠভাবে সম্পর্কিত। একই ভাষাগুলি ব্যাখ্যা করা বা কোনও ভিএম এর উপর নির্ভরশীল অন্যান্য ভাষার ক্ষেত্রেও একই।


3

আমি দুটি বিষয় ভাবতে পারি যা সে সম্পর্কে আপনার সি ++ তে প্রোগ্রামগুলি সংকলন করছে তার গতিতে প্রভাব ফেলতে পারে।

পজিবল সমস্যা # 1 - শিরোনামের সংকলন: (এটি ইতিমধ্যে অন্য উত্তর বা মন্তব্য দ্বারা সম্বোধন করা হতে পারে বা নাও হতে পারে)) মাইক্রোসফ্ট ভিজ্যুয়াল সি ++ (একে একে ভিসি ++) পূর্বনির্ধারিত শিরোনামকে সমর্থন করে, যা আমি অত্যন্ত সুপারিশ করি। আপনি যখন একটি নতুন প্রকল্প তৈরি করেন এবং আপনি যে ধরণের প্রোগ্রাম তৈরি করছেন তা নির্বাচন করেন, আপনার পর্দায় একটি সেটআপ উইজার্ড উইন্ডো উপস্থিত হওয়া উচিত। আপনি যদি এর নীচে "নেক্সট>" বোতামটি আঘাত করেন তবে উইন্ডো আপনাকে এমন একটি পৃষ্ঠায় নিয়ে যাবে যাতে বৈশিষ্ট্যের বেশ কয়েকটি তালিকা রয়েছে; "প্রাকম্পম্পাইল্ড শিরোলেখ" বিকল্পের পাশের বাক্সটি চেক করা আছে কিনা তা নিশ্চিত করুন। (দ্রষ্টব্য: সি ++ এ উইন 32 কনসোল অ্যাপ্লিকেশনগুলির সাথে আমার অভিজ্ঞতা হয়েছে তবে সি ++ তে সমস্ত ধরণের প্রোগ্রামের ক্ষেত্রে এটি নাও হতে পারে))

সম্ভাব্য সমস্যা # 2 - লোকেশনটি সম্পন্ন হয়েছে: এই গ্রীষ্মে, আমি একটি প্রোগ্রামিং কোর্স নিয়েছি এবং আমাদের সমস্ত প্রকল্প 8 জিবি ফ্ল্যাশ ড্রাইভে সংরক্ষণ করতে হয়েছিল, যে ল্যাবটিতে আমরা যে কম্পিউটারগুলি ব্যবহার করছিলাম তার কম্পিউটারগুলি প্রতি রাতে মধ্যরাতে মুছে ফেলা হয়েছিল, যা আমাদের সমস্ত কাজ মুছে ফেলত। আপনি যদি বহনযোগ্যতা / সুরক্ষা ইত্যাদির জন্য কোনও বাহ্যিক স্টোরেজ ডিভাইসে সংকলন করে থাকেন তবে এটি খুব বেশি সময় নিতে পারেআপনার প্রোগ্রামটি সংকলনের জন্য সময় (এমনকি আমি পূর্বের উল্লিখিত পূর্বনির্ধারিত শিরোনামগুলির সাথে) বিশেষত যদি এটি মোটামুটি বড় প্রোগ্রাম। এই ক্ষেত্রে আপনার জন্য আমার পরামর্শটি হ'ল আপনি যে কম্পিউটারটি ব্যবহার করছেন তার হার্ড ড্রাইভে প্রোগ্রাম তৈরি এবং সংকলন করা এবং যখনই আপনি চান / যে কোনও কারণে আপনার প্রকল্পে কাজ করা বন্ধ করতে চান, সেগুলি আপনার বাহ্যরে স্থানান্তর করুন স্টোরেজ ডিভাইস এবং তারপরে "নিরাপদভাবে হার্ডওয়্যার এবং ইজেক্ট মিডিয়া সরান" আইকনটি ক্লিক করুন, এটি সংযোগ বিচ্ছিন্ন করতে, একটি সাদা চেক চিহ্নযুক্ত একটি সামান্য সবুজ চক্রের পিছনে একটি ছোট ফ্ল্যাশ ড্রাইভ হিসাবে উপস্থিত হওয়া উচিত।

এটি তোমাকে সাহায্য করবে বলে আশা করি; যদি তা আমাকে জানাও! :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.