লুপগুলি পুনরাবৃত্তির চেয়ে দ্রুত কেন হয়?


18

অনুশীলনে আমি বুঝতে পারি যে কোনও পুনরাবৃত্তি একটি লুপ হিসাবে লেখা যেতে পারে (এবং বিপরীতে (?)) এবং আমরা যদি প্রকৃত কম্পিউটারের সাথে পরিমাপ করি তবে আমরা দেখতে পেলাম যে একই সমস্যাগুলির জন্য পুনরুক্তির চেয়ে লুপগুলি দ্রুততর হয়। তবে এমন কোনও তত্ত্ব আছে যা এই তফাতকে তোলে বা এটি মূলত ইমরিক্যাল?


9
দেখতে যে ভাষাগুলি খারাপভাবে প্রয়োগ করে সেগুলিতে পুনরাবৃত্তির চেয়ে তত দ্রুত ooks যথাযথ টেল রিকার্সন সহ একটি ভাষায়, পুনরাবৃত্তির প্রোগ্রামগুলি পর্দার আড়ালে লুপগুলিতে অনুবাদ করা যায়, এক্ষেত্রে কোনও পার্থক্য থাকবে না কারণ তারা অভিন্ন।
jmite

3
হ্যাঁ, এবং আপনি যদি এমন কোনও ভাষা ব্যবহার করেন যা এটি সমর্থন করে, আপনি কোনও নেতিবাচক পারফরম্যান্স প্রভাব না রেখে (লেজ) পুনরাবৃত্তি ব্যবহার করতে পারেন।
jmite

1
@ জ্যামাইট, টেল রিক্রুশন যা আসলে একটি লুপে অনুকূলিত হতে পারে তা আপনার তুলনায় অত্যন্ত বিরল, বিরল than বিশেষত যে ভাষাগুলিতে রেফারেন্স গণনা করা ভেরিয়েবলের মতো প্রকারগুলি পরিচালনা করে in
জোহান - মনিকা

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

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

উত্তর:


17

লুপগুলি পুনরাবৃত্তির চেয়ে দ্রুত হওয়ার কারণটি সহজ।
একটি লুপটি সমাবেশে দেখতে এটির মতো লাগে।

mov loopcounter,i
dowork:/do work
dec loopcounter
jmp_if_not_zero dowork

লুপ কাউন্টারটির জন্য একটি একক শর্তযুক্ত জাম্প এবং কিছু বুককিপিং।

পুনরাবৃত্তি (যখন এটি সংকলক দ্বারা অনুকূলিত করা যায় না বা করা যায় না) এমন দেখাচ্ছে:

start_subroutine:
pop parameter1
pop parameter2
dowork://dowork
test something
jmp_if_true done
push parameter1
push parameter2
call start_subroutine
done:ret

এটি অনেক জটিল এবং আপনি কমপক্ষে 3 টি জাম্প পান (1 টি পরীক্ষা হয়েছে কিনা তা দেখতে 1 টি পরীক্ষা এবং একটি রিটার্ন) get
এছাড়াও পুনরাবৃত্তিতে প্যারামিটারগুলি সেট আপ এবং আনতে হবে।
লুপে এই স্টাফগুলির কোনওটির প্রয়োজন নেই কারণ সমস্ত পরামিতি ইতিমধ্যে সেট আপ হয়েছে।

তাত্ত্বিকভাবে পরামিতিগুলি পুনরাবৃত্তির পাশাপাশি স্থানে থাকতে পারে, তবে আমি জানি এমন কোনও সংকলক আসলে তাদের অপ্টিমাইজেশনে এতদূর যায় না।

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

দুর্বল পুনরাবৃত্তি হ্যান্ডলিংয়ের উদাহরণ উদাহরণস্বরূপ, যদি কোনও পরামিতি পাস করা হয় যা রেফারেন্স গণনা করা হয় (উদাহরণস্বরূপ একটি নন কনস্ট ম্যানেজড টাইপ প্যারামিটার) এটি রেফারেন্স গণনার একটি লক সামঞ্জস্য করে 100 চক্র যুক্ত করবে, সম্পূর্ণরূপে একটি লুপের কার্য সম্পাদন করে killing
যে ভাষাগুলি পুনরাবৃত্তি করার জন্য সুর করা হয় তাদের মধ্যে এই খারাপ আচরণ ঘটে না।

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

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

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

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

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

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

আমি বুঝতে পারি যে কোনও পুনরাবৃত্তি লুপ হিসাবে লেখা যেতে পারে

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


16

এই অন্যান্য উত্তরগুলি কিছুটা বিভ্রান্তিকর। আমি সম্মত হই যে তারা বাস্তবায়নের বিশদটি জানিয়েছে যা এই বৈষম্যকে ব্যাখ্যা করতে পারে, তবে তারা এই মামলাটিকে অগ্রাহ্য করে। জাইমাইট দ্বারা সঠিকভাবে প্রস্তাবিত হিসাবে, তারা ফাংশন কলগুলি / পুনরাবৃত্তিগুলির ভাঙ্গা বাস্তবায়নের দিকে বাস্তবায়নমুখী। অনেক ভাষা পুনরাবৃত্তির মাধ্যমে লুপগুলি প্রয়োগ করে, সুতরাং লুপগুলি স্পষ্টতই সেই ভাষাগুলিতে দ্রুততর হয় না। তত্ত্ব অনুসারে পুনরাবৃত্তি কোনওভাবেই লুপিংয়ের চেয়ে কম দক্ষ নয়। গাই স্টিলের ১৯ 197 paper সালের গবেষণাপত্রে "ব্যয়বহুল প্রক্রিয়া কল" মিথটি বা, প্রক্রিয়া বাস্তবায়ন ক্ষতিকারক হিসাবে বিবেচিত বা, ল্যাম্বদা: আলটিমেট গোটো

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

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

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

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

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


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

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

হে(1)

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

খুব আকর্ষণীয় উত্তর। যদিও এটি কিছুটা রেন্টের মতো শোনাচ্ছে :-)। উত্সাহিত কারণ আমি নতুন কিছু শিখেছি।
জোহান - মনিকা

2

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

যদি আপনি বরাদ্দ স্ট্যাকের (যেমন হিপ মেমরির পয়েন্টারের মাধ্যমে) ম্যানুয়ালি অপারেটিং লুপগুলি তুলনা করেন, তবে আপনি সাধারণত এগুলি হার্ডওয়্যার স্ট্যাক ব্যবহার করার চেয়ে দ্রুত বা ধীর খুঁজে পাবেন না।

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