Diagnozowanie kodu Java: zwiększanie wydajności kodu Java ( alt ) wyjaśnia, dlaczego maszyna JVM nie obsługuje optymalizacji wywołań końcowych.
Ale chociaż dobrze wiadomo, jak automatycznie przekształcić funkcję rekurencyjną ogonową w prostą pętlę, specyfikacja Java nie wymaga wykonania tej transformacji. Przypuszczalnie jednym z powodów, dla których nie jest to wymagane, jest to, że generalnie transformacja nie może być wykonana statycznie w języku zorientowanym obiektowo. Zamiast tego transformacja z rekurencyjnej funkcji ogonowej do prostej pętli musi być wykonywana dynamicznie przez kompilator JIT.
Następnie podaje przykład kodu Java, który nie zostanie przekształcony.
Tak więc, jak pokazuje przykład z Listingu 3, nie możemy oczekiwać, że statyczne kompilatory wykonają transformację rekurencji ogona w kodzie Javy, zachowując semantykę języka. Zamiast tego musimy polegać na dynamicznej kompilacji przez JIT. W zależności od JVM zespół JIT może to zrobić lub nie.
Następnie daje test, którego możesz użyć, aby dowiedzieć się, czy Twój JIT to robi.
Oczywiście, ponieważ jest to papier IBM, zawiera wtyczkę:
Uruchomiłem ten program z kilkoma pakietami Java SDK i wyniki były zaskakujące. Uruchomienie na maszynie wirtualnej Hotspot firmy Sun w wersji 1.3 ujawnia, że Hotspot nie wykonuje transformacji. Przy ustawieniach domyślnych miejsce na stosie wyczerpuje się na moim komputerze w mniej niż sekundę. Z drugiej strony JVM IBM dla wersji 1.3 mruczy bez problemu, wskazując, że dokonuje transformacji kodu w ten sposób.