Нет, Ruby не выполняет TCO. Тем не менее, он также не выполняет TCO.
Спецификация языка Ruby ничего не говорит о TCO. Он не говорит, что вы должны это сделать, но также не говорит, что вы не можете сделать это. Вы просто не можете полагаться на это.
Это не похоже на Схему, где Спецификация языка требует , чтобы все Реализации должны выполнять TCO. Но это также непохоже на Python, где Гвидо ван Россум неоднократно (последний раз всего пару дней назад) очень ясно давал понять, что реализации Python не должны выполнять TCO.
Юкихиро Мацумото симпатизирует TCO, он просто не хочет заставлять все Реализации поддерживать его. К сожалению, это означает, что вы не можете полагаться на TCO, или, если вы это сделаете, ваш код больше не будет переносимым на другие реализации Ruby.
Итак, некоторые реализации Ruby выполняют TCO, но большинство этого не делают. Например, YARV поддерживает TCO, хотя (на данный момент) необходимо явно раскомментировать строку в исходном коде и перекомпилировать виртуальную машину, чтобы активировать TCO - в будущих версиях она будет включена по умолчанию, после того как реализация докажет стабильный. Виртуальная машина Parrot изначально поддерживает TCO, поэтому Cardinal также может легко ее поддерживать. CLR имеет некоторую поддержку TCO, что означает, что IronRuby и Ruby.NET могли бы это сделать. Рубиниус, вероятно, тоже мог это сделать.
Но JRuby и XRuby не поддерживают TCO, и они, вероятно, не будут, если JVM сама не получит поддержку TCO. Проблема заключается в следующем: если вы хотите иметь быструю реализацию, быструю и беспроблемную интеграцию с Java, то вы должны быть совместимы со стеком с Java и максимально использовать стек JVM. Вы можете довольно легко реализовать TCO с помощью батутов или явного стиля продолжения, но тогда вы больше не используете стек JVM, а это означает, что каждый раз, когда вы хотите вызвать Java или вызвать из Java в Ruby, вы должны выполнить какое-то конверсия, которая медленная. Итак, XRuby и JRuby предпочли идти в ногу со скоростью и интеграцией Java, а не с TCO и продолжениями (которые в основном имеют ту же проблему).
Это относится ко всем реализациям Ruby, которые хотят тесно интегрироваться с некоторой хост-платформой, которая изначально не поддерживает TCO. Например, я думаю, у MacRuby будет та же проблема.