সংকলন / সংযোগ প্রক্রিয়াটি কীভাবে কাজ করে?


416

সংকলন এবং সংযোগ প্রক্রিয়াটি কীভাবে কাজ করে?

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

উত্তর:


554

একটি সি ++ প্রোগ্রাম সংকলন তিনটি পদক্ষেপ জড়িত:

  1. প্রাক প্রসেসিং: প্রিপ্রসেসর একটি সি ++ উত্স কোড ফাইল নেয় এবং #includeএস, #defineগুলি এবং অন্যান্য প্রাক প্রসেসর নির্দেশিকাগুলির সাথে ডিল করে । এই পদক্ষেপের আউটপুট প্রাক প্রসেসরের নির্দেশাবলী ছাড়াই একটি "খাঁটি" সি ++ ফাইল।

  2. সংকলন: সংকলক প্রাক প্রসেসরের আউটপুট নেয় এবং এটি থেকে একটি অবজেক্ট ফাইল তৈরি করে।

  3. লিঙ্কিং: লিঙ্কার সংকলক দ্বারা উত্পাদিত অবজেক্ট ফাইলগুলি নেয় এবং একটি লাইব্রেরি বা এক্সিকিউটেবল ফাইল তৈরি করে।

প্রাক-প্রক্রিয়াকরণ

প্রাক প্রসেসর পরিচালনা প্রাক প্রসেসর নির্দেশনা মতো #includeএবং #define। এটি সি ++ এর সিনট্যাক্সের অজগনীয়, এজন্য এটি যত্ন সহ ব্যবহার করা আবশ্যক।

এটি একবারে #includeসম্পর্কিত ফাইলগুলির বিষয়বস্তু (যা সাধারণত কেবল ঘোষণা) এর সাথে ম্যাক্রোগুলি প্রতিস্থাপন করে ( #define) ম্যাক্রোগুলি প্রতিস্থাপন করে #if, #ifdefএবং #ifndefনির্দেশের উপর ভিত্তি করে পাঠ্যগুলির বিভিন্ন অংশ নির্বাচন করে একটি সি ++ উত্স ফাইলে কাজ করে ।

প্রিপ্রসেসর প্রোট্রোসেসিং টোকেনগুলির একটি স্ট্রিমে কাজ করে। ম্যাক্রো প্রতিস্থাপনটিকে টোকেনগুলি অন্য টোকেনের সাথে প্রতিস্থাপন হিসাবে সংজ্ঞায়িত করা হয় (অপারেটর ##যখন এটি বোধগম্য হয় তখন দুটি টোকেন মার্জ করতে সক্ষম করে)।

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

নির্দেশাবলী #ifএবং চতুর চতুর ব্যবহারের সাথে এই পর্যায়ে কিছু ত্রুটি তৈরি করা যেতে পারে #error

সংকলন

সংকলন পদক্ষেপ প্রাক প্রসেসর প্রতিটি আউটপুট উপর সঞ্চালিত হয়। সংকলক খাঁটি সি ++ উত্স কোড (এখন কোনও প্রিপ্রোসেসর নির্দেশ ছাড়াই) পার্স করে এবং এ্যাসেম্বলি কোডে রূপান্তর করে। তারপরে অন্তর্নিহিত ব্যাক-এন্ড (টুলচেইনে এসেমব্লার) এর অনুরোধ জানায় যা সেই কোডটিকে মেশিন কোডে একত্রিত করে কিছু বিন্যাসে প্রকৃত বাইনারি ফাইল তৈরি করে (ELF, COFF, a.out, ...)। এই অবজেক্ট ফাইলে ইনপুটটিতে সংজ্ঞায়িত চিহ্নগুলির সংকলিত কোড (বাইনারি আকারে) রয়েছে। অবজেক্ট ফাইলে থাকা চিহ্নগুলি নাম দ্বারা উল্লেখ করা হয়।

অবজেক্ট ফাইলগুলি সংকেতগুলিকে বোঝাতে পারে যা সংজ্ঞায়িত হয় নি। আপনি যখন কোনও ঘোষণা ব্যবহার করেন এবং এর জন্য কোনও সংজ্ঞা সরবরাহ করেন না তখনই এটি হয় This সংকলকটি এতে কিছু মনে করে না, এবং উত্স ফাইলটি যতক্ষণ উত্স কোডটি সুবিন্যস্ত হয় ততক্ষণ আনবে।

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

উত্পাদিত অবজেক্ট ফাইলগুলিকে আরও সহজে পুনরায় ব্যবহারের জন্য স্ট্যাটিক লাইব্রেরি নামক বিশেষ সংরক্ষণাগারে রাখা যেতে পারে।

এটি এই পর্যায়ে যে সিন্ট্যাক্স ত্রুটি বা ব্যর্থ ওভারলোড রেজোলিউশন ত্রুটির মতো "নিয়মিত" সংকলক ত্রুটিগুলি রিপোর্ট করা হয়।

সংযোগস্থাপন

লিঙ্কার হ'ল কম্পাইলার উত্পাদিত অবজেক্ট ফাইল থেকে চূড়ান্ত সংকলন আউটপুট উত্পাদন করে। এই আউটপুটটি একটি অংশীদারি (বা গতিশীল) লাইব্রেরি হতে পারে (এবং নামটি সমান হওয়ার সাথে সাথে তারা পূর্বে উল্লিখিত স্থির লাইব্রেরিগুলির সাথে খুব বেশি মিল খুঁজে পায়নি) বা একটি এক্সিকিউটেবল।

এটি সঠিক ঠিকানাগুলির সাথে অপরিবর্তিত প্রতীকগুলিকে রেফারেন্সগুলি প্রতিস্থাপন করে সমস্ত অবজেক্ট ফাইল যুক্ত করে। এই চিহ্নগুলির প্রত্যেকটিই অন্য অবজেক্ট ফাইল বা লাইব্রেরিতে সংজ্ঞায়িত করা যেতে পারে। যদি এগুলি স্ট্যান্ডার্ড লাইব্রেরি ছাড়া অন্য লাইব্রেরিতে সংজ্ঞায়িত করা হয় তবে আপনাকে লিঙ্কারটি তাদের সম্পর্কে বলা দরকার।

এই পর্যায়ে সর্বাধিক সাধারণ ত্রুটিগুলি হ'ল সংজ্ঞা বা সদৃশ সংজ্ঞা are পূর্ববর্তীটির অর্থ হ'ল হয় সংজ্ঞাগুলি বিদ্যমান নেই (যেমন সেগুলি লিখিত হয় না), বা যে বস্তুগুলি বা লাইব্রেরিগুলি তারা থাকে সেখানে লিঙ্কারকে দেওয়া হয়নি। পরবর্তীটি সুস্পষ্ট: একই প্রতীকটি দুটি পৃথক বস্তু ফাইল বা লাইব্রেরিতে সংজ্ঞায়িত করা হয়েছিল।


39
সংকলন পর্যায়ে অবজেক্ট ফাইলে রূপান্তর করার আগে এসেম্বলারকেও কল করে।
মানব এমএন

3
অপ্টিমাইজেশন কোথায় প্রয়োগ করা হয়? প্রথম নজরে দেখে মনে হচ্ছে এটি সংকলন পদক্ষেপে সম্পন্ন হবে তবে অন্যদিকে আমি কল্পনা করতে পারি যে যথাযথ অপ্টিমাইজেশন কেবল যুক্ত হওয়ার পরেই করা যেতে পারে।
বার্ট ভ্যান হিউকেলোম

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

3
সি এর কি একই পদক্ষেপ রয়েছে?
কেভিন ঝু

6
লিঙ্কার যদি গ্রন্থাগারগুলিতে শ্রেণি / পদ্ধতি উল্লেখ করে চিহ্নগুলিকে ঠিকানাগুলিতে রূপান্তর করে, তার অর্থ কি লাইব্রেরির বাইনারিগুলি মেমরি ঠিকানায় সংরক্ষণ করা হয় যা ওএস স্থির রাখে? আমি কেবল বিভ্রান্ত হয়েছি যে লিঙ্কারটি কীভাবে সমস্ত টার্গেট সিস্টেমের জন্য স্টেডিও বাইনারিটির সঠিক ঠিকানাটি জানবে। ফাইলের পথটি সর্বদা এক রকম হবে তবে সঠিক ঠিকানাটি ঠিক বদলে যেতে পারে, তাই না?
ড্যান কার্টার

42

এই বিষয়টি সিপিগ্রামগ্রাম.কম এ আলোচনা করা হয়েছে:
https://www.cprogramming.com/compilingandlink.html

সেখানকার লেখক যা লিখেছেন তা এখানে:

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

সংকলন

সংকলন উত্স কোড ফাইলগুলি (.c, .cc, বা .cpp) এবং একটি 'অবজেক্ট' ফাইল তৈরির প্রক্রিয়া বোঝায়। এই পদক্ষেপটি ব্যবহারকারীকে চালাতে পারে এমন কোনও কিছুই তৈরি করে না। পরিবর্তে, সংকলকটি কেবল মেশিন ভাষার নির্দেশাবলী তৈরি করে যা সংকলিত উত্স কোড ফাইলের সাথে সঙ্গতিপূর্ণ। উদাহরণস্বরূপ, যদি আপনি তিনটি পৃথক ফাইল সংকলন করেন (তবে লিঙ্ক না করেন), আপনার কাছে আউটপুট হিসাবে তিনটি অবজেক্ট ফাইল তৈরি হবে, যার প্রতিটি .o বা .obj নামের সাথে থাকবে (এক্সটেনশনটি আপনার সংকলকের উপর নির্ভর করবে)। এই ফাইলগুলির প্রত্যেকটিতে আপনার উত্স কোড ফাইলটির একটি মেশিন ল্যাঙ্গুয়েজ ফাইলে অনুবাদ রয়েছে - তবে আপনি এগুলি এখনও চালাতে পারবেন না! আপনার অপারেটিং সিস্টেমটি ব্যবহার করতে পারে সেগুলি আপনাকে এক্সিকিউটেবলের মধ্যে পরিণত করতে হবে। লিঙ্কারটি এখানে আসে।

সংযোগস্থাপন

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

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

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

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


1
আমি যা বুঝতে পারি না তা হ'ল যদি প্রিপ্রোসেসর যদি একটি সুপার ফাইল তৈরি করতে # অন্তর্ভুক্তের মতো জিনিসগুলি পরিচালনা করে তবে তারপরে লিঙ্কের কিছুই নেই?
বাইনারিসম্যাকার

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

3
@ বাইনারি স্ম্যাকার এটি সম্পর্কে মন্তব্য করতে খুব দেরী করেছে, তবে অন্যরা এটি দরকারী বলে মনে করতে পারেন। youtu.be/D0TazQIkc8Q মূলত আপনি শিরোনাম ফাইল অন্তর্ভুক্ত করেন এবং এই শিরোলেখ ফাইলগুলিতে সাধারণত কেবল ভেরিয়েবল / ফাংশন এবং কেবল সংজ্ঞা থাকে না সংজ্ঞা থাকে না, সংজ্ঞাগুলি পৃথক উত্স ফাইলে উপস্থিত থাকতে পারে o সুতরাং প্রিপ্রোসেসর কেবল ঘোষণার সাথে অন্তর্ভুক্ত থাকে যেখানে সংজ্ঞা নেই লিঙ্কার সহায়তা করে You আপনি উত্স ফাইলটি যুক্ত করুন যা ভেরিয়েবল / ফাংশন ব্যবহার করে এমন উত্স ফাইল যা তাদের সংজ্ঞায়িত করে।
করণ জোহিশার

24

স্ট্যান্ডার্ড ফ্রন্টে:

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

  • অনুবাদটি অনুবাদে 9 টি পর্যায়কে সংজ্ঞায়িত করে। প্রথম চারটি প্রিপ্রোসেসিংয়ের সাথে সামঞ্জস্যপূর্ণ, পরের তিনটি সংকলন, পরেরটি হ'ল টেম্পলেটগুলির ইনস্ট্যান্টেশন ( ইনস্ট্যান্টেশন ইউনিট উত্পাদনকারী ) এবং শেষটি লিঙ্কিং।

অনুশীলনে অষ্টম পর্ব (টেমপ্লেটগুলির ইনস্ট্যান্টেশন) প্রায়শই সংকলন প্রক্রিয়া চলাকালীন হয় তবে কিছু সংকলক এটি এটিকে সংযোগের পর্যায়ে বিলম্বিত করে এবং কিছু এটি দুটিতে ছড়িয়ে দেয়।


14
আপনি কি সব 9 টি পর্যায়ের তালিকা করতে পারেন? আমি মনে করি উত্তরের একটি দুর্দান্ত সংযোজন হবে। :)
জালফ

@jalf: সম্পর্কিত: stackoverflow.com/questions/1476892/...
এসবিআই

@ জালফ, @ এসবিআই দ্বারা নির্দেশিত উত্তরের শেষ পর্বের ঠিক আগে টেম্পলেট ইনস্ট্যান্টেশন যুক্ত করুন। আইআইআরসি বিস্তৃত অক্ষরগুলি পরিচালনা করার ক্ষেত্রে যথাযথ শব্দের ক্ষেত্রে সূক্ষ্ম পার্থক্য রয়েছে, তবে আমি মনে করি না যে এগুলি ডায়াগ্রামের লেবেলে উপস্থিত রয়েছে।
এপ্রোগ্রামার

2
@ এসবিআই হ্যাঁ, তবে এটি প্রায়শই জিজ্ঞাসিত প্রশ্ন হওয়া উচিত, তাই না? তাহলে কি এই তথ্যটি এখানে পাওয়া উচিত নয় ? ;)
জলফ

3
@ এপ্রোগ্রামার: কেবলমাত্র তাদের নাম তালিকাভুক্ত করা সহায়ক হবে। তারপরে লোকেরা আরও বিশদ জানতে চাইলে কী অনুসন্ধান করতে হবে তা জানে। যাইহোক, যে কোনও ক্ষেত্রে আপনার উত্তরটি +1 করেছে :)
জাল্ফ

14

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

প্রথমে আমরা প্রতিটি কক্ষে ঠিক কী হয় তা জানতে পারার আগে আমরা যতটা সম্ভব মেমরির বরাদ্দ রেখেছি। আমরা বাইট, বা শব্দগুলি বা নির্দেশাবলী এবং আক্ষরিক এবং কোনও ডেটা গঠন করে যা কিছু খুঁজে বের করি। আমরা কেবল মেমরি বরাদ্দ করা এবং মানগুলি তৈরি করা শুরু করি যা আমরা যাওয়ার সাথে সাথে প্রোগ্রাম তৈরি করবে এবং আমাদের যে কোনও জায়গায় ফিরে যেতে হবে এবং একটি ঠিকানা ঠিক করতে হবে note সেই জায়গায় আমরা কেবলমাত্র প্যাড করতে একটি ডামি রেখেছি যাতে আমরা মেমরির আকার নির্ধারণ করতে পারি। উদাহরণস্বরূপ আমাদের প্রথম মেশিন কোডটিতে একটি সেল লাগতে পারে। পরবর্তী মেশিন কোডে একটি মেশিন কোড সেল এবং দুটি ঠিকানা ঘর জড়িত 3 টি সেল লাগতে পারে। এখন আমাদের অ্যাড্রেস পয়েন্টারটি 4 We আমরা জানি যে মেশিন কোষে কী চলে যায়, যা ওপ কোড হয়, তবে আমরা ঠিকানা কোষে কী চলে তা গণনা করতে অপেক্ষা করতে হবে যতক্ষণ না আমরা জানি যে ডেটাটি কোথায় থাকবে ie

কেবলমাত্র একটি উত্স ফাইল থাকলে একটি সংকলক তাত্ত্বিকভাবে কোনও লিঙ্কার ছাড়াই সম্পূর্ণরূপে নির্বাহযোগ্য মেশিন কোড তৈরি করতে পারে। দুটি পাসের প্রক্রিয়াতে এটি কোনও মেশিন লোড বা স্টোর নির্দেশাবলী দ্বারা রেফারেন্সযুক্ত সমস্ত ডেটা সেলগুলিতে সমস্ত প্রকৃত ঠিকানা গণনা করতে পারে। এবং এটি কোনও নিখুঁত লাফের নির্দেশাবলী দ্বারা রেফারেন্সকৃত সমস্ত নিখুঁত ঠিকানা গণনা করতে পারে। কোনও লিঙ্কার ছাড়াই এইভাবে সহজ সংকলকগুলি যেমন ফোর্থ কাজের মতো।

লিঙ্কার এমন একটি জিনিস যা কোডের ব্লকগুলিকে পৃথকভাবে সংকলন করতে দেয়। এটি বিল্ডিং কোডের সামগ্রিক প্রক্রিয়াটিকে ত্বরান্বিত করতে পারে এবং ব্লকগুলি কীভাবে পরে ব্যবহার করা হয় তার সাথে কিছুটা নমনীয়তা দেয়, অন্য কথায় এগুলিকে মেমোরিতে স্থানান্তরিত করা যেতে পারে, উদাহরণস্বরূপ, 1000 ঠিকানার ঘরগুলি দ্বারা ব্লকটি স্কूट আপ করতে প্রতিটি ঠিকানার সাথে 1000 যুক্ত করা যায়।

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

সেখানে আমরা লিঙ্কারে পৌঁছেছি। লিঙ্কার প্রথমে মেশিন কোডের এই সমস্ত ব্লককে একসাথে শেষ হয়ে যায় এবং প্রতিটি যেখানে শুরু হয় সেখানে নোট করে। তারপরে এটি একটি মডিউলের মধ্যে আপসেট অফসেট এবং বড় বিন্যাসে মডিউলটির পরম অবস্থানকে একত্রিত করে ঠিক করার জন্য ঠিকানাগুলি গণনা করে।

স্পষ্টতই আমি এটিকে আরও ছাপিয়েছি যাতে আপনি এটি উপলব্ধি করার চেষ্টা করতে পারেন এবং আমি ইচ্ছাকৃতভাবে অবজেক্ট ফাইল, প্রতীক টেবিল ইত্যাদির জার্গনটি ব্যবহার করি নি যা আমার কাছে বিভ্রান্তির অংশ is


13

জিসিসি একটি সি / সি ++ প্রোগ্রামকে 4 টি পদক্ষেপে সম্পাদনযোগ্য হিসাবে সংকলন করে।

উদাহরণ স্বরূপ, gcc -o hello hello.c নিম্নলিখিত হিসাবে বাহিত হয়:

1. প্রাক প্রক্রিয়াজাতকরণ

জিএনইউ সি প্রিপ্রসেসর ( cpp.exe) এর মাধ্যমে প্রাক প্রসেসিং , যা শিরোনাম ( #include) অন্তর্ভুক্ত করে এবং ম্যাক্রোগুলি ( #define) প্রসারিত করে ।

cpp hello.c > hello.i

ফলস্বরূপ মধ্যবর্তী ফাইল "হ্যালো.আই" তে প্রসারিত উত্স কোড রয়েছে।

2. সংকলন

সংকলক একটি নির্দিষ্ট প্রসেসরের জন্য অ্যাসেম্বলি কোডে প্রাক-প্রক্রিয়াজাত উত্স কোডটি সংকলন করে।

gcc -S hello.i

-S বিকল্পটি বস্তু কোডের পরিবর্তে অ্যাসেম্বলি কোড তৈরি করতে নির্দিষ্ট করে। ফলস্বরূপ অ্যাসেমবিলি ফাইলটি হ্যালো.এস।

3. সমাবেশ

as.exeসমাবেশকারী ( ) "হ্যালো.ও" অবজেক্ট ফাইলটিতে অ্যাসেম্বলি কোডটিকে মেশিন কোডে রূপান্তরিত করে।

as -o hello.o hello.s

4. লিঙ্কার

অবশেষে, লিঙ্কার ( ld.exe) একটি এক্সিকিউটেবল ফাইল "হ্যালো" উত্পাদন করতে লাইব্রেরি কোডের সাথে অবজেক্ট কোডটিকে লিঙ্ক করে।

    এলডি-হ্যালো হ্যালো.ও ... লাইব্রেরি ...

9

ইউআরএলটি দেখুন: http://factory.cs.niu.edu/~mcmahon/CS241/Notes/compile.html
সি ++ এর সম্পূর্ণ কমপ্লেং প্রক্রিয়াটি এই ইউআরএলে স্পষ্টভাবে প্রবর্তিত হয়েছে।


2
এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ, এটি এত সহজ এবং বুঝতে সোজা।
চিহ্নিত করুন

ভাল, সংস্থান, আপনি কি এখানে প্রক্রিয়াটির কিছু প্রাথমিক ব্যাখ্যা রাখতে পারেন, উত্তরটি অ্যালগরিদম দ্বারা নিম্ন মানের বি / সি সংক্ষিপ্ত এবং কেবল url হিসাবে চিহ্নিত করা হয়েছে।
জেসনবি

একটি দুর্দান্ত সংক্ষিপ্ত টিউটোরিয়াল আমি পেয়েছি: calleerlandsson.com/the-four-stages-of-compiling-ac-pogram
গাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.