সংক্ষেপে স্ট্যাক ফ্রেমের ধারণাটি ব্যাখ্যা করুন


200

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

তাই আমি কাউকে কিছু শব্দে এটি আমার কাছে ব্যাখ্যা করতে বলতে চাই।

উত্তর:


195

স্ট্যাক ফ্রেম হ'ল ডেটার একটি ফ্রেম যা স্ট্যাকের উপরে ঠেলা যায়। কল স্ট্যাকের ক্ষেত্রে, একটি স্ট্যাক ফ্রেম একটি ফাংশন কল এবং তার যুক্তি উপাত্ত উপস্থাপন করবে।

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

সম্পাদনা করুন:

উচ্চ স্তরের কল স্ট্যাক এবং প্রসেসরের কল স্ট্যাকের মধ্যে একটি বড় পার্থক্য রয়েছে।

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


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

78

আপনি যদি স্ট্যাকটি খুব ভালভাবে বুঝতে পারেন তবে আপনি বুঝতে পারবেন প্রোগ্রামে মেমরি কীভাবে কাজ করে এবং প্রোগ্রামে মেমরি কীভাবে কাজ করে তা আপনি বুঝতে পারবেন যে প্রোগ্রামে ফাংশন স্টোরটি কীভাবে এবং যদি আপনি বুঝতে পারেন প্রোগ্রামে ফাংশন স্টোরটি কীভাবে পুনরাবৃত্তির কাজ করে তা বুঝতে পারবেন এবং যদি আপনি কীভাবে পুনরাবৃত্তি ফাংশন কাজ করে তা আপনি বুঝতে পারবেন যে সংকলক কীভাবে কাজ করে এবং আপনি যদি বুঝতে পারেন যে কীভাবে সংকলক কাজ করে আপনার মনের সংকলক হিসাবে কাজ করবে এবং আপনি কোনও প্রোগ্রাম খুব সহজেই ডিবাগ করবেন

স্ট্যাক কীভাবে কাজ করে তা আমাকে ব্যাখ্যা করুন:

প্রথমে আপনাকে জানতে হবে কীভাবে কার্যাদি স্ট্যাকের মধ্যে উপস্থাপিত হয়:

গাদা স্টোর গতিশীলভাবে বরাদ্দ মান।
স্ট্যাক স্বয়ংক্রিয় বরাদ্দ এবং মুছে ফেলার মান সংরক্ষণ করে।

এখানে চিত্র বর্ণনা লিখুন

আসুন উদাহরণ সহ বুঝতে পারি:

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 এর অর্থ যখনই কোনও পুনরাবৃত্ত ফাংশন বেস শর্তটি সন্তুষ্ট হয় এবং আমরা বেস শর্তের পরে একটি রিটার্ন রাখি, বেস শর্তটি প্রোগ্রামের "অন্য" অংশে অবস্থিত স্থানীয় ভেরিয়েবলগুলি লোড করার জন্য অপেক্ষা করবে না। এটি অবিলম্বে স্ট্যাক থেকে বর্তমান ফ্রেমটি ফিরিয়ে দেবে যার পরের ফ্রেমটি এখন সক্রিয়করণ রেকর্ডে রয়েছে।

বাস্তবে এটি দেখুন:

এখানে চিত্র বর্ণনা লিখুন

ব্লকের অবনতি:

সুতরাং এখনই যখনই কোনও ফাংশন রিটার্ন স্টেটমেন্টের মুখোমুখি হয়, এটি স্ট্যাক থেকে বর্তমান ফ্রেমটি মুছে দেয়।

স্ট্যাক থেকে ফিরে আসার সময়, মানগুলি স্ট্যাকের জন্য বরাদ্দ করা হয়েছিল এমন মূল ক্রমের বিপরীতে ফিরে আসবে।

এখানে চিত্র বর্ণনা লিখুন


3
স্ট্যাকটি নীচের দিকে বৃদ্ধি পায় এবং গাদা উপরের দিকে বাড়তে থাকে, আপনি সেগুলি আপনার চিত্রগুলিতে বিপরীত করেছেন। এখানে সঠিক ডায়াগ্রাম
রাফেল

@ রাফেল বিভ্রান্তির জন্য দুঃখিত, আমি বৃদ্ধির দিকনির্দেশের কথা বলছিলাম আমি স্ট্যাক বৃদ্ধির দিকের কথা বলছিলাম না। বৃদ্ধির দিক এবং স্ট্যাক বৃদ্ধির দিকের মধ্যে পার্থক্য রয়েছে। এখানে দেখুন স্ট্যাকওভারফ্লো.com
প্রশ্নগুলি /

2
রাফায়েল ঠিক বলেছেন। এছাড়াও প্রথম ছবিটি ভুল। এটি অন্য কিছু দিয়ে প্রতিস্থাপন করুন ("হিপ স্ট্যাক" এর জন্য গুগল ছবিগুলি অনুসন্ধান করুন)।
নিকস

সুতরাং আমি যদি আপনার তৃতীয় চিত্রটিতে সঠিকভাবে বুঝতে পারি তবে 3 টি স্ট্যাক ফ্রেম রয়েছে কারণ hello()পুনরাবৃত্তভাবে পুনরায় বলা হয়েছে hello()যা আবার (আবার) পুনরাবৃত্তি বলেছে hello()এবং গ্লোবাল ফ্রেমটি মূল ফাংশন যা প্রথম বলে hello()?
অ্যান্ডি জে

1
লিঙ্কগুলি আমাদের কোথায় নিয়ে যায় ?? সুরক্ষার গুরুতর উদ্বেগ হিসাবে এই লিঙ্কগুলি যত তাড়াতাড়ি সম্ভব সরানো উচিত।
শিবংশু

45

একটি দ্রুত মোড়ানো। কারওর আরও ভাল ব্যাখ্যা থাকতে পারে।

একটি কল স্ট্যাক 1 বা অনেকগুলি স্ট্যাক ফ্রেমের সমন্বয়ে গঠিত। প্রতিটি স্ট্যাক ফ্রেম কোনও ফাংশন বা পদ্ধতির কলের সাথে সঙ্গতিপূর্ণ যা কোনও রিটার্নের সাথে এখনও শেষ হয়নি।

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

নিম্নলিখিত স্ট্যাকে সঞ্চিত রয়েছে: স্থানীয় ভেরিয়েবল এবং অস্থায়ী পদক্ষেপ, বর্তমান নির্দেশের প্রকৃত পরামিতি (পদ্ধতি, ফাংশন, ইত্যাদি)

স্ট্যাক পরিষ্কার সম্পর্কে বিভিন্ন কলিং কনভেনশন রয়েছে।


7
ভুলে যাবেন না যে সাব্রুটিনের ফেরতের ঠিকানাটি স্ট্যাকের উপর যায়।
টনি আর

4
ফ্রেম পয়েন্টার এছাড়াও x86 পদে বেস পয়েন্টার
পিটারচৌলা

1
আমি জোর দিয়ে বলতে চাই যে একটি সক্রিয় ফ্রেম পয়েন্টার বর্তমানে সক্রিয় পদ্ধতি অবতারের জন্য স্ট্যাক ফ্রেমের শুরুতে নির্দেশ করে।
সার্ভার খলিলভ

13

"একটি কল স্ট্যাক স্ট্যাক ফ্রেমের সমন্বয়ে গঠিত ..." -  উইকিপিডিয়া

স্ট্যাক ফ্রেম এমন একটি জিনিস যা আপনি স্ট্যাকের উপর রাখেন। এগুলি হল ডেটা স্ট্রাকচার যা কল করতে সাবরুটাইনগুলি সম্পর্কিত তথ্য ধারণ করে।


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

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

লক্ষ্য করুন স্ট্যাক ফ্রেম আকার আবশ্যক প্রসেসর পরিচিতি লাভ যখন এটি কাজে ব্যবহৃত হচ্ছে। যখন এটি হচ্ছে, তখন ডেটার আকার ইতিমধ্যে নির্ধারিত হয়। গতিশীল ভাষাগুলি স্থির ভাষার মতো মেশিন কোডে সংকলিত হয়, তবে প্রায়শই কেবল ইন-টাইম হয় তাই সংকলকটি গতিশীলতা বজায় রাখতে পারে এবং প্রসেসর "পরিচিত" ফ্রেম আকারগুলির সাথে কাজ করতে পারে। মেশিন কোড / সমাবেশের সাহায্যে উচ্চ-স্তরের ভাষাগুলি গুলিয়ে ফেলবেন না, যেখানে এই জিনিসগুলি আসলে ঘটছে actually
টনি আর

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

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

5

প্রোগ্রামারদের স্ট্যাক ফ্রেমগুলি সম্পর্কে কোনও বিস্তৃত শব্দে নয় এমন প্রশ্ন থাকতে পারে (যে এটি স্ট্যাকের একটি সিজ সত্তা যা কেবল একটি ফাংশন কল পরিবেশন করে এবং রিটার্নের ঠিকানা, যুক্তি এবং স্থানীয় ভেরিয়েবল রাখে) তবে সংকীর্ণ অর্থে - যখন শব্দটি stack framesউল্লেখ করা হয়েছে সংকলক বিকল্পগুলির প্রসঙ্গ।

প্রশ্নের লেখক এটি বোঝাতে পেরেছেন বা না, তবে সংকলক বিকল্পগুলির দিক থেকে স্ট্যাক ফ্রেমের ধারণাটি একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়, এখানে অন্যান্য উত্তরগুলির দ্বারা আচ্ছাদিত নয়।

উদাহরণস্বরূপ, মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও 2015 সি / সি ++ সংকলক সম্পর্কিত নিম্নলিখিত বিকল্প রয়েছে stack frames:

  • / ওয়ে (ফ্রেম-পয়েন্টার ছাড়)

জিসিসির নিম্নলিখিত রয়েছে:

  • -ফমিট-ফ্রেম-পয়েন্টার (ফাংশনগুলির জন্য কোনও রেজিস্টারে ফ্রেম পয়েন্টার রাখবেন না যার প্রয়োজন নেই This এটি ফ্রেম পয়েন্টারগুলি সংরক্ষণ, সেট আপ এবং পুনরুদ্ধার করার নির্দেশাবলী এড়িয়ে চলে; এটি অনেকগুলি ফাংশনে একটি অতিরিক্ত রেজিস্টার উপলব্ধ করে তোলে )

ইন্টেল সি ++ কম্পাইলারের নিম্নলিখিত রয়েছে:

  • -ফমিট-ফ্রেম-পয়েন্টার (অপ্টিমাইজেশনে সাধারণ উদ্দেশ্য নিবন্ধক হিসাবে ইবিপি ব্যবহৃত হয় কিনা তা নির্ধারণ করে)

যার নীচের নামটি রয়েছে:

  • / Oy বিভাগ

ডেলফির নিম্নলিখিত কমান্ড-লাইন বিকল্প রয়েছে:

  • - $ ডাব্লু + (স্ট্যাক ফ্রেম উত্পন্ন করুন)

সেই নির্দিষ্ট অর্থে, সংকলকের দৃষ্টিকোণ থেকে, স্ট্যাক ফ্রেমটি হ'ল রুটিনের জন্য কেবল প্রবেশ এবং প্রস্থান কোড , এটি স্ট্যাকের একটি অ্যাঙ্করকে ধাক্কা দেয় - এটি ডিবাগিং এবং ব্যতিক্রম হ্যান্ডলিংয়ের জন্যও ব্যবহৃত হতে পারে। ডিবাগিং সরঞ্জামগুলি স্ট্যাকের ডেটা স্ক্যান করতে পারে এবং স্ট্যাকের মধ্যে অবস্থান করার সময় এই অ্যাঙ্কারগুলি ব্যাকট্র্যাসিংয়ের জন্য ব্যবহার করতে পারে call sites, অর্থাৎ ক্রিয়াকলাপগুলির নামগুলি যাতে ক্রমবর্ধমান বলা হয় সেভাবে প্রদর্শন করতে। ইন্টেল আর্কিটেকচারের জন্য, এটা push ebp; mov ebp, espবা enterএন্ট্রি এবং জন্য mov esp, ebp; pop ebpবা leaveপ্রস্থানের জন্য।

এই কারণেই সংকলক বিকল্পগুলির ক্ষেত্রে স্ট্যাক ফ্রেমটি কী থাকে তা কোনও প্রোগ্রামারের জন্য বুঝতে খুব গুরুত্বপূর্ণ - কারণ সংকলক এই কোডটি উত্পন্ন করতে হবে কিনা তা নিয়ন্ত্রণ করতে পারে।

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

  • ফাংশনটি একটি পাতার ফাংশন (যেমন একটি শেষ সত্তা যা অন্য ফাংশনগুলিকে কল করে না);
  • কোনও চেষ্টা / শেষ অবধি বা চেষ্টা / বাদে বা অনুরূপ নির্মাণগুলি নেই, অর্থাত্ কোনও ব্যতিক্রম ব্যবহৃত হয় না;
  • স্ট্যাকের বহির্গামী পরামিতিগুলির সাথে কোনও রুটিনগুলি বলা হয় না;
  • ফাংশনের কোনও পরামিতি নেই;
  • ফাংশনটির কোনও ইনলাইন সমাবেশ কোড নেই;
  • ইত্যাদি ...

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


-1

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

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

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