প্রোগ্রামগুলি কাঠামোর একমাত্র যুক্তিসঙ্গত উপায় স্ট্যাকগুলি কি?


74

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


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

5
জিএলএসএল স্ট্যাক ছাড়াই কাজ করে (সেই নির্দিষ্ট বন্ধনীতে অন্যান্য ভাষার মতো)। এটি কেবল পুনরাবৃত্তি কলগুলি নিষিদ্ধ করে।
লুশেনকো

3
আপনি নিবন্ধভুক্ত উইন্ডোগুলিতেও নজর রাখতে চাইতে পারেন যা কয়েকটি আরআইএসসি আর্কিটেকচার দ্বারা ব্যবহৃত হয়।
বুথ

2
@ কেভিন: "প্রারম্ভিক ফোরট্রান সংকলকগুলি সাব্রুটিনগুলিতে কোনও পুনরুক্তি সমর্থন করেছিল। প্রাথমিক কম্পিউটার আর্কিটেকচারগুলি কোনও স্ট্যাকের কোনও ধারণাকে সমর্থন করেছিল এবং যখন তারা সরাসরি সাব্রোটিন কলকে সমর্থন করেছিল, ফিরে যাওয়ার স্থানটি প্রায়শই সাব্রুটাইন কোড সংলগ্ন একটি নির্দিষ্ট স্থানে সংরক্ষণ করা হত, যা করে সাব্রুটিনের পূর্বের কল ফিরে আসার আগে আবার সাবউরটিনকে আবার ডাকার অনুমতি দেবেন না। ফোর্টরান in 77 এ সুনির্দিষ্ট না করা সত্ত্বেও, অনেক এফ an77 সংকলক বিকল্প হিসাবে পুনরাবৃত্তি সমর্থন করেছিলেন, যদিও এটি ফরট্রান 90-এ স্ট্যান্ডার্ড হয়ে গেছে। " en.wikipedia.org/wiki/Fortran#FORTRAN_II
গরুর হাঁসের

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

উত্তর:


50

একটি (কিছুটা) কল স্ট্যাকের জনপ্রিয় বিকল্প হ'ল ধারাবাহিকতা

তোতা ভিএম উদাহরণস্বরূপ, ধারাবাহিকতা ভিত্তিক। এটি সম্পূর্ণ স্ট্যাকলেস: ডেটা রেজিস্টারগুলিতে রাখা হয় (যেমন ডালভিক বা লুয়াভিএম, তোতা নিবন্ধভিত্তিক) এবং নিয়ন্ত্রণ-প্রবাহকে ধারাবাহিকতায় উপস্থাপন করা হয় (ডালভিক বা লুয়াভিএমের বিপরীতে, যার কল স্ট্যাক রয়েছে)।

আরেকটি জনপ্রিয় ডেটা স্ট্রাকচার, সাধারণত স্মলটালক এবং লিস্প ভিএম দ্বারা ব্যবহৃত স্প্যাগেটি স্ট্যাক, যা স্ট্যাকের নেটওয়ার্কের মতো kind

@ রওয়ং যেমন উল্লেখ করেছেন , ধারাবাহিকতা-পাসিং শৈলী কল স্ট্যাকের বিকল্প। ধারাবাহিকতা-পাসিং স্টাইলে লিখিত প্রোগ্রামগুলি (বা রূপান্তরিত) কখনই ফিরে আসে না, তাই স্ট্যাকের প্রয়োজন নেই।

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


4
এটি আপনার স্ট্যাকের সংজ্ঞা উপর নির্ভর করে। আমি নিশ্চিত নই যে স্ট্যাক ফ্রেমের একটি লিঙ্কযুক্ত তালিকা (বা পয়েন্টারের অ্যারে বা ...) থাকা এতটাই "স্ট্যাক নয়" হিসাবে "স্ট্যাকের আলাদা উপস্থাপনা"; এবং সিপিএস ভাষায় প্রোগ্রামগুলি (বাস্তবে) স্ট্যাকের সাথে খুব একই রকমের ধারাবাহিকতার তালিকার কার্যকরভাবে লিঙ্কযুক্ত যাগুলি তৈরি করার প্রবণতা তৈরি করে (যদি আপনি না থাকেন তবে আপনি জিএইচসি যাচাই করতে পারেন, যা এটি একটি লিনিয়ার স্ট্যাকের উপরে "ধারাবাহিকতা" বলে যা ধাক্কা দেয়) us দক্ষতার জন্য)।
জোনাথন

6
" ধারাবাহিকতা-পাসিং স্টাইলে লিখিত প্রোগ্রামগুলি (বা রূপান্তরিত) কখনই ফিরে আসে না " ... অশুভ লাগে।
রব পেনরিজ

5
@ রবপেনরিজ: এটি কিছুটা রহস্যজনক, আমি সম্মত। সিপিএসের অর্থ হ'ল প্রত্যাবর্তনের পরিবর্তে ফাংশনগুলি তাদের কাজ শেষ হয়ে গেলে কল করার জন্য অতিরিক্ত যুক্তি হিসাবে কাজ করে। সুতরাং, যখন আপনি কোনও ফাংশনটি কল করেন এবং ফাংশনটি বলার পরে আপনাকে অন্য কিছু কাজ করতে হবে, ফাংশনটি ফিরে আসার অপেক্ষা না করে এবং আপনার কাজটি চালিয়ে যাওয়ার পরে, আপনি অবশিষ্ট কাজটি মুড়ে ফেলুন ("ধারাবাহিকতা") ) কোনও ফাংশনে প্রবেশ করুন এবং সেই ফাংশনটিকে অতিরিক্ত যুক্তি হিসাবে পাস করুন। তারপরে আপনি যে ফাংশনটি ডেকেছিলেন সেটিকে ফাংশনটি ফিরে আসার পরিবর্তে কল করে এবং আরও অনেক কিছু। কোনও ফাংশন কখনও ফেরত দেয় না, কেবল
J justrg W Mittag

3
… পরবর্তী ফাংশন কল। অতএব, আপনার একটি কল স্ট্যাকের প্রয়োজন নেই, কারণ আপনার আর কখনও ফিরে আসার প্রয়োজন হবে না এবং পূর্বে বলা ফাংশনটির বাঁধার অবস্থাটি পুনরুদ্ধার করতে হবে না। অতীতের রাজ্যটিকে ঘিরে রাখার পরিবর্তে যাতে আপনি এটিতে ফিরে আসতে পারেন, আপনি যদি চান তবে ভবিষ্যতের রাজ্যটিকে ঘিরে রাখুন ।
Jörg ডব্লু মিট্টাগ

1
@ জাস্টক্ট: স্ট্যাকের সংজ্ঞায়িত বৈশিষ্ট্যটি হ'ল আইএমও যা আপনি কেবলমাত্র শীর্ষতম উপাদানটি অ্যাক্সেস করতে পারেন। ধারাবাহিকতার একটি তালিকা, ওটিওএইচ আপনাকে কেবল শীর্ষস্থানীয় স্ট্যাকফ্রেমে নয় বরং সমস্ত ধারাবাহিকতায় অ্যাক্সেস দেয়। আপনার যদি স্মল্টালক-স্টাইলের পুনরায় শুরুযোগ্য ব্যতিক্রমগুলি থাকে, উদাহরণস্বরূপ, আপনাকে স্ট্যাকটি পপিং ছাড়াই অতিক্রম করতে সক্ষম হতে হবে। এবং কল স্ট্যাকের পরিচিত ধারণাটি রাখতে চাইলে ভাষাতে ধারাবাহিকতা থাকা স্প্যাগেটি স্ট্যাকের দিকে পরিচালিত করে, যা মূলত স্ট্যাকের একটি গাছ যেখানে ধারাবাহিকতা স্ট্যাকটিকে "কাঁটাচামচ" করে।
Jörg W Mittag

36

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

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

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

ক্রমহীন অ্যাক্সেস নির্দেশাবলী এবং কল স্ট্যাকের উপকারী ক্যাচিং আচরণের প্রদর্শিত পারফরম্যান্সের মধ্যে আমাদের কাছে কমপক্ষে বর্তমানে একটি বিজয়ী পারফরম্যান্স মডেল রয়েছে।

(আমরা ডেটা স্ট্রাকচারের পরিবর্তনের কাজগুলিতেও ফেলে দিতে পারি ...)

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


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

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

কল স্ট্যাক মডেলের নীচের দিকটি হ'ল অ্যারে এবং / অথবা ঠিকানা ওভারফ্লো খুব সাবধানতার সাথে দেখতে হবে, কারণ শোষের হিসাবে স্ব-পরিবর্তনকারী প্রোগ্রামগুলি সম্ভব হয় যদি স্তূপের নির্বিচারে বিটগুলি সম্পাদনযোগ্য হয় able
বেনপেন

14

টি এল; ডিআর

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

এই উত্তরটির বাকী অংশটি হল এলোমেলোভাবে চিন্তাভাবনা এবং উপাখ্যানগুলির সংগ্রহ এবং তাই কিছুটা বিশৃঙ্খলাবদ্ধ।


আপনি যে স্ট্যাকটি বর্ণনা করেছেন (ফাংশন কল প্রক্রিয়া হিসাবে) আবশ্যক প্রোগ্রামিংয়ের সাথে সুনির্দিষ্ট।

অত্যাবশ্যক প্রোগ্রামিং এর নীচে, আপনি মেশিন কোড পাবেন। মেশিন কোড নির্দেশের একটি ছোট ক্রম সম্পাদন করে কল স্ট্যাক অনুকরণ করতে পারে।

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

  1. সম্মিলিত যুক্তি, অর্থাত্ লজিক গেটের একটি সংযোগ (এবং, বা, না, ...) নোট করুন যে "সম্মিলিত যুক্তি" ফিডব্যাকগুলি বাদ দেয়।
  2. মেমরি, অর্থাৎ ফ্লিপ-ফ্লপ, ল্যাচস, রেজিস্টারস, এসআরএএম, ডিআরএএম ইত্যাদি,
  3. একটি রাষ্ট্রীয় মেশিন যা কিছু সংযুক্ত যুক্তি এবং কিছু মেমরি নিয়ে গঠিত, কেবলমাত্র এটি যথেষ্ট পরিমাণে যাতে এটি একটি "কন্ট্রোলার" প্রয়োগ করতে পারে যা বাকী হার্ডওয়্যার পরিচালনা করে।

নিম্নলিখিত আলোচনায় আবশ্যক প্রোগ্রামগুলি গঠনের বিকল্প পদ্ধতির প্রচুর উদাহরণ রয়েছে।

প্রোগ্রামের কাঠামো এর মতো দেখাবে:

void main(void)
{
    do
    {
        // validate inputs for task 1
        // execute task 1, inlined, 
        // must complete in a deterministically short amount of time
        // and limited to a statically allocated amount of memory
        // ...
        // validate inputs for task 2
        // execute task 2, inlined
        // ...
        // validate inputs for task N
        // execute task N, inlined
    }
    while (true);
    // if this line is reached, tell the programmers to prepare
    // themselves to appear before an accident investigation board.
    return 0; 
}

এই শৈলীটি মাইক্রোকন্ট্রোলারদের জন্য উপযুক্ত হবে, যারা তাদের জন্য সফ্টওয়্যারটিকে হার্ডওয়্যারটির কার্যকারিতার সহযোগী হিসাবে দেখেন।



@ পেটারিস: স্ট্যাকগুলি হল লাইফোর ডেটা স্ট্রাকচার।
ক্রিস্টোফার ক্রিটজিগ

1
মজাদার. আমি অন্যভাবে এটি চিন্তা করতে হবে। উদাহরণস্বরূপ, ফরটারান একটি আবশ্যক প্রোগ্রামিং ভাষা এবং প্রারম্ভিক সংস্করণগুলি কল স্ট্যাক ব্যবহার করে নি। যাইহোক, পুনরাবৃত্তি ফাংশনাল প্রোগ্রামিংয়ের মৌলিক এবং আমি স্ট্যাক ব্যবহার না করে সাধারণ ক্ষেত্রে এটি প্রয়োগ করা সম্ভব বলে মনে করি না।
টেড

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

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

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

11

না, অগত্যা নয়।

অ্যাপলের পুরানো কাগজ পড়ুন আবর্জনা সংগ্রহ স্ট্যাক বরাদ্দের চেয়ে দ্রুততর হতে পারে । এটি ধারাবাহিকতা পাস করার শৈলী ব্যবহার করে এবং একটি স্ট্যাকলেস বাস্তবায়ন দেখায়।

পুরানো কম্পিউটার আর্কিটেকচারের (যেমন আইবিএম / 360 ) কোনও হার্ডওয়্যার স্ট্যাক রেজিস্টার নেই বলেও লক্ষ করুন । কিন্তু ওএস এবং সংকলক স্ট্যাক পয়েন্টারের জন্য কনভেনশন ( কলিং কনভেনশন সম্পর্কিত ) দ্বারা একটি রেজিস্টার সংরক্ষণ করেছিলেন যাতে তাদের একটি সফ্টওয়্যার কল স্ট্যাক থাকতে পারে ।

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

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


1
চমত্কার নিশ্চিত ফোরট্রান স্ট্যাটিক রিটার্ন অবস্থানে ব্যবহার বন্ধ করে যখন ফোরট্রান -66 বাইরে এসে জন্য সমর্থন প্রয়োজন SUBROUTINEএবং FUNCTION। আপনি পূর্ববর্তী সংস্করণগুলির জন্য সঠিক, যদিও (ফরট্রান- IV এবং সম্ভবত WATFIV)।
টিএমএন

এবং অবশ্যই, অবশ্যই। এবং আইবিএম / 360 সম্পর্কে দুর্দান্ত বিষয় - এটি হার্ডওয়ার স্ট্যাকের ঠিকানা মোডগুলি হারিয়ে থাকা সত্ত্বেও যথেষ্ট ব্যবহার পেয়েছে। (আর 14, আমি বিশ্বাস করি এটি ছিল?) এবং এটিতে স্ট্যাক-ভিত্তিক ভাষার জন্য সংকলক রয়েছে, যেমন, পিএল / আই, আদা, আলগোল, সি
ডেভিডবাক

প্রকৃতপক্ষে, আমি কলেজে ৩ studied০ অধ্যয়ন করেছি এবং এটি প্রথমে চমকপ্রদ পেয়েছি।
জেডিগোগোস

1
@ জেডিগোগোজ কম্পিউটার আর্কিটেকচারের আধুনিক শিক্ষার্থীদের 360 কে বিবেচনা করার সর্বোত্তম উপায় হ'ল একটি খুব সহজ আরআইএসসি মেশিন হিসাবে ... যদিও একাধিক নির্দেশের বিন্যাস সহ ... এবং কয়েকটি মতবিরোধ রয়েছে TRএবং এর মতো TRT
ডেভিডবাক

একটি রেজিস্টার সরানোর জন্য "শূন্য এবং প্যাক যুক্ত" কীভাবে? তবে ফেরতের ঠিকানার জন্য স্ট্যাকের পরিবর্তে "শাখা এবং লিঙ্ক" ফিরে এসেছে।
জেডিগোগোস

10

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

function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = f(3)

আমরা এই প্রোগ্রামটিকে একটি স্ট্রিংয়ে রেখেছি এবং আমরা পাঠ্য প্রতিস্থাপনের মাধ্যমে প্রোগ্রামটি মূল্যায়ন করি। সুতরাং যখন আমরা মূল্যায়ন করি f(3), আমরা একটি অনুসন্ধান করি এবং আমার জন্য 3 এর সাথে প্রতিস্থাপন করি:

function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = if 3 == 0 then 1 else 3 * f(3 - 1)

গ্রেট। এখন আমরা অন্য একটি পাঠ্য প্রতিস্থাপন সম্পাদন করি: আমরা দেখতে পাই যে "যদি" এর শর্তটি মিথ্যা এবং প্রোগ্রামটি উত্পাদন করে অন্য স্ট্রিং প্রতিস্থাপন করে:

function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(3 - 1)

ধ্রুবকগুলি জড়িত সমস্ত উপ-এক্সপ্রেশনগুলিতে এখন আমরা অন্য স্ট্রিং প্রতিস্থাপন করি:

function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(2)

এবং আপনি দেখতে কিভাবে এটি যায়; আমি আর বিন্দু শ্রম করব না। আমরা নীচে না নামা পর্যন্ত let x = 6এবং আমাদের কাজ শেষ না হওয়া পর্যন্ত আমরা ধারাবাহিক স্ট্রিং বিকল্পগুলির একটি ধারাবাহিক কাজ চালিয়ে যেতে পারতাম ।

আমরা স্থানীয় ভেরিয়েবল এবং ধারাবাহিকতার তথ্যের জন্য স্ট্যাকটি traditionতিহ্যগতভাবে ব্যবহার করি; মনে রাখবেন, একটি স্ট্যাক আপনাকে জানায় না আপনি কোথা থেকে এসেছেন, এটি আপনাকে জানায় যে সেই রিটার্ন মানটি হাতে রেখে আপনি কোথায় যাচ্ছেন।

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

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


3
রেটিনা হ'ল রেজেজ-ভিত্তিক প্রোগ্রামিং ভাষার উদাহরণ যা গণনার জন্য স্ট্রিং অপারেশন ব্যবহার করে।
অ্যান্ড্রু পিলিজার

2
@ অ্যান্ড্রুপিলিজার এই দুর্দান্ত বন্ধু দ্বারা ডিজাইন করেছেন এবং প্রয়োগ করেছেন ।
বিড়াল

3

১৯ 197২-এর পার্নাসের প্রকাশনাটি মডিউলগুলিতে সংক্ষেপণ ব্যবস্থায় ব্যবহৃত হওয়া মাপদণ্ডের ভিত্তিতে যথাযথভাবে গ্রহণ করা হয়েছে যে সফ্টওয়্যারে তথ্য গোপন রাখা একটি ভাল জিনিস। এটি স্ট্রাকচারাল পচন এবং মডিউলার প্রোগ্রামিংয়ের 60 এর দশক জুড়ে দীর্ঘ বিতর্ক অনুসরণ করে।

modularity

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

গতিশীল স্কোপিং

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

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

ব্যতিক্রমসমূহ

সুতরাং, ধারাবাহিকতা মডেল স্ট্যাকের জন্য স্পষ্টভাবে কোনও ডেটা কাঠামো বজায় রাখে না, এখনও মডিউলগুলির নেস্টেড কলিং রয়েছে যা কোথাও বজায় রাখতে হবে!

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

রুয়ানং দ্বারা চিহ্নিত অবিরাম লুপ কাঠামো স্থিতিশীল সময়সূচী সহ উচ্চ-নির্ভরযোগ্যতা অ্যাপ্লিকেশনগুলিতে প্রচলিত যা অনেকগুলি সাধারণ প্রোগ্রামিং কাঠামোকে অস্বীকার করে তবে পুরো অ্যাপ্লিকেশনটিকে কোনও সাদা তথ্য বাকী হিসাবে বিবেচনা করা উচিত যা উল্লেখযোগ্য তথ্য গোপন না করে।

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


1
"যে কোনও মাল্টি-থ্রেডেড সিস্টেম" ধরে ধরে আপনি কোনও কোণে নিজেকে আঁকেন । দম্পতিযুক্ত সসীম-রাষ্ট্র মেশিনগুলির প্রয়োগের ক্ষেত্রে একাধিক থ্রেড থাকতে পারে তবে লাইফোর স্ট্যাকের প্রয়োজন নেই। এফএসএম-এর কোনও সীমাবদ্ধতা নেই যে আপনি আগের কোনও রাজ্যে ফিরে আসেন, LIFO ক্রমে একা থাকুন। সুতরাং এটি একটি আসল মাল্টি-থ্রেডেড সিস্টেম যার জন্য এটি ধারণ করে না। এবং যদি আপনি "সমান্তরাল স্বতন্ত্র ফাংশন কল স্ট্যাকস" হিসাবে বহু-থ্রেড সংজ্ঞাতে নিজেকে সীমাবদ্ধ করেন তবে আপনি বৃত্তাকার সংজ্ঞা দিয়ে শেষ করেন।
এমসাল্টারস

আমি সেভাবে প্রশ্নটি পড়ি না। ওপি ফাংশন কলগুলির সাথে পরিচিত তবে অন্যান্য সিস্টেম সম্পর্কে জিজ্ঞাসা করে ।
MSalters

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

2

সমস্ত পুরানো মেইনফ্রেমগুলি (আইবিএম সিস্টেম / 360) মোটেই কোনও স্ট্যাকের ধারণা ছিল না। 260-তে, উদাহরণস্বরূপ, মেমরির স্থির স্থানে প্যারামিটারগুলি নির্মিত হয়েছিল এবং যখন সাব্রোটিন ডাকা হত তখন R1এটি প্যারামিটার ব্লকের দিকে ইঙ্গিত করে এবং R14ফেরতের ঠিকানা সম্বলিত বলা হয়েছিল । যাকে বলা হয় রুটিন, যদি এটি অন্য সাবরুটিন কল করতে চায় তবে সেই কল করার R14আগে কোনও পরিচিত স্থানে সঞ্চয় করতে হবে।

এটি একটি স্ট্যাকের চেয়ে অনেক বেশি নির্ভরযোগ্য কারণ সংকলনের সময় প্রতিষ্ঠিত স্থির মেমরি লোকেশনগুলিতে সমস্ত কিছু সংরক্ষণ করা যেতে পারে এবং এটি 100% গ্যারান্টিযুক্ত হতে পারে যে প্রক্রিয়াগুলি স্ট্যাকের বাইরে কখনও চলে না। আজকাল আমাদের "করণীয় 1MB বরাদ্দ করুন এবং আপনার আঙ্গুলগুলি ক্রস করুন" তেমন কোনও নেই।

পিআর / আইতে মূল শব্দটি নির্দিষ্ট করে পুনরাবৃত্ত সাব্রোটিন কলকে অনুমতি দেওয়া হয়েছিল RECURSIVE। তারা বোঝায় যে সাবরুটাইন দ্বারা ব্যবহৃত স্মৃতি স্থিরভাবে বরাদ্দের পরিবর্তে গতিশীল ছিল। তবে পুনরাবৃত্ত কলগুলি এখনকার মতো বিরল ছিল।

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

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