Warum benötigt TCO Unterstützung von der VM?

Einige VMs, insbesondere die JVM, unterstützen angeblich keine TCO. Aus diesem Grund muss der Benutzer eine Sprache wie Clojure verwendenloop recur stattdessen.

Ich kann jedoch Self-Tail-Aufrufe umschreiben, um eine Schleife zu verwenden. Hier ist zum Beispiel ein Tail-Call-Faktor:

def factorial(x, accum):
    if x == 1:
        return accum
    else:
        return factorial(x - 1, accum * x)

Hier ist ein Schleifenäquivalent:

def factorial(x, accum):
    while True:
        if x == 1:
            return accum
        else:
            x = x - 1
            accum = accum * x

Dies könnte von einem Compiler gemacht werden (und ich habe Makros geschrieben, die dies tun). Für die gegenseitige Rekursion können Sie einfach die aufgerufene Funktion einbinden.

Wenn Sie also TCO implementieren können, ohne etwas von der VM zu benötigen, warum tun dies dann keine Sprachen (z. B. Clojure, Armed Bear Common Lisp)? Was habe ich vermisst?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage