क्या किसी भी जावास्क्रिप्ट इंजन टेल कॉल (TCO) को अनुकूलित किया गया है?


91

मेरे पास एक पूंछ पुनरावर्ती pathfinding एल्गोरिथ्म है जिसे मैंने जावास्क्रिप्ट में लागू किया है और जानना चाहूंगा कि क्या कोई (सभी?) ब्राउज़र संभवतः स्टैक ओवरफ़्लो अपवाद प्राप्त करेंगे।


2
क्या यह वास्तव में एक पुनरावर्ती एल्गोरिथ्म है, या पुनरावृत्ति के साथ एक पुनरावृत्ति एल्गोरिथ्म लागू किया गया है? मेरी समझ यह है कि TCO केवल बाद वाले की मदद कर सकती है।
नौचैल्स

1
मैं सिर्फ यह जोड़ना चाहता हूं कि TCO onlyएक अनुकूलन नहीं है। इसका समर्थन करना भाषा के विनिर्देशन का हिस्सा होना चाहिए, न कि संकलक / दुभाषिया का, क्योंकि TCO के साथ एक दुभाषिया / संकलक के खिलाफ लिखे गए कोड में संभवतः TCO के बिना दुभाषिया / संकलक पर काम नहीं होगा।
हॉफमैन

1
आप वर्तमान समर्थन देख सकते हैं और इसे कंगैक्स की ES6 संगतता तालिका में इंजन के पार विकसित देख सकते हैं: kangax.github.io/compat-table/es6/…
रॉय टिंकर

जवाबों:


47

ECMAScript 4 विनिर्देश मूल रूप से TCO के लिए समर्थन जोड़ने जा रहा था, लेकिन इसे हटा दिया गया था:

जावास्क्रिप्ट में कोई और पूंछ नहीं है?

जहाँ तक मुझे पता है, जावास्क्रिप्ट का कोई भी व्यापक रूप से उपलब्ध कार्यान्वयन वर्तमान में स्वचालित TCO नहीं करता है। हालाँकि, यह आपके लिए उपयोगी हो सकता है:

टेल कॉल ऑप्टिमाइज़ेशन

अनिवार्य रूप से, संचायक पैटर्न का उपयोग समान प्रभाव को पूरा करता है।


1
बस एक FYI करें, राइनो में "व्याख्या" मोड में कॉन्टिन्यूशन
मार्क पोर्टर

5
(ट्रोलिंग के लिए खेद है) ईसीएमएस्क्रिप्ट 6 में विनिर्देश में उचित टेल कॉल को TCO शामिल किया गया है।
ठंढी

@ एसएलवीवी: ट्रैम्पोलिन संदर्भ क्या है?
bukzor

39
संचायक पैटर्न TCO के समान प्रभाव को पूरा नहीं करता है। यह केवल पुनरावर्ती एल्गोरिदम को पूंछ-पुनरावर्ती रूप में बदल देता है। यह संभव हो सके TCO के लिए एक शर्त है, लेकिन यह इसके लिए एक विकल्प नहीं है। आप अभी भी एक ऐसी भाषा में स्टैक को उड़ा देंगे जो टेल-कॉल का अनुकूलन नहीं करता है।
मार्सेलो कैंटोस

"जेएस का कोई व्यापक रूप से उपलब्ध कार्यान्वयन वर्तमान में स्वचालित TCO नहीं करता है" यह नोड 6.2.0 के रूप में गलत है, यदि आप सही झंडा पास करते हैं
जानूस ट्रॉल्सन

26

फिलहाल कोई खुशी नहीं है, लेकिन शुक्र है कि उचित टेल कॉल हार्मोनी (ECMAScript संस्करण 6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls के लिए स्लेट किए गए हैं


1
@MarkWilbur यह सवाल विशेष रूप से ब्राउज़रों के बारे में था , जो कि ECMAScript के सभी मौजूदा कार्यान्वयन नहीं थे।
बेकार कोड

1
@UselessCode नहीं, यह सवाल "जावास्क्रिप्ट इंजन" के बारे में है ... इतना ही नहीं ब्राउज़र
बीटी

1
@BT वास्तव में कई गैर-ब्राउज़र जेएस वातावरण हैं, और शीर्षक अधिक सामान्य "जावास्क्रिप्ट इंजन" का उपयोग करता है, लेकिन सवाल का शरीर निर्दिष्ट करता है "... जानना चाहेंगे कि क्या कोई (सभी?) ब्राउज़रों को संभवतः स्टैक मिल जाएगा ? अतिप्रवाह अपवाद। "
बेकार संहिता

मुझे काउंटर करना है "लेकिन शीर्षक कहता है ..."। मुझे लगता है क्योंकि वह दोनों का उल्लेख करता है, सवाल दोनों के बारे में है। लेकिन अगर आप कह रहे हैं कि यह उत्तर अप्रचलित नहीं है तो आप सही हैं।
बीटी

4
@MarkWilbur जहाँ तक मुझे पता है कि v8 के समान संस्करण का उपयोग क्रोम के रूप में किया जा रहा है - जो वर्तमान में TCO को सपोर्ट नहीं करता है, मेरे पास JS के साथ एक जिस्ट था
mcfedr

12

आपके द्वारा सामना किए जाने वाले बहुत से ब्राउज़र "बहुत अधिक पुनरावृत्ति" पर रोक लगाएंगे। यहां V8 बग ट्रैकर में एक प्रविष्टि है जो संभवतः दिलचस्प पढ़ना होगा।

यदि यह सरल आत्म-पुनरावृत्ति है, तो संभवतः यह पूंछ-कॉल उन्मूलन की उम्मीद करने के बजाय स्पष्ट पुनरावृत्ति का उपयोग करने के प्रयास के लायक है।


बग को आखिरकार स्वीकार कर लिया गया है। यह महाकाव्य के अंतर्गत है: "फ़ीचर रिक्वेस्ट हार्मनी"। उम्मीद है कि इसका मतलब है कि वे इसे V8 में ES6 समर्थन में जोड़ने की योजना बना रहे हैं।
Txangel

आप यहाँ Internet Explorer में TCO समर्थन के लिए वोट कर सकते हैं: wpdev.uservoice.com/forums/257854-internet-explorer-platform/…
रॉय टिंकर

12

टेल कॉल ऑप्टिमाइज़ेशन का समर्थन किया जाएगा भविष्य में ECMAScript 6 सख्त मोड में। चेक http://www.2ality.com/2015/06/tail-call-optimization.html जानकारी के लिए।

वर्तमान इंजन समर्थन के लिए http://kangax.github.io/compat-table/es6/ की जाँच करें ।

फिलहाल (18-07-2019) निम्नलिखित इंजन टेल कॉल ऑप्टिमाइज़ेशन का समर्थन करते हैं:

  • सफारी> = 10
  • iOS> = 10
  • किनोमा XS6
  • ड्यूकटेप 2.3

"प्रयोगात्मक जावास्क्रिप्ट सुविधाओं" का समर्थन करें तो -फ्लैग चालू है:

  • नोड 6.5
  • Chrome 54 / ओपेरा 41 कॉम्पिटिटर टेबल का वर्तमान संस्करण अब इसे सूचीबद्ध नहीं करता है

3

टेल कॉल ऑप्टिमाइज़ेशन अब लिस्किस्क्रिप्ट में उपलब्ध है जो जावास्क्रिप्ट के लिए संकलित है। आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं ।


पारस्परिक पुनरावृत्ति के बारे में क्या?
बिल्ली

2

वर्तमान में कोई जावास्क्रिप्ट कार्यान्वयन पूंछ पुनरावृत्ति को नहीं पहचानता है। ECMAScript 6 में परिवर्तन किए जा रहे हैं , और जैसा कि अन्य ने कहा है, V8 पर एक खुला टिकट है ।

यहाँ आप पूंछ पुनरावृत्ति समारोह के लिए V8 के उत्पन्न कोडांतरक देख सकते हैं:

V8 कैसे पुनरावृत्ति संकलित करता है इसका उदाहरण

तुलना करें कि क्लैंग ने C में समान फ़ंक्शन को कैसे संकलित किया है

सी संकलक पूंछ पुनरावृत्ति का उदाहरण

वी 8 पुनरावर्ती कॉल को बरकरार रखता है, जबकि सी कंपाइलर ने पूंछ की पुनरावृत्ति को पहचान लिया है और इसे लूप में बदल दिया है।


"वर्तमान में कोई जेएस कार्यान्वयन पूंछ पुनरावृत्ति को नहीं पहचानता है।" यह नोड 6.2.0 के रूप में गलत है, लेकिन आप एक ध्वज पारित करेंगे
जानूस ट्रॉल्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.