কোনও জাভাস্ক্রিপ্ট ইঞ্জিনগুলি টেল কল (টিসিও) অনুকূলিত হয়েছে?


91

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


4
এটি কি আসলে পুনরাবৃত্তির একটি অ্যালগরিদম, বা পুনরাবৃত্তির সাহায্যে পুনরাবৃত্ত একটি অ্যালগরিদম? আমার বোঝা টিসিও কেবল পরবর্তীতে সাহায্য করতে পারে।
এনমিকহেলস

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

4
আপনি বর্তমান সমর্থন দেখতে এবং এটি এখানে কঙ্গাক্স এর ES6 সামঞ্জস্য টেবিল এ ইঞ্জিন জুড়ে বিভক্ত দেখতে পারেন: kangax.github.io/compat-table/es6/…
রায় টিঙ্কার

উত্তর:


47

ইসমাস্ক্রিপ্ট 4 স্পেসিফিকেশনটি মূলত টিসিওর জন্য সমর্থন যোগ করতে চলেছিল তবে তা বাদ দেওয়া হয়েছিল:

জাভাস্ক্রিপ্টে আর কোনও লেজ কল নেই?

আমি যতদূর জানি, জাভাস্ক্রিপ্টের কোনও বহুল-উপলভ্য বাস্তবায়ন বর্তমানে স্বয়ংক্রিয় টিসিও করে না। এটি আপনার কাজে লাগতে পারে, যদিও:

টেল কল অপটিমাইজেশন

মূলত, আহরণকারী প্যাটার্ন ব্যবহার করে একই প্রভাব কার্যকর হয়।


4
কেবলমাত্র একটি এফওয়াইআই, গেন্ডার
মার্ক পোর্টার

4
(ট্রোলিংয়ের জন্য দুঃখিত) ইসমাস্ক্রিপ্ট T-তে টিসিও অন্তর্ভুক্ত করা হয়েছে, নির্দিষ্টকরণে প্রাইজ টেইল কল।
ফ্রস্টি

@ এসএসএলভি: ট্রামপোলিন রেফারেন্স কী?
bukzor

39
সঞ্চয়ের ধরণটি টিসিওর মতো একই প্রভাবটি সম্পাদন করে না। এটি কেবল পুনরাবৃত্ত আলগোরিদিমগুলিকে লেজ-পুনরাবৃত্ত আকারে রূপান্তর করে। এটি টিসিওর পক্ষে সম্ভব হবার পূর্বশর্ত, তবে এটি এর বিকল্প নয়। আপনি এখনও এমন ভাষায় স্ট্যাকটি ফুঁকবেন যা টেল-কলগুলি অনুকূল করে না।
মার্সেলো ক্যান্টোস

"জেএসের কোনও বহুল-উপলভ্য বাস্তবায়ন বর্তমানে স্বয়ংক্রিয় টিসিও করে না" আপনি ডান পতাকাটি পাস করলে নোড 6.2.0 হিসাবে এটি ভুল
জেনাস ট্রয়েলসন

26

এই মুহুর্তের জন্য কোনও আনন্দের নয়, তবে শুকরিয়া যথাযথ লেজ কলগুলি হারমোনি (ECMAScript সংস্করণ 6) এর জন্য শুরু করা হয়েছে http://wiki.ecmascript.org/doku.php?id=harmon:proper_tail_calls


4
@ মার্ক উইলবার এই প্রশ্নটি বিশেষত ব্রাউজারগুলির সম্পর্কে ছিল, ইসমাস্ক্রিপ্টের সমস্ত বিদ্যমান বাস্তবায়ন নয়।
অপ্রয়োজনীয় কোড

4
@ ইউসলেসকোড নোপ, এই প্রশ্নটি "জাভাস্ক্রিপ্ট ইঞ্জিন" সম্পর্কে তাই ... কেবল ব্রাউজারগুলি নয়
বিটি

4
@ বিটি প্রকৃতপক্ষে অনেকগুলি ব্রাউজার জেএস পরিবেশ রয়েছে এবং শিরোনামটি আরও বেশি জেনেরিক "জাভাস্ক্রিপ্ট ইঞ্জিন" ব্যবহার করে তবে প্রশ্নের মূল অংশটি "নির্দিষ্ট করে" ... জানতে চাইবেন যে কোনও (সমস্ত?) ব্রাউজার সম্ভবত স্ট্যাক পাবে কিনা ? ওভারফ্লো ব্যতিক্রম। "
অকেজো কোড

আমাকে পাল্টাতে হবে "তবে শিরোনামটি ..."। আমি মনে করি কারণ তিনি উভয়ের উল্লেখ করেছেন, প্রশ্ন দুটি সম্পর্কে both তবে আপনি ঠিক বলেছেন আপনি উত্তরটি অচল করে দিচ্ছেন না।
বিটি

4
@ মার্কউইলবুর যতদূর আমি জানি যে ক্রোম হিসাবে ভি 8 এর একই সংস্করণটি ব্যবহার করছি - যা বর্তমানে টিসিও সমর্থন করে না জেএসের সাথে আমার একটি বক্তব্য
এমসিফিডার

12

আপনার মুখোমুখি হওয়া প্রতিটি ব্রাউজার "অত্যধিক পুনরাবৃত্তি" বাধা দেবে। এখানে ভি 8 বাগ ট্র্যাকারে একটি এন্ট্রি রয়েছে যা সম্ভবত পড়ার আগ্রহী হবে।

যদি এটি সাধারণ স্ব-পুনরাবৃত্তি হয় তবে এটি সম্ভবত টেল-কল নির্মূলের আশা না করে সুস্পষ্ট পুনরাবৃত্তি ব্যবহারের প্রচেষ্টাটির পক্ষে মূল্যবান।


বাগটি শেষ পর্যন্ত গৃহীত হয়েছে। এটি মহাকাব্যটির অধীনে রয়েছে: "বৈশিষ্ট্য অনুরোধের সুরেলা"। আশা করি এর মানে হল যে তারা ভি 8 এ ইএস 6 সমর্থন যোগ করার পরিকল্পনা করেছেন।
টেক্সাঞ্জেল

আপনি এখানে ইন্টারনেট এক্সপ্লোরারে টিসিও
রায় টিঙ্কার

12

টেল কল অপ্টিমাইজেশন ভবিষ্যতে ECMAScript 6 কঠোর মোডে সমর্থিত হবে। পরীক্ষা করে দেখুন http://www.2ality.com/2015/06/tail-call-optimization.html বিস্তারিত জানার জন্য।

বর্তমান ইঞ্জিন সহায়তার জন্য http://kangax.github.io/compat-table/es6/ দেখুন ।

এই মুহুর্তে (18-07-2019) নিম্নলিখিত ইঞ্জিনগুলি টেল কল অপটিমাইজেশন সমর্থন করে:

  • সাফারি> = 10
  • আইওএস> = 10
  • কিনোমা এক্সএস 6
  • দুকতাপে ২.৩

"পরীক্ষামূলক জাভাস্ক্রিপ্ট বৈশিষ্ট্যগুলি" -ফ্ল্যাগ চালু থাকলে সমর্থন করুন:

  • নোড 6.5
  • ক্রোম 54 / অপেরা 41 কমপ্যাট টেবিলের বর্তমান সংস্করণ এটিকে আর তালিকাভুক্ত করে না


2

বর্তমানে কোনও জাভাস্ক্রিপ্ট বাস্তবায়ন লেজ পুনরাবৃত্তি স্বীকৃতি দেয় না। ECMAScript 6 এ পরিবর্তন করা হচ্ছে এবং অন্যরা যেমন বলেছে, ভি 8- তে একটি মুক্ত টিকিট রয়েছে ।

এখানে আপনি একটি লেজ পুনরাবৃত্তি ফাংশন জন্য ভি 8 এর উত্পাদিত এসেমব্লার দেখতে পাবেন:

ভি 8 কীভাবে পুনরাবৃত্তি সংকলন করে তার উদাহরণ

কীভাবে ক্ল্যাং সি একই ফাংশনটি সংকলন করেছে তার সাথে তার তুলনা করুন

সি সংকলক পুচ্ছ পুনরাবৃত্তি উদাহরণ

ভি 8 পুনরাবৃত্তি কলটি ধরে রেখেছে, অন্যদিকে সি সংকলক লেজ পুনরাবৃত্তি স্বীকৃতি দিয়েছে এবং এটিকে একটি লুপে পরিবর্তন করেছে।


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