এই অন্যান্য উত্তরগুলি কিছুটা বিভ্রান্তিকর। আমি সম্মত হই যে তারা বাস্তবায়নের বিশদটি জানিয়েছে যা এই বৈষম্যকে ব্যাখ্যা করতে পারে, তবে তারা এই মামলাটিকে অগ্রাহ্য করে। জাইমাইট দ্বারা সঠিকভাবে প্রস্তাবিত হিসাবে, তারা ফাংশন কলগুলি / পুনরাবৃত্তিগুলির ভাঙ্গা বাস্তবায়নের দিকে বাস্তবায়নমুখী। অনেক ভাষা পুনরাবৃত্তির মাধ্যমে লুপগুলি প্রয়োগ করে, সুতরাং লুপগুলি স্পষ্টতই সেই ভাষাগুলিতে দ্রুততর হয় না। তত্ত্ব অনুসারে পুনরাবৃত্তি কোনওভাবেই লুপিংয়ের চেয়ে কম দক্ষ নয়। গাই স্টিলের ১৯ 197 paper সালের গবেষণাপত্রে "ব্যয়বহুল প্রক্রিয়া কল" মিথটি বা, প্রক্রিয়া বাস্তবায়ন ক্ষতিকারক হিসাবে বিবেচিত বা, ল্যাম্বদা: আলটিমেট গোটো
ফোকলোর বিবরণ দেয় যে গোটোর বিবৃতিগুলি "সস্তা", তবে পদ্ধতি কলগুলি "ব্যয়বহুল"। এই পৌরাণিক কাহিনীটি মূলত দুর্বলভাবে ডিজাইন করা ভাষা বাস্তবায়নের ফলাফল। এই পুরাণের ofতিহাসিক বৃদ্ধি বিবেচনা করা হয়। উভয় তাত্ত্বিক ধারণা এবং একটি বিদ্যমান বাস্তবায়ন নিয়ে আলোচনা করা হয়েছে যা এই রূপকথাকে অস্বীকার করে। এটি দেখানো হয় যে প্রক্রিয়া কলগুলির অনিয়ন্ত্রিত ব্যবহার দুর্দান্ত শৈলীগত স্বাধীনতার অনুমতি দেয়। বিশেষত, অতিরিক্ত ভেরিয়েবল প্রবর্তন না করে যে কোনও ফ্লোচার্টকে "কাঠামোগত" প্রোগ্রাম হিসাবে লেখা যেতে পারে। GOTO বিবৃতি এবং পদ্ধতি কলের সাথে অসুবিধাটি অ্যাবস্ট্রাক্ট প্রোগ্রামিং ধারণাগুলি এবং কংক্রিট ভাষা গঠনের মধ্যে দ্বন্দ্ব হিসাবে চিহ্নিত করা হয়।
"বিমূর্ত প্রোগ্রামিং ধারণা এবং জমাটবদ্ধ ভাষা নির্মান দ্বন্দ্বের" আসলে যে অধিকাংশ তাত্ত্বিক মডেল, উদাহরণস্বরূপ, untyped থেকে দেখা যায় ল্যামডা ক্যালকুলাস , একটি স্ট্যাক হবে না । অবশ্যই, এই দ্বন্দ্বটি প্রয়োজনীয় নয় কারণ উপরের কাগজটি চিত্রিত করে এবং হ্যাশকেলের মতো পুনরাবৃত্তি ছাড়া অন্য কোনও পুনরাবৃত্তি ব্যবস্থা নেই এমন ভাষাগুলি দ্বারা এটিও প্রদর্শিত হয়।
fix
fix f x = f (fix f) x
( Λ এক্স । এম) এন। এম[ এন/ এক্স][ এন/ এক্স]এক্সএমএন⇝
এখন একটি উদাহরণ জন্য। fact
হিসাবে সংজ্ঞায়িত করুন
fact = fix (λf.λa.λn.if n == 0 then a else f (a*n) (n-1)) 1
সংক্ষিপ্ততার জন্য fact 3
, যেখানে এর মূল্যায়ন এখানে আমি g
প্রতিশব্দ হিসাবে ব্যবহার করব fix (λf.λa.λn.if n == 0 then a else f (a*n) (n-1))
, অর্থাত্ fact = g 1
। এটি আমার যুক্তিকে প্রভাবিত করে না।
fact 3
~> g 1 3
~> fix (λf.λa.λn.if n == 0 then a else f (a*n) (n-1)) 1 3
~> (λf.λa.λn.if n == 0 then a else f (a*n) (n-1)) g 1 3
~> (λa.λn.if n == 0 then a else g (a*n) (n-1)) 1 3
~> (λn.if n == 0 then 1 else g (1*n) (n-1)) 3
~> if 3 == 0 then 1 else g (1*3) (3-1)
~> g (1*3) (3-1)
~> g 3 2
~> fix (λf.λa.λn.if n == 0 then a else f (a*n) (n-1)) 3 2
~> (λf.λa.λn.if n == 0 then a else f (a*n) (n-1)) g 3 2
~> (λa.λn.if n == 0 then a else g (a*n) (n-1)) 3 2
~> (λn.if n == 0 then 3 else g (3*n) (n-1)) 2
~> if 2 == 0 then 3 else g (3*2) (2-1)
~> g (3*2) (2-1)
~> g 6 1
~> fix (λf.λa.λn.if n == 0 then a else f (a*n) (n-1)) 6 1
~> (λf.λa.λn.if n == 0 then a else f (a*n) (n-1)) g 6 1
~> (λa.λn.if n == 0 then a else g (a*n) (n-1)) 6 1
~> (λn.if n == 0 then 6 else g (6*n) (n-1)) 1
~> if 1 == 0 then 6 else g (6*1) (1-1)
~> g (6*1) (1-1)
~> g 6 0
~> fix (λf.λa.λn.if n == 0 then a else f (a*n) (n-1)) 6 0
~> (λf.λa.λn.if n == 0 then a else f (a*n) (n-1)) g 6 0
~> (λa.λn.if n == 0 then a else g (a*n) (n-1)) 6 0
~> (λn.if n == 0 then 6 else g (6*n) (n-1)) 0
~> if 0 == 0 then 6 else g (6*0) (0-1)
~> 6
এমনকি কোনও বৃদ্ধি নেই এবং প্রতিটি পুনরাবৃত্তির জন্য একই পরিমাণের জায়গার প্রয়োজন বিশদটি না দেখেও আপনি আকারটি থেকে দেখতে পারেন can (প্রযুক্তিগতভাবে, সংখ্যাসূচক ফলাফলটি বৃদ্ধি পায় যা অনিবার্য এবং while
লুপের জন্য ঠিক ততটাই সত্য )) এখানে আমি সীমাহীনভাবে বাড়ছে "স্ট্যাক" চিহ্নিত করতে আপনাকে অস্বীকার করছি।
মনে হচ্ছে ল্যাম্বডা ক্যালকুলাসের প্রত্নতাত্ত্বিক শব্দার্থক শব্দটি ইতিমধ্যে তা করে যা সাধারণত "টেল কল অপ্টিমাইজেশন" হিসাবে ভুল হিসাবে পরিচিত। অবশ্যই, এখানে কোনও "অপ্টিমাইজেশন" ঘটছে না। "স্বাভাবিক" কলগুলির বিপরীতে "লেজ" কলগুলির জন্য এখানে কোনও বিশেষ বিধি নেই। এই কারণে, টেল কল "অপ্টিমাইজেশন" কী করছে তার একটি "অ্যাবস্ট্রাক্ট" চরিত্রায়ন দেওয়া শক্ত, যেমন ফাংশন কল শব্দার্থবিজ্ঞানের অনেকগুলি বিমূর্ত বৈশিষ্ট্যে, লেজ কল "অপ্টিমাইজেশন" করার মতো কিছুই নেই!
fact
অনেক ভাষায় "স্ট্যাক ওভারফ্লোস" এর সমান সংজ্ঞা, সেই ভাষাগুলির ফাংশন কল শব্দার্থকে সঠিকভাবে প্রয়োগ করতে ব্যর্থতা। (কিছু ভাষার একটি অজুহাত রয়েছে)) পরিস্থিতিটি একটি ভাষা প্রয়োগের সাথে সংযুক্ত তালিকার সাথে অ্যারেগুলি বাস্তবায়নের সাথে মোটামুটি অনুরূপ। এই জাতীয় "অ্যারে" তে সূচক করা তখন একটি ও (এন) অপারেশন হবে যা অ্যারের প্রত্যাশা পূরণ করে না। যদি আমি ভাষার একটি পৃথক বাস্তবায়ন করি, যা লিঙ্কযুক্ত তালিকার পরিবর্তে প্রকৃত অ্যারে ব্যবহার করে, আপনি বলবেন না যে আমি "অ্যারে অ্যাক্সেস অপটিমাইজেশন" প্রয়োগ করেছি, আপনি বলবেন যে আমি অ্যারেগুলির একটি ভাঙা বাস্তবায়ন স্থির করেছি।
সুতরাং, Veedrac এর উত্তর সাড়া। স্ট্যাকগুলি পুনরাবৃত্তি করার জন্য "মৌলিক" নয় । মূল্যায়ন চলাকালীন যে পরিমাণে "স্ট্যাকের মতো" আচরণ ঘটে থাকে, এটি কেবল তখন ঘটতে পারে যেখানে লুপগুলি (সহায়ক ডেটা কাঠামো ব্যতীত) প্রথম স্থানে প্রযোজ্য হবে না! এটি অন্যভাবে রাখতে, আমি একই কর্মক্ষমতা বৈশিষ্ট্যগুলির সাথে পুনরাবৃত্তির সাথে লুপগুলি প্রয়োগ করতে পারি। প্রকৃতপক্ষে, স্কিম এবং এসএমএল উভয়ই লুপিং কনস্ট্রাক্টস ধারণ করে, তবে উভয়ই পুনরাবৃত্তির পরিপ্রেক্ষিতে এটি সংজ্ঞায়িত করে (এবং কমপক্ষে স্কিমে do
প্রায়শই ম্যাক্রো হিসাবে প্রয়োগ করা হয় যা পুনরাবৃত্ত কলগুলিতে প্রসারিত হয়)) একইভাবে, জোহানের জবাবের জন্য কিছুই কিছুই বলে না সংকলনকারী জোহান পুনরাবৃত্তির জন্য বর্ণিত সমাবেশ প্রস্থান করতে হবে। প্রকৃতপক্ষে,আপনি লুপ ব্যবহার করেন বা পুনরাবৃত্তি করুন ঠিক একই সমাবেশ। আপনি যখন কোনও কিছু লুপ দ্বারা প্রকাশযোগ্য নয় এমন কিছু করছেন যখন সংঘটিতকারী কেবলমাত্র কিছুটা (কিছুটা) জোহানের বর্ণনা অনুসারে সমাবেশ নির্গত করতে বাধ্য হবে। স্টিলের কাগজে বর্ণিত হিসাবে এবং হাস্কেল, স্কিম এবং এসএমএলের মতো ভাষার প্রকৃত অনুশীলন দ্বারা প্রদর্শিত, এটি "অত্যন্ত বিরল" নয় যে লেজ কলগুলি "অনুকূলিত" হতে পারে, তারা সর্বদা পারেন"অনুকূলিত" হন। পুনরাবৃত্তির একটি নির্দিষ্ট ব্যবহার ধ্রুব স্থানে চলবে কিনা তার উপর নির্ভর করে এটি কীভাবে লেখা হয়েছে তার উপর নির্ভর করে, তবে এটি সম্ভব করার জন্য আপনার যে নিষেধাজ্ঞাগুলি প্রয়োগ করতে হবে তা হ'ল আপনার সমস্যাটিকে একটি লুপের আকারে ফিট করতে হবে এমন প্রতিবন্ধকতা। (প্রকৃতপক্ষে, তারা কম কঠোর। সমস্যাগুলি রয়েছে যেমন এনকোডিং স্টেট মেশিনগুলি, যেগুলি লুপগুলির বিপরীতে টেইল কলগুলির মাধ্যমে আরও পরিষ্কার এবং দক্ষতার সাথে পরিচালিত হয় যার জন্য সহায়ক ভেরিয়েবলগুলির প্রয়োজন হবে)) আবার, কেবলমাত্র পুনরাবৃত্তি করার জন্য আরও কাজ করা দরকার যখন আপনার কোডটি কোনও লুপ নয়।
আমার অনুমান যে জোহান সি সংকলনকারীদের উল্লেখ করছেন যা কখন লেজ কল "অপ্টিমাইজেশন" সম্পাদন করবে তার উপর নির্বিচারে বিধিনিষেধ রয়েছে। জোহান সম্ভবত "পরিচালিত প্রকারের ভাষা" সম্পর্কে কথা বলার সময় সম্ভবত সি ++ এবং জাস্টের মতো ভাষাগুলির উল্লেখ করছেন। সি ++ এর আরআইআইআই-র প্রতিরূপ এবং সেইসাথে মরিচা উপস্থাপন এমন জিনিসগুলিকে তোলে যা অতিমাত্রায় লেজ কলগুলির মতো দেখতে লাগে, লেজ কল নয় (কারণ "ধ্বংসকারীদের" এখনও ডাকতে হবে)। কিছুটা ভিন্ন শব্দার্থবিজ্ঞানের অপ্ট-ইন করার জন্য আলাদা সিনট্যাক্স ব্যবহার করার প্রস্তাব রয়েছে যা পুচ্ছ পুনরাবৃত্তির অনুমতি দেয় (যেমন আগে ডাস্ট্রাস্টারগুলিকে কল করুন)চূড়ান্ত লেজ কল এবং "ধ্বংস" বস্তু অ্যাক্সেস স্পষ্টত অস্বীকার)। (আবর্জনা সংগ্রহের তেমন কোনও সমস্যা নেই এবং হাস্কেল, এসএমএল এবং স্কিমের সমস্তই আবর্জনা সংগ্রহ করা ভাষা)) একেবারে আলাদা শিরাতে, কিছু ভাষা যেমন, স্মল্টালক, "স্ট্যাক "টিকে প্রথম শ্রেণির অবজেক্ট হিসাবে প্রকাশ করে, এর মধ্যে "স্ট্যাক" কেস এখন আর বাস্তবায়নের বিশদ নয়, যদিও এটি বিভিন্ন শব্দার্থবিজ্ঞানের সাথে পৃথক ধরণের কল করা বাধা দেয় না। (জাভা জানায় যে এটি সুরক্ষার কয়েকটি দিক পরিচালনা করার কারণে তা করতে পারে না, তবে এটি আসলে মিথ্যা ))
অনুশীলনে, ফাংশন কলগুলির ভাঙ্গা বাস্তবায়নের প্রবণতা তিনটি মূল কারণ থেকে আসে। প্রথমত, অনেকগুলি ভাষা তাদের প্রয়োগের ভাষা (সাধারণত সি) থেকে ভাঙ্গা বাস্তবায়নের উত্তরাধিকারী হয়। দ্বিতীয়ত, নির্বাহী সংস্থান ব্যবস্থা ভাল এবং সমস্যাটিকে আরও জটিল করে তোলে, যদিও কেবল হাতে গোনা কয়েকটি ভাষা এই অফার করে। তৃতীয়, এবং, আমার অভিজ্ঞতায়, বেশিরভাগ লোকেরা যে কারণে যত্নশীল তা হ'ল ডিবাগিংয়ের উদ্দেশ্যে ত্রুটিগুলি দেখা দিলে তারা স্ট্যাক ট্রেসগুলি চান। কেবলমাত্র দ্বিতীয় কারণটি হ'ল এটি সম্ভাব্য তাত্ত্বিকভাবে প্রেরণা অর্জন করতে পারে।