क्लोजर अपने आप ही टेल कॉल ऑप्टिमाइजेशन नहीं करता है: जब आपके पास टेल रीसर्चिव फंक्शन होता है और आप इसे ऑप्टिमाइज़ करना चाहते हैं, तो आपको स्पेशल फॉर्म का इस्तेमाल करना होगा recur
। इसी तरह, यदि आपके पास दो पारस्परिक रूप से पुनरावर्ती कार्य हैं, तो आप केवल उपयोग करके उन्हें अनुकूलित कर सकते हैं trampoline
।
स्काला संकलक एक पुनरावर्ती कार्य के लिए TCO प्रदर्शन करने में सक्षम है, लेकिन दो परस्पर पुनरावर्ती कार्यों के लिए नहीं।
जब भी मैंने इन सीमाओं के बारे में पढ़ा है, तो वे हमेशा JVM मॉडल के लिए कुछ सीमा से जुड़े थे। मैं संकलक के बारे में बहुत कुछ नहीं जानता, लेकिन यह मुझे थोड़ा पहेली करता है। से उदाहरण लेता हूं Programming Scala
। यहाँ समारोह
def approximate(guess: Double): Double =
if (isGoodEnough(guess)) guess
else approximate(improve(guess))
में अनुवादित है
0: aload_0
1: astore_3
2: aload_0
3: dload_1
4: invokevirtual #24; //Method isGoodEnough:(D)Z
7: ifeq
10: dload_1
11: dreturn
12: aload_0
13: dload_1
14: invokevirtual #27; //Method improve:(D)D
17: dstore_1
18: goto 2
इसलिए, बायटेकोड स्तर पर, बस जरूरत है goto
। इस मामले में, वास्तव में, कंपाइलर द्वारा कड़ी मेहनत की जाती है।
अंतर्निहित वर्चुअल मशीन की क्या सुविधा संकलक को TCO को अधिक आसानी से संभालने की अनुमति देगी?
एक साइड नोट के रूप में, मुझे उम्मीद नहीं होगी कि वास्तविक मशीनें JVM की तुलना में अधिक स्मार्ट होंगी। फिर भी, कई भाषाएँ जो देशी कोड को संकलित करती हैं, जैसे कि हास्केल, पूंछ की कॉल के अनुकूलन के साथ मुद्दे नहीं लगते हैं (खैर, हास्केल कभी-कभी आलस्य के कारण हो सकता है, लेकिन यह एक और मुद्दा है)।