বইগুলি কেন বলে, "সংকলক স্মৃতিতে পরিবর্তনশীলগুলির জন্য স্থান বরাদ্দ করে"?


18

বইগুলি কেন বলে, "সংকলক স্মৃতিতে পরিবর্তনশীলগুলির জন্য স্থান বরাদ্দ করে"। এটি কার্যকর করে যা তা করে না? আমি বোঝাতে চাইছি, উদাহরণস্বরূপ, আমি যদি নিম্নলিখিত প্রোগ্রামটি লিখি,

#include <iostream>
using namespace std;

int main()
{
   int foo;
   return 0;
}

এবং এটি সংকলন করুন এবং একটি এক্সিকিউটেবল (এটি প্রোগ্রাম.এক্সই হতে দিন) পান, এখন আমি প্রোগ্রাম.এক্সপি চালিত হলে এই এক্সিকিউটেবল ফাইলটি ভেরিয়েবল foo এর জন্য কিছু স্থান বরাদ্দ করার জন্য নিজেই আদেশ করবে। তাই না? কেন বইগুলি বলতে থাকে যে "সংকলক এটি করবে এটি করবে ... এটি করুন" দয়া করে ব্যাখ্যা করুন।


11
আপনি কোন বইয়ের কথা বলছেন?
ওয়ার্লবেল

4
আপনার "সম্পর্কিত প্রশ্ন" পৃথক প্রশ্ন হওয়া উচিত।
SShaheen


সংকলক কোড উত্পন্ন করে যা এটি করে বা এটি তারা যা বলছে। সরাসরি বা পরোক্ষভাবে.
old_timer

অবগতির জন্য stackoverflow.com/questions/7372024/... এবং লক্ষ্য করুন, একটি কম্পাইলার অনুরোধে জন্য মেমরির মধ্যে একটি অনুভূত পরিবর্তনশীল এর অবস্থান পরিবর্তন করার সিদ্ধান্ত নেন পারে যে প্রান্তিককরণ উদাহরণ: stackoverflow.com/questions/17774276/...
NoChance

উত্তর:


20

আপনি ঠিক বলেছেন যে আপনার প্রোগ্রামটি আসলে চলমান সংকলকটি চলে গেছে। এবং যদি এটি অন্য কোনও মেশিনে চলে, সংকলকটি আর উপলভ্য নয়।

আমার ধারণা এটি আসলে আপনার নিজের কোড দ্বারা বরাদ্দ মেমরির মধ্যে একটি স্পষ্ট পার্থক্য করা। সংকলকটি আপনার প্রোগ্রামে এমন কিছু কোড sertোকাবে যা মেমরি বরাদ্দ করে (যেমন নতুন, মালক বা অনুরূপ আদেশগুলি ব্যবহার করে)।

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


হ্যাঁ, এটাই আমি বিশ্বাস করি। দ্রুত উত্তর দেওয়ার জন্য ধন্যবাদ!
শান্তিময় কোডার

12
সংকলনের সময় স্ট্যাক পয়েন্টারে একটি অফসেট দ্বারা এটি স্থাপন করে স্ট্যাকের পরিবর্তনশীল ফু-র জন্য সংকলক বরাদ্দ করে। এটি হ্যাপ বরাদ্দের সাথে মোটেই সম্পর্কিত নয় যা এটি দ্বারা সম্পন্ন হয় malloc। অল।
ওয়ার্লবেল

@ হোলজার: আপনার আপত্তি অবশ্যই প্রযুক্তিগতভাবে সঠিক। তবে প্রোগ্রামটি ব্যবহারের আগে শুরু হওয়ার পরে অবশ্যই স্ট্যাক স্পেসটি বরাদ্দ করতে হবে (যা কখনও কখনও সিপিইউ আর্কিটেকচারের উপর নির্ভর করে বিভিন্ন উপায়ে হতে পারে)। আমি কীভাবে এটি ঘটে তার কিছু বিশদ জানার চেষ্টা করেছি তবে খুব বেশি সাফল্য পাইনি।
Thorten müller

2
আমি মনে করি মূল থ্রেডের জন্য স্ট্যাকের আকারটি লিঙ্কার দ্বারা সংরক্ষিত এবং তারপরে ওএস দ্বারা পরিচালিত। কাস্টম থ্রেডগুলির জন্য এটি হিপ বরাদ্দের সাথে আরও সমান হয় যেমন কলার রানটাইমের সময় আকারটি ঠিক করতে পারে।
ওয়ার্লবেল

4

এটি ভেরিয়েবলের উপর নির্ভর করে। ওএস হিপ বরাদ্দ করে, প্রোগ্রামটি স্ট্যাক বরাদ্দ করবে এবং সংকলক গ্লোবাল / স্ট্যাটিক্সের জন্য স্থান বরাদ্দ করবে, অর্থাত তারা এপিএইপিতেই তৈরি করা হয়েছে। যদি আপনি গ্লোবাল মেমরির 1MB বরাদ্দ করেন তবে আপনার এক্সেসের আকার কমপক্ষে 1MB দ্বারা বাড়বে


1
এই প্রশ্নটি এটাই নয়।
ফিলিপ

2
প্রকৃতপক্ষে এটি এখানে তালিকাভুক্ত অন্যান্য উত্তরগুলির তুলনায় প্রশ্নের নিকটবর্তী।
ভাইরবল

@ জামেস আহ, এটি আমার অভিজ্ঞতা নয়। উদাহরণস্বরূপ, int test[256][1024]; int main(){ test[0][0]=2; return 0; } এই ছোট প্রোগ্রামটিতে 1MB বরাদ্দ রয়েছে তবে কেবলমাত্র আমার একটি 1.4 কেবি অবজেক্ট ফাইল এবং একটি 8.4 কেবি এক্সিকিউটেবল। যদিও এটির সঠিক পরিমাণ র‌্যাম ব্যবহার করা উচিত।
গ্রেট ক্লোবোন

1
এটি কেবল গ্লোবালগুলির জন্য সঞ্চিত বরাদ্দ কমান্ড হওয়া উচিত নয়? আপনি যদি আন্ত বা চরের মতো আদিমগুলি ব্যবহার করে সমস্ত মানকে হার্ডকোড করে থাকেন তবে নির্বাহের আকার অবশ্যই যুক্ত হওয়া ভেরিয়েবলের পরিমাণের চেয়ে বেশি বৃদ্ধি পেতে পারে। যেমন int a1=1,a2=2,... সর্বমোট ... , a1048576=1048576;কেবলমাত্র তখনই আপনি অবশ্যই 1 মিনিটের চেয়ে বড় কিছু পেয়ে যাবেন।
গ্রেট ক্লোবর্ন

2
এটি এক্সের বিএসএস বিভাগে যা কিছু তথ্য রাখে তা
জেমস

4

সংকলকটি যা করবে তা হ'ল আপনার কোডটি নেওয়া এবং এটি মেশিন কোডে সংকলন করুন। আপনি যা উল্লেখ করেছেন তা একটি দুর্দান্ত উদাহরণ যেখানে একটি সংকলককে কেবল অনুবাদ করতে হবে।

উদাহরণস্বরূপ, আপনি যখন লিখুন

int foo;

আপনি দেখতে পাচ্ছেন যে 'আমি কম্পাইলারটিকে [ আউটপুটে এটি উত্পন্ন করে ] অনুরোধ করছি বলেছি যে কম্পিউটারটির জন্য আমি পরে উল্লেখ করতে পারি তার জন্য যথেষ্ট পরিমাণ র‌্যাম সংরক্ষণ করুন সংকলক সম্ভবত রিসোর্স আইডি বা কোনও পদ্ধতি ব্যবহার করবে যাতে ফু ট্র্যাক করতে পারে মেশিন কোড, আপনি সমাবেশ লেখার পরিবর্তে একটি পাঠ্য ফাইলে ফু ব্যবহার করতে পারেন! হুররে !

সংকলক সমস্ত লক্ষ্যযুক্ত প্রসেসর এবং ডিভাইসগুলিতে একটি চিঠি ( বা সম্ভবত কোনও উপন্যাস / এনসাইক্লোপিডিয়া ) লিখছেন বলে আপনি এটিও লক্ষ্য করতে পারেন । চিঠিটি বাইনারি সংকেতগুলিতে লেখা হয়েছে যে (সাধারণত) লক্ষ্য পরিবর্তন করে বিভিন্ন প্রসেসরে অনুবাদ করা যেতে পারে। যে কোনও 'চিঠি' এবং / অথবা কম্বো সব ধরণের অনুরোধ এবং / অথবা ডেটা প্রেরণ করতে পারে - যেমন প্রোগ্রামারটি ব্যবহৃত এই ভেরিয়েবলের জন্য স্থান বরাদ্দ করুন।


3

"সংকলক মেমরি বরাদ্দ করে" বললে আক্ষরিক অর্থে সত্যই সঠিক না হতে পারে, তবে এটি একটি রূপক যা সঠিক উপায়ে প্রস্তাব দেওয়া হয়েছে।

আসলে যা ঘটে তা হ'ল সংকলক একটি প্রোগ্রাম তৈরি করে যা তার নিজস্ব স্মৃতি বরাদ্দ করে। বাদে এটি মেমরি বরাদ্দকারী প্রোগ্রাম নয়, তবে ওএস।

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

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

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


0

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

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

byte* pointer = (byte*)malloc(...);

রান সময়, malloc একটি স্বেচ্ছাসেবী সংখ্যা ফিরে আসতে পারে কিন্তু সংকলক যত্ন নেয় না, এটি যত্নশীল সব যে যেখানে নম্বর সংরক্ষণ করা হয়।


0

আরও সঠিক বাক্যাংশটি হ'ল: - "সংকলক লোডারে ভেরিয়েবলের জন্য স্থান সংরক্ষণ করতে বলে"

সি-ইশ পরিবেশে চলকগুলির জন্য তিন ধরণের স্থান থাকবে: -

  • স্ট্যাটিক ভেরিয়েবলের জন্য একটি নির্দিষ্ট ব্লক
  • "স্বয়ংক্রিয়" ভেরিয়েবলগুলির জন্য একটি বৃহত ব্লক সাধারণত "স্ট্যাক" হিসাবে পরিচিত। ক্রিয়াকলাপগুলি প্রবেশের সময় একটি অংশকে দখল করে এবং রিটার্নে ছেড়ে দেয়।
  • "হিপ" নামে একটি বৃহত ব্লক যা প্রোগ্রাম ম্যানেজড মেমোরি বরাদ্দ করা হয় (malloc () ব্যবহার করে বা অনুরূপ মেমরি পরিচালনা API থেকে API

একটি আধুনিক ওএসে হ্যাপ মেমরিটি আসলে সংরক্ষণ করা হবে না তবে প্রয়োজনীয় হিসাবে বরাদ্দ দেওয়া হবে।


0

হ্যাঁ, আপনি ঠিক বলেছেন, এক্ষেত্রে (কোনও ফাংশনে ভেরিয়েবল ঘোষণা করে) আপনার বইয়ের বাক্যটি সম্ভবত ভুল: আপনি যখন কোনও ফাংশনে ভেরিয়েবল ঘোষণা করেন, তখন এটি ফাংশনে প্রবেশের পরে স্ট্যাকের উপর বরাদ্দ হয়ে যায়। যাইহোক, একটি সংকলক পরিস্থিতি অনুকূল করতে হবে: যদি ফাংশনটি পুনরাবৃত্তি না হয় (এর main()জন্য ভাল প্রার্থী হয়) তবে এটি সংকলন-সময় (বিএসএসে) "বরাদ্দ" করা ঠিক আছে।

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


0

রানটাইমের সময় করা একমাত্র কাজটি নির্দিষ্ট পরিমাণে স্ট্যাক পয়েন্টবার্টারকে ধাক্কা মারবে। সংকলক আগে সিদ্ধান্ত নেয়:

  • ফাংশনের জন্য কত স্ট্যাক স্পেস প্রয়োজন হবে।
  • স্ট্যাক পয়েন্টার থেকে কী অফসেটে প্রতিটি পৃথক চলক অবস্থিত হবে।

এটিকে "বরাদ্দ" বলা যেতে পারে, তবে অবশ্যই, সংকলনের সময় এটি চলমান প্রোগ্রামটির সংকলকটির কেবল মডেলটিতে স্থান দেয়।

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