Clojure ไม่ได้ดำเนินการเพิ่มประสิทธิภาพการโทรหางในตัวเอง: recur
เมื่อคุณมีหางฟังก์ชันเวียนและคุณต้องการที่จะมีมันที่ดีที่สุดที่คุณจะต้องใช้รูปแบบพิเศษ ในทำนองเดียวกันถ้าคุณมีสองฟังก์ชั่น recursive trampoline
ร่วมกันคุณสามารถเพิ่มประสิทธิภาพพวกเขาเท่านั้นโดยใช้
คอมไพเลอร์ Scala สามารถดำเนินการ 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
ดังนั้นในระดับ bytecode goto
หนึ่งความต้องการเพียง ในกรณีนี้ในความเป็นจริงการทำงานอย่างหนักจะทำโดยคอมไพเลอร์
สิ่งอำนวยความสะดวกใดของเครื่องเสมือนพื้นฐานที่ยอมให้คอมไพเลอร์จัดการกับ TCO ได้ง่ายขึ้น
ในฐานะที่เป็นบันทึกย่อฉันไม่คาดหวังว่าเครื่องจักรจริงจะฉลาดกว่า JVM มากนัก ถึงกระนั้นหลายภาษาที่คอมไพล์รหัสเนทีฟเช่น Haskell ดูเหมือนจะไม่มีปัญหากับการปรับ tail tail (เช่นกัน Haskell อาจมีบางครั้งเนื่องจากความเกียจคร้าน แต่นั่นเป็นอีกปัญหาหนึ่ง)