No, Ruby non esegue il TCO. Tuttavia, inoltre, non esegue il TCO.
La specifica del linguaggio Ruby non dice nulla sul TCO. Non dice che devi farlo, ma non dice nemmeno che non puoi farlo. Non puoi fare affidamento su di esso.
Questo è diverso da Scheme, in cui la specifica della lingua richiede che tutte le implementazioni debbano rispettare il TCO. Ma è anche diverso da Python, dove Guido van Rossum ha chiarito in più occasioni (l'ultima volta solo un paio di giorni fa) che le implementazioni Python non dovrebbero eseguire il TCO.
Yukihiro Matsumoto è favorevole al TCO, semplicemente non vuole costringere tutte le implementazioni a supportarlo. Sfortunatamente, questo significa che non puoi fare affidamento sul TCO o, se lo fai, il tuo codice non sarà più trasferibile su altre implementazioni Ruby.
Quindi, alcune implementazioni di Ruby eseguono il TCO, ma la maggior parte non lo fa. YARV, ad esempio, supporta il TCO, sebbene (per il momento) sia necessario decommentare esplicitamente una riga nel codice sorgente e ricompilare la VM, per attivare il TCO - nelle versioni future sarà attivo per impostazione predefinita, dopo che l'implementazione avrà dimostrato stabile. La Parrot Virtual Machine supporta nativamente il TCO, quindi anche Cardinal potrebbe supportarlo abbastanza facilmente. Il CLR ha un certo supporto per TCO, il che significa che IronRuby e Ruby.NET potrebbero probabilmente farlo. Probabilmente potrebbe farlo anche Rubinius.
Ma JRuby e XRuby non supportano il TCO e probabilmente non lo faranno, a meno che la stessa JVM non ottenga il supporto per il TCO. Il problema è questo: se vuoi avere un'implementazione veloce e un'integrazione veloce e senza soluzione di continuità con Java, allora dovresti essere compatibile con lo stack con Java e utilizzare lo stack della JVM il più possibile. Puoi implementare abbastanza facilmente il TCO con trampolini o uno stile di continuazione esplicito, ma poi non stai più utilizzando lo stack JVM, il che significa che ogni volta che vuoi chiamare Java o chiamare da Java a Ruby, devi eseguire una sorta di conversione, che è lenta. Quindi, XRuby e JRuby hanno scelto di andare con la velocità e l'integrazione di Java su TCO e continuazioni (che fondamentalmente hanno lo stesso problema).
Questo vale per tutte le implementazioni di Ruby che vogliono integrarsi strettamente con qualche piattaforma host che non supporta nativamente il TCO. Ad esempio, immagino che MacRuby avrà lo stesso problema.