Nie, Ruby nie oblicza całkowitego kosztu posiadania. Jednak tak nie jest wykonywać TCO.
Specyfikacja języka Ruby nie mówi nic o całkowitym koszcie posiadania. Nie mówi, że musisz to zrobić, ale też nie mówi, że nie możesz tego zrobić. Po prostu nie możesz polegać na tym .
Jest to w przeciwieństwie do schematu, gdzie Język Specyfikacja wymaga , że wszystkie implementacje muszą wykonać TCO. Ale jest to również w przeciwieństwie do Pythona, w którym Guido van Rossum wielokrotnie podkreślał (ostatni raz zaledwie kilka dni temu), że implementacje Pythona nie powinny przeprowadzać całkowitego kosztu posiadania.
Yukihiro Matsumoto sympatyzuje z TCO, po prostu nie chce narzucać wszystkiego wdrożeń do jego obsługi. Niestety oznacza to, że nie możesz polegać na całkowitym koszcie posiadania, a jeśli to zrobisz, Twój kod nie będzie już przenośny do innych implementacji Rubiego.
Tak więc niektóre implementacje Ruby zapewniają całkowity koszt posiadania, ale większość nie. Na przykład YARV obsługuje TCO, chociaż (na razie) trzeba jawnie odkomentować wiersz w kodzie źródłowym i przekompilować maszynę wirtualną, aby aktywować TCO - w przyszłych wersjach będzie domyślnie włączony, po wdrożeniu udowodni stabilny. Maszyna wirtualna Parrot natywnie obsługuje całkowity koszt posiadania, dlatego też Cardinal może z łatwością ją obsługiwać. CLR ma pewne wsparcie dla TCO, co oznacza, że IronRuby i Ruby.NET prawdopodobnie mogłyby to zrobić. Rubinius prawdopodobnie też by to zrobił.
Ale JRuby i XRuby nie obsługują całkowitego kosztu posiadania i prawdopodobnie nie będą, chyba że sama JVM uzyska wsparcie dla całkowitego kosztu posiadania. Problem jest następujący: jeśli chcesz mieć szybką implementację oraz szybką i bezproblemową integrację z Javą, powinieneś być kompatybilny ze stosem z Javą i używać stosu JVM tak często, jak to możliwe. Możesz dość łatwo zaimplementować TCO z trampolinami lub jawnym stylem przekazywania kontynuacji, ale wtedy nie używasz już stosu JVM, co oznacza, że za każdym razem, gdy chcesz wywołać Java lub wywołać z Javy do Rubiego, musisz wykonać jakiś rodzaj konwersja, która jest powolna. Tak więc XRuby i JRuby wybrali szybkość i integrację z Javą, a nie całkowity koszt posiadania i kontynuację (które zasadniczo mają ten sam problem).
Dotyczy to wszystkich implementacji Rubiego, które chcą ściśle zintegrować się z platformą hosta, która nie obsługuje natywnie TCO. Na przykład, myślę, że MacRuby będzie miał ten sam problem.