Хотя по-другому (в том смысле, что инструкции il уже существовали), стоит отметить дополнительные усилия, которые пришлось приложить команде .Net 64-битной JIT для соблюдения всех оконечных вызовов.
Я, в частности, взываю:
Недостатком, конечно, является то, что если вам нужно отладить или профилировать оптимизированный код, будьте готовы работать со стеками вызовов, которые выглядят так, как будто в них пропущено несколько кадров.
Я думаю, очень маловероятно, что JVM сможет этого избежать.
Учитывая, что в обстоятельствах, когда запрашивалась оптимизация хвостового вызова, JIT должен предполагать, что требуется , чтобы избежать переполнения стека, это не может быть просто отключено в сборках отладки. Они не очень полезны для отладки, если они терпят крах, прежде чем вы перейдете к интересной части. «Оптимизация» на самом деле является постоянной функцией и является проблемой для трассировки стека, затронутой ею.
Стоит отметить, что любая оптимизация, которая позволяет избежать создания реального стекового фрейма при выполнении операции, которую программист концептуально описывает / понимает как стековую операцию (например, вызов функции), по своей сути вызовет разрыв между представленным пользователю при отладке / предоставлении трассировки стека и реальности.
Это неизбежно, поскольку код, описывающий операцию, становится все более и более отделенным от механизма конечного автомата, выполняющего операцию.