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