উত্তর:
স্ট্যাক ফ্রেম হ'ল ডেটার একটি ফ্রেম যা স্ট্যাকের উপরে ঠেলা যায়। কল স্ট্যাকের ক্ষেত্রে, একটি স্ট্যাক ফ্রেম একটি ফাংশন কল এবং তার যুক্তি উপাত্ত উপস্থাপন করবে।
যদি আমি সঠিকভাবে মনে রাখি তবে ফাংশন রিটার্ন ঠিকানাটি প্রথমে স্ট্যাকের দিকে ধাক্কা দেওয়া হয়, তারপরে স্থানীয় ভেরিয়েবলগুলির জন্য আর্গুমেন্ট এবং স্থান। একসাথে, তারা "ফ্রেম" তৈরি করে যদিও এটি সম্ভবত আর্কিটেকচার নির্ভর। প্রসেসর প্রতিটি ফ্রেমে কয়টি বাইট রয়েছে তা জানে এবং ফ্রেমগুলি ধাক্কা দিয়ে স্ট্যাকের বাইরে ফেলা হওয়ার সাথে সাথে স্ট্যাক পয়েন্টারটি সরানো হয়।
উচ্চ স্তরের কল স্ট্যাক এবং প্রসেসরের কল স্ট্যাকের মধ্যে একটি বড় পার্থক্য রয়েছে।
যখন আমরা কোনও প্রসেসরের কল স্ট্যাকের বিষয়ে কথা বলি, আমরা সমাবেশ বা মেশিন কোডে বাইট / শব্দ স্তরে ঠিকানা এবং মানগুলির সাথে কাজ করার বিষয়ে কথা বলছি । উচ্চ স্তরের ভাষা সম্পর্কে কথা বলার সময় "কল স্ট্যাকস" রয়েছে তবে সেগুলি রানটাইম পরিবেশ দ্বারা পরিচালিত একটি ডিবাগিং / রানটাইম সরঞ্জাম যা যাতে আপনি আপনার প্রোগ্রামের (একটি উচ্চ স্তরে) যা ভুল করেছে তা লগ করতে পারেন। এই স্তরে, লাইন নম্বর এবং পদ্ধতি এবং শ্রেণীর নামগুলির মতো জিনিসগুলি প্রায়শই জানা যায়। প্রসেসরের কোডটি পাওয়ার সময়টির মধ্যে এগুলির কোনও ধারণা নেই।
আপনি যদি স্ট্যাকটি খুব ভালভাবে বুঝতে পারেন তবে আপনি বুঝতে পারবেন প্রোগ্রামে মেমরি কীভাবে কাজ করে এবং প্রোগ্রামে মেমরি কীভাবে কাজ করে তা আপনি বুঝতে পারবেন যে প্রোগ্রামে ফাংশন স্টোরটি কীভাবে এবং যদি আপনি বুঝতে পারেন প্রোগ্রামে ফাংশন স্টোরটি কীভাবে পুনরাবৃত্তির কাজ করে তা বুঝতে পারবেন এবং যদি আপনি কীভাবে পুনরাবৃত্তি ফাংশন কাজ করে তা আপনি বুঝতে পারবেন যে সংকলক কীভাবে কাজ করে এবং আপনি যদি বুঝতে পারেন যে কীভাবে সংকলক কাজ করে আপনার মনের সংকলক হিসাবে কাজ করবে এবং আপনি কোনও প্রোগ্রাম খুব সহজেই ডিবাগ করবেন
স্ট্যাক কীভাবে কাজ করে তা আমাকে ব্যাখ্যা করুন:
প্রথমে আপনাকে জানতে হবে কীভাবে কার্যাদি স্ট্যাকের মধ্যে উপস্থাপিত হয়:
গাদা স্টোর গতিশীলভাবে বরাদ্দ মান।
স্ট্যাক স্বয়ংক্রিয় বরাদ্দ এবং মুছে ফেলার মান সংরক্ষণ করে।
আসুন উদাহরণ সহ বুঝতে পারি:
def hello(x):
if x==1:
return "op"
else:
u=1
e=12
s=hello(x-1)
e+=1
print(s)
print(x)
u+=1
return e
hello(4)
এখন এই প্রোগ্রামের অংশগুলি বুঝতে:
এখন আসুন দেখুন স্ট্যাক কি এবং স্ট্যাক পার্টস কি:
স্ট্যাক বরাদ্দ:
একটি জিনিস মনে রাখবেন: যদি কোনও ফাংশনের রিটার্নের শর্তটি সন্তুষ্ট হয় তবে তা স্থানীয় ভেরিয়েবলগুলি লোড করেছে বা না তা, এটি স্ট্যাক ফ্রেমের সাথে সাথে সাথে তা স্ট্যাক থেকে ফিরে আসবে return এর অর্থ যখনই কোনও পুনরাবৃত্ত ফাংশন বেস শর্তটি সন্তুষ্ট হয় এবং আমরা বেস শর্তের পরে একটি রিটার্ন রাখি, বেস শর্তটি প্রোগ্রামের "অন্য" অংশে অবস্থিত স্থানীয় ভেরিয়েবলগুলি লোড করার জন্য অপেক্ষা করবে না। এটি অবিলম্বে স্ট্যাক থেকে বর্তমান ফ্রেমটি ফিরিয়ে দেবে যার পরের ফ্রেমটি এখন সক্রিয়করণ রেকর্ডে রয়েছে।
বাস্তবে এটি দেখুন:
ব্লকের অবনতি:
সুতরাং এখনই যখনই কোনও ফাংশন রিটার্ন স্টেটমেন্টের মুখোমুখি হয়, এটি স্ট্যাক থেকে বর্তমান ফ্রেমটি মুছে দেয়।
স্ট্যাক থেকে ফিরে আসার সময়, মানগুলি স্ট্যাকের জন্য বরাদ্দ করা হয়েছিল এমন মূল ক্রমের বিপরীতে ফিরে আসবে।
hello()
পুনরাবৃত্তভাবে পুনরায় বলা হয়েছে hello()
যা আবার (আবার) পুনরাবৃত্তি বলেছে hello()
এবং গ্লোবাল ফ্রেমটি মূল ফাংশন যা প্রথম বলে hello()
?
একটি দ্রুত মোড়ানো। কারওর আরও ভাল ব্যাখ্যা থাকতে পারে।
একটি কল স্ট্যাক 1 বা অনেকগুলি স্ট্যাক ফ্রেমের সমন্বয়ে গঠিত। প্রতিটি স্ট্যাক ফ্রেম কোনও ফাংশন বা পদ্ধতির কলের সাথে সঙ্গতিপূর্ণ যা কোনও রিটার্নের সাথে এখনও শেষ হয়নি।
স্ট্যাক ফ্রেম ব্যবহার করতে, একটি থ্রেড দুটি পয়েন্টার রাখে, একটিকে স্ট্যাক পয়েন্টার (এসপি) বলা হয়, এবং অন্যটিকে ফ্রেম পয়েন্টার (এফপি) বলা হয়। এসপি সর্বদা স্ট্যাকের "শীর্ষ" দিকে নির্দেশ করে এবং এফপি সর্বদা ফ্রেমের "শীর্ষ" দিকে নির্দেশ করে। অতিরিক্তভাবে, থ্রেডটি একটি প্রোগ্রাম কাউন্টার (পিসি )ও বজায় রাখে যা পরবর্তী নির্দেশ কার্যকর করার জন্য নির্দেশ করে।
নিম্নলিখিত স্ট্যাকে সঞ্চিত রয়েছে: স্থানীয় ভেরিয়েবল এবং অস্থায়ী পদক্ষেপ, বর্তমান নির্দেশের প্রকৃত পরামিতি (পদ্ধতি, ফাংশন, ইত্যাদি)
স্ট্যাক পরিষ্কার সম্পর্কে বিভিন্ন কলিং কনভেনশন রয়েছে।
"একটি কল স্ট্যাক স্ট্যাক ফ্রেমের সমন্বয়ে গঠিত ..." - উইকিপিডিয়া
স্ট্যাক ফ্রেম এমন একটি জিনিস যা আপনি স্ট্যাকের উপর রাখেন। এগুলি হল ডেটা স্ট্রাকচার যা কল করতে সাবরুটাইনগুলি সম্পর্কিত তথ্য ধারণ করে।
প্রোগ্রামারদের স্ট্যাক ফ্রেমগুলি সম্পর্কে কোনও বিস্তৃত শব্দে নয় এমন প্রশ্ন থাকতে পারে (যে এটি স্ট্যাকের একটি সিজ সত্তা যা কেবল একটি ফাংশন কল পরিবেশন করে এবং রিটার্নের ঠিকানা, যুক্তি এবং স্থানীয় ভেরিয়েবল রাখে) তবে সংকীর্ণ অর্থে - যখন শব্দটি stack frames
উল্লেখ করা হয়েছে সংকলক বিকল্পগুলির প্রসঙ্গ।
প্রশ্নের লেখক এটি বোঝাতে পেরেছেন বা না, তবে সংকলক বিকল্পগুলির দিক থেকে স্ট্যাক ফ্রেমের ধারণাটি একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়, এখানে অন্যান্য উত্তরগুলির দ্বারা আচ্ছাদিত নয়।
উদাহরণস্বরূপ, মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও 2015 সি / সি ++ সংকলক সম্পর্কিত নিম্নলিখিত বিকল্প রয়েছে stack frames
:
জিসিসির নিম্নলিখিত রয়েছে:
ইন্টেল সি ++ কম্পাইলারের নিম্নলিখিত রয়েছে:
যার নীচের নামটি রয়েছে:
ডেলফির নিম্নলিখিত কমান্ড-লাইন বিকল্প রয়েছে:
সেই নির্দিষ্ট অর্থে, সংকলকের দৃষ্টিকোণ থেকে, স্ট্যাক ফ্রেমটি হ'ল রুটিনের জন্য কেবল প্রবেশ এবং প্রস্থান কোড , এটি স্ট্যাকের একটি অ্যাঙ্করকে ধাক্কা দেয় - এটি ডিবাগিং এবং ব্যতিক্রম হ্যান্ডলিংয়ের জন্যও ব্যবহৃত হতে পারে। ডিবাগিং সরঞ্জামগুলি স্ট্যাকের ডেটা স্ক্যান করতে পারে এবং স্ট্যাকের মধ্যে অবস্থান করার সময় এই অ্যাঙ্কারগুলি ব্যাকট্র্যাসিংয়ের জন্য ব্যবহার করতে পারে call sites
, অর্থাৎ ক্রিয়াকলাপগুলির নামগুলি যাতে ক্রমবর্ধমান বলা হয় সেভাবে প্রদর্শন করতে। ইন্টেল আর্কিটেকচারের জন্য, এটা push ebp; mov ebp, esp
বা enter
এন্ট্রি এবং জন্য mov esp, ebp; pop ebp
বা leave
প্রস্থানের জন্য।
এই কারণেই সংকলক বিকল্পগুলির ক্ষেত্রে স্ট্যাক ফ্রেমটি কী থাকে তা কোনও প্রোগ্রামারের জন্য বুঝতে খুব গুরুত্বপূর্ণ - কারণ সংকলক এই কোডটি উত্পন্ন করতে হবে কিনা তা নিয়ন্ত্রণ করতে পারে।
কিছু ক্ষেত্রে, স্ট্যাক ফ্রেম (রুটিনের জন্য প্রবেশ এবং প্রস্থান কোড) বাদ দেওয়া যায়, এবং ভেরিয়েবলগুলি সুবিধামত বেস পয়েন্টার (বিপি / সিপি) এর পরিবর্তে স্ট্যাক পয়েন্টার (এসপি / ইএসপি / আরএসপি) এর মাধ্যমে সরাসরি অ্যাক্সেস করা যায় BP ESP / আরএসপি)। স্ট্যাক ফ্রেম বাদ দেওয়ার শর্তাদি, উদাহরণস্বরূপ:
স্ট্যাক ফ্রেমের ছাড় দেওয়া (রুটিনের জন্য এন্ট্রি এবং প্রস্থান কোড) কোডটি আরও ছোট এবং দ্রুত তৈরি করতে পারে তবে এটি স্ট্যাকের মধ্যে ডেটা ব্যাকট্রেস করতে এবং প্রোগ্রামারকে প্রদর্শন করার জন্য ডিবাগারগুলির ক্ষমতাকেও নেতিবাচকভাবে প্রভাবিত করতে পারে। এগুলি সংকলক অপশনগুলি নির্ধারণ করে যা কোন অবস্থার অধীনে কোনও ক্রিয়াকলাপের প্রবেশ এবং প্রস্থান কোড থাকা উচিত, উদাহরণস্বরূপ: (ক) সর্বদা, (খ) কখনই নয়, (গ) যখন প্রয়োজন হয় (শর্তাদি উল্লেখ করে)।
স্ট্যাক ফ্রেম একটি ফাংশন কল সম্পর্কিত প্যাক তথ্য। এই তথ্যে সাধারণত তম ফাংশন, স্থানীয় ভেরিয়েবল এবং সমাপ্তির পরে কোথায় ফিরে আসা উচিত তা যুক্ত করা হয়। অ্যাক্টিভেশন রেকর্ড স্ট্যাক ফ্রেমের অন্য নাম। স্ট্যাক ফ্রেমের লেআউটটি এবিআইতে নির্মাতার দ্বারা নির্ধারিত হয় এবং আইএসএ সমর্থনকারী প্রতিটি সংকলক অবশ্যই এই মানটিকে মেনে চলতে হবে, তবে লেআউট স্কিমটি সংকলক নির্ভর করতে পারে। সাধারণত স্ট্যাক ফ্রেমের আকার সীমাবদ্ধ থাকে না তবে স্ট্যাক ফ্রেমের সাথে হস্তক্ষেপ না করে সিস্টেম কলগুলি ... ইত্যাদি সম্পাদনের অনুমতি দেওয়ার জন্য "লাল / সুরক্ষিত অঞ্চল" নামে একটি ধারণা রয়েছে।
সবসময় এসপি থাকে তবে কয়েকটি এবিআইতে (উদাহরণস্বরূপ এআরএম এবং পাওয়ারপিসি) এফপি alচ্ছিক। স্ট্যাকের উপরে স্থাপন করার প্রয়োজন যুক্তিগুলি কেবল এসপি ব্যবহার করে অফসেট করা যেতে পারে। কোনও স্ট্যাক ফ্রেম কোনও ফাংশন কলের জন্য উত্পন্ন হয়েছে কিনা তা আর্গুমেন্টের ধরন এবং সংখ্যার উপর নির্ভর করে, স্থানীয় ভেরিয়েবলগুলি এবং কীভাবে স্থানীয় ভেরিয়েবলগুলি সাধারণত অ্যাক্সেস করা হয় তা নির্ভর করে। বেশিরভাগ আইএসএতে প্রথমে রেজিস্টারগুলি ব্যবহার করা হয় এবং যদি আর্গুমেন্টগুলি উত্সর্গ করার জন্য নিবেদিত নিবন্ধকদের চেয়ে বেশি যুক্তি থাকে তবে এগুলি স্ট্যাকের উপরে স্থাপন করা হয় (উদাহরণস্বরূপ x86 এবিআইতে পূর্ণসংখ্যার তর্কগুলি পাস করার জন্য 6 রেজিস্টার রয়েছে)। অতএব, কখনও কখনও, কিছু ফাংশন স্ট্যাকের উপর স্থাপন করার জন্য একটি স্ট্যাক ফ্রেমের প্রয়োজন হয় না, কেবল ফেরতের ঠিকানাটি স্ট্যাকের দিকে ঠেলে দেওয়া হয়।