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