প্রোগ্রামগুলি কল স্ট্যাকগুলি কেন ব্যবহার করে, যদি নেস্টেড ফাংশন কলগুলি ইনলাইন করা যায়?


33

সংকলকটি কেন এই জাতীয় প্রোগ্রাম গ্রহণ করবেন না:

function a(b) { return b^2 };
function c(b) { return a(b) + 5 };

এবং এটিকে একটি প্রোগ্রামে রূপান্তর করুন:

function c(b) { return b^2 + 5 };

এর মাধ্যমে কম্পিউটারের সি (খ) এর ফেরতের ঠিকানা মনে রাখা দরকার?

আমি মনে করি প্রোগ্রামটি সঞ্চয় করতে এবং এর সংকলন সমর্থন করার জন্য প্রয়োজনীয় বর্ধিত হার্ড ডিস্কের স্থান এবং র‌্যাম (যথাক্রমে) আমরা কল স্ট্যাকগুলি ব্যবহার করার কারণ। এটা কি ঠিক?


30
আপনি যদি কোনও অর্থবহ আকারের কোনও প্রোগ্রামে এটি করেন তবে কী হয় তা দেখুন। বিশেষত, একাধিক জায়গা থেকে ফাংশন আহ্বান করা হয়।
ব্যবহারকারী 253751

10
এছাড়াও, কখনও কখনও সংকলক জানে না কোন ফাংশনটি বলা হয়! window[prompt("Enter function name","")]()
নির্বোধ

26
আপনি কিভাবে function(a)b { if(b>0) return a(b-1); }একটি স্ট্যাক ছাড়া বাস্তবায়ন করবেন ?
pjc50

8
ফাংশনাল প্রোগ্রামিংয়ের সাথে সম্পর্ক কোথায়?
মাস্তভ

14
@ পিজেসি 50: এটি টেল রিকার্সিভ, সুতরাং সংকলক এটি মিউটেটেবলের সাথে একটি লুপে অনুবাদ করে b। তবে পয়েন্টটি গ্রহণ করা হয়েছে, সমস্ত পুনরাবৃত্তি ফাংশনগুলি পুনরাবৃত্তি দূর করতে পারে না এবং এমনকি যদি ফাংশনটি নীতিগতভাবে করতে পারে, সংকলকটি এটি করার জন্য যথেষ্ট স্মার্ট নাও হতে পারে।
স্টিভ জেসোপ

উত্তর:


75

এটিকে "ইনলাইনিং" বলা হয় এবং অনেক সংকলক এটির ক্ষেত্রে এটি একটি অপ্টিমাইজেশান কৌশল হিসাবে কাজ করে যেখানে এটি বোধগম্য হয়।

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

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


7
@ ব্লারফ্ল: আধুনিক সংকলকগুলির আসলে আর শিরোনামে সংজ্ঞা প্রয়োজন হয় না; তারা অনুবাদ ইউনিটগুলিতে ইনলাইন করতে পারে। যদিও এর জন্য একটি শালীন লিঙ্কার প্রয়োজন। শিরোলেখ ফাইলগুলিতে সংজ্ঞা বোবা লঙ্কারদের জন্য এক কার্যকরী কাজ।
এমসাল্টার্স

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

14
বাহ, ২৮ উত্তরের জন্য একটি প্রতিবেদনে উল্লেখ করা হয়েছে যে সমস্ত কিছুর অন্তর্ভুক্তি কেন অসম্ভব তা কারণ উল্লেখ করে না: পুনরাবৃত্তি urs
মাস্তোভ

3
@ আর ..: এলটিও হ'ল লিঙ্ক টাইম অপটিমাইজেশন, লোড টাইম অপটিমাইজেশন নয়।
MSalters

2
@immibis কিন্তু যদি স্পষ্ট স্ট্যাক কম্পাইলার চালু করা হয়, তাহলে স্ট্যাক যে হয় কল স্ট্যাক।
ব্যবহারকারী 2357112

51

আপনার প্রশ্নের দুটি অংশ রয়েছে: কেন একযোগে একাধিক ফাংশন রয়েছে (তাদের সংজ্ঞা দিয়ে ফাংশন কলগুলি প্রতিস্থাপনের পরিবর্তে) এবং কেন স্থায়ীভাবে অন্য কোথাও তাদের ডেটা বরাদ্দ না করে কল স্ট্যাকের সাহায্যে এই ফাংশনগুলি প্রয়োগ করা হয়?

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

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

অতিরিক্তভাবে, যখন আপনি করতে পারেন ততক্ষণ ইনলাইন ফাংশনগুলি না করার অনেকগুলি কারণ রয়েছে:

  1. এটি অগত্যা দ্রুত নয়। স্ট্যাক ফ্রেম স্থাপন এবং এটিকে ছিন্ন করা হতে পারে অনেকগুলি বৃহত বা লুপিং ফাংশনগুলির জন্য যা তাদের সম্পাদনের সময়টির 0.1% নয় for
  2. এটি ধীর হতে পারে। কোডের সদৃশকরণের ব্যয় হয়, উদাহরণস্বরূপ, এটি নির্দেশের ক্যাশে আরও চাপ দেবে।
  3. কিছু ফাংশন খুব বড় এবং অনেক জায়গা থেকে ডাকা হয়, এগুলিকে সর্বত্র প্রবেশ করানো যুক্তিসঙ্গত থেকে অনেক বেশি বাইনারি বৃদ্ধি করে।
  4. সংকলকগণ প্রায়শই খুব বড় ফাংশন সহ একটি কঠিন সময় থাকে। বাকি সমস্ত কিছুই সমান, আকার 2 * N এর একটি কার্য 2 * T এর বেশি সময় নেয় যেখানে N N এর একটি ফাংশন টি সময় নেয়।

1
আমি ৪ পয়েন্টে অবাক হয়েছি এর কারণ কী?
জ্যাকবিবি

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

2
"আপনার এখানে সত্যিই দুটি প্রশ্ন আছে" না, আমি তা করি না। কেবল একটি - কেন কোনও ফাংশন কলকে ঠিক স্থানধারক হিসাবে বিবেচনা করবেন না যে সংকলকটি বলতে পারে, ডাকা ফাংশনের কোডের সাথে প্রতিস্থাপন করতে পারে?
moonman239

4
@ moonman239 তারপরে আপনার শব্দটি আমাকে ফেলে দিয়েছে। এখনও, আপনার প্রশ্নের করতে পচে হিসাবে আমি আমার উত্তর না এবং আমি মনে করি একটি দরকারী দৃষ্টিকোণ আছে।

16

স্ট্যাকস আমাদের নিখুঁতভাবে নিবন্ধের সীমাবদ্ধতার সীমাবদ্ধতা বাইপাস করতে অনুমতি দেয় allow

ঠিক 26 গ্লোবালগুলি "রেজিস্টার এজে" আছে (বা এমনকি 8080 চিপের কেবল 7 বাইট-আকারের রেজিস্টার রয়েছে) কল্পনা করুন এবং আপনি এই অ্যাপ্লিকেশনটিতে লিখেছেন এমন প্রতিটি ফাংশন এই সমতল তালিকা ভাগ করে দেয়।

প্রথম কাজটিতে প্রথম কয়েকটি নিবন্ধক বরাদ্দ করা একটি নির্বোধের সূচনা হবে এবং এটি জানতে পেরেছিল যে এটি মাত্র 3 নিয়েছে, দ্বিতীয় ফাংশনের জন্য "ডি" দিয়ে শুরু করুন ... আপনি দ্রুত রান আউট হয়ে যান।

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

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

(পুনরাবৃত্তি দুর্দান্ত, তবে আপনি যদি কখনও স্ট্যাক ছাড়াই রেজিস্টারগুলিকে জাগ্রত করতে চান, তবে আপনি সত্যিই স্ট্যাকের প্রশংসা করবেন))


আমি মনে করি প্রোগ্রামটি সঞ্চয় করতে এবং এর সংকলন সমর্থন করার জন্য প্রয়োজনীয় বর্ধিত হার্ড ডিস্কের স্থান এবং র‌্যাম (যথাক্রমে) আমরা কল স্ট্যাকগুলি ব্যবহার করার কারণ। এটা কি ঠিক?

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

উদাহরণস্বরূপ, পলিমার্ফিক অবজেক্টস - আপনি যদি একমাত্র এবং কেবলমাত্র এক ধরণের অবজেক্টকে আপনাকে হস্তান্তরিত না করেন তবে আপনি সমতল করতে পারবেন না; আপনাকে অবজেক্টের vtable এর বৈশিষ্ট্যগুলি দেখতে হবে এবং সেই পয়েন্টারের মাধ্যমে কল করতে হবে ... রানটাইম করতে তুচ্ছ, সংকলনের সময় ইনলাইন করা অসম্ভব।

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

class Base {
    public: void act() = 0;
};
class Child1: public Base {
    public: void act() {};
};
void ActOn(Base* something) {
    something->act();
}
void InlineMe() {
    Child1 thingamabob;
    ActOn(&thingamabob);
}

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

তবে একই ফাংশনের আরও কিছু অনুরোধ অন্তর্ভুক্ত থাকলেও কোনও কিছুর অনিশ্চয়তার কারণে এটি কোনও স্বতন্ত্র ফাংশনকে কল হিসাবে ছেড়ে দেবে ।


11

যে পদ্ধতিগুলি সেই পদ্ধতির দ্বারা পরিচালনা করতে পারে না:

function fib(a) { if(a>2) return fib(a-1)+fib(a-2); else return 1; }

function many(a) { for(i = 1 to a) { b(i); };}

সেখানে হয় ভাষা এবং সীমিত অথবা কোন কল stacks সঙ্গে প্ল্যাটফর্ম। পিআইসি মাইক্রোপ্রসেসরগুলির একটি হার্ডওয়্যার স্ট্যাক 2 থেকে 32 এন্ট্রি মধ্যে সীমাবদ্ধ । এটি ডিজাইনের সীমাবদ্ধতা তৈরি করে।

COBOL পুনরাবৃত্তি নিষিদ্ধ: https://stackoverflow.com/questions/27806812/in-cobol-is-it-possible-to-recursively-call-a-paragraph

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


12
আপনার প্রথম উদাহরণটি মূল পুনরাবৃত্তি এবং আপনি সেখানে সঠিক correct তবে আপনার দ্বিতীয় উদাহরণটি অন্য ফাংশনটিকে লুপ করার জন্য বলে মনে হচ্ছে। ইন-লাইনিং ফাংশনটি কোনও লুপ আন্রোল করার চেয়ে আলাদা; ফাংশনটি লুপটি নিবন্ধন না করে ইন-রেখাযুক্ত করা যেতে পারে। নাকি আমি কিছু সূক্ষ্ম বিবরণ মিস করেছি?
jpmc26

1
যদি আপনার প্রথম উদাহরণটি ফিবোনাচি সিরিজটি সংজ্ঞায়িত করতে বোঝানো হয় তবে এটি ভুল। (এটি একটি fibকল অনুপস্থিত ))
পাওলো ইবারম্যান

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

8

আপনি ফাংশন ইনলাইনিং করতে চান এবং বেশিরভাগ ( অনুকূলকরণ ) সংকলকরা এটি করছে doing

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

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

আপনি কিছুটা ফাংশনাল প্রোগ্রামিং স্টাইলে ফোকাস করছি , যেহেতু আপনি আপনার ক্যাসেশনটিকে ট্যাগ করেছেন।

লক্ষ্য করুন যে আপনার কোনও কল স্ট্যাকের প্রয়োজন নেই (কমপক্ষে "কল স্ট্যাক" এক্সপ্রেশনটির মেশিন অর্থে)। আপনি কেবল গাদা ব্যবহার করতে পারেন।

সুতরাং, একটি নিতে এ বর্ণন continuations এবং সম্বন্ধে আরও পড়তে ধারাবাহিকতা ক্ষণস্থায়ী শৈলী (সিপিএস) এবং সিপিএস রূপান্তর (intuitively,, আপনি ধারাবাহিকতা ব্যবহার করতে পারে বন্ধ reified "Call ফ্রেম" গাদা বরাদ্দ হিসাবে, এবং তারা একটি কল স্ট্যাক অনুকারী সাজানোর অফ হয়; তাহলে আপনার একটি দক্ষ আবর্জনা সংগ্রহকারী প্রয়োজন ) need

অ্যান্ড্রু আপেল একটি সংকলন সহ কনটিলিউশন বই লিখেছিলেন এবং পুরাতন কাগজের আবর্জনা সংগ্রহ স্ট্যাক বরাদ্দের চেয়ে দ্রুততর হতে পারেকন্টিনিউশনস, কন্টিনিয়েশনের সাথে সংকলন সহ এ কেনেডির কাগজ (আইসিএফপি ২০০7) দেখুন

আমি কুইনেকের লিস্প ইন স্মল পিস বইটি পড়ারও পরামর্শ দিচ্ছি , যার ধারাবাহিকতা এবং সংকলন সম্পর্কিত বেশ কয়েকটি অধ্যায় রয়েছে।

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

শেষ অবধি, যদি আপনার পুরো প্রোগ্রামটিতে (সমস্ত প্রয়োজনীয় লাইব্রেরি সহ) কোনও পুনরাবৃত্তি না হয় আপনি স্থির অবস্থানের প্রতিটি ফাংশনের রিটার্ন ঠিকানা (এবং "স্থানীয়" ভেরিয়েবলগুলি, যা আসলে স্থিতিশীল হয়ে উঠছে) সংরক্ষণ করতে পারেন। ওল্ড ফোর্টরান comp77 সংকলকগণ ১৯৮০ এর দশকের গোড়ার দিকে এটি করেছিলেন (তাই সংকলিত প্রোগ্রামগুলি তখন কোনও কল স্ট্যাক ব্যবহার করে না)।


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

অ্যাপেলের পুরাতন কাগজপত্র দাবি করেছে (এবং বেঞ্চমার্কিং দ্বারা প্রমাণিত) যে সিপিএস কল স্ট্যাক থাকার চেয়ে তত দ্রুত হতে পারে।
বেসিল স্টারিনকিভিচ

আমি এটি সম্পর্কে সন্দেহবাদী কিন্তু তা আমি নির্ধারিত দাবি করি না।

1
আসলে, এটি ছিল 1980 এর দশকের শেষের এমআইপিএস ওয়ার্কস্টেশন ation সম্ভবত, বর্তমান পিসিগুলিতে ক্যাশে শ্রেণিবিন্যাস কার্য সম্পাদনকে কিছুটা আলাদা করে তুলবে। অ্যাপেলের দাবী বিশ্লেষণ করে বেশ কয়েকটি কাগজপত্র রয়েছে (এবং প্রকৃতপক্ষে বর্তমান মেশিনগুলিতে স্ট্যাক বরাদ্দ কিছুটা
পার্সেন্টের মাধ্যমে

1
@ গিলস: কর্টেক্স এম0 এবং এম 3 (এবং সম্ভবত এম 4 এর মতো অন্যদের) মতো অনেক নতুন এআরএম কোরগুলিতে বাধা হ্যান্ডলিংয়ের মতো জিনিসের জন্য হার্ডওয়্যার স্ট্যাক সমর্থন রয়েছে। আরও, থাম্ব ইন্সট্রাকশন সেটটিতে এসআরএম / এসআরটিএম নির্দেশাবলীর একটি সীমিত উপসেট অন্তর্ভুক্ত রয়েছে যার মধ্যে এসআরএমডিবি আর 13 এর সাথে আরআর-ছাড়া আরআর, এবং পিসির সাথে আর -0-আর 7 এর কোনও সংমিশ্রণের এলডিআরএমআইএ আর 13 রয়েছে যা কার্যকরভাবে চিকিত্সা করে স্ট্যাক পয়েন্টার হিসাবে R13।
সুপারক্যাট

8

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

যাইহোক, বৃহত্তর ফাংশন যা ঘুরেফিরে অন্যান্য ফাংশনগুলিকে কল করে যদি সমস্ত কিছু সন্নিবেশিত হয় তবে প্রোগ্রাম আকারে এক বিরাট বিস্ফোরণ ঘটতে পারে।

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

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

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

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