Wydaje się, że dwa lata po optymalizacji jvm -zapobiega-ogonowi-wywołania , pojawiła się prototypowa implementacja i MLVM od jakiegoś czasu określa tę funkcję jako „proto 80%”.
Czy po stronie Sun / Oracle nie ma aktywnego zainteresowania wspieraniem wywołań końcowych, czy po prostu wywołania końcowe mają „[...] zająć drugie miejsce na każdej liście priorytetów funkcji [...]”, jak wspomniano na JVM Szczyt językowy ?
Byłbym bardzo zainteresowany, gdyby ktoś przetestował kompilację MLVM i mógł podzielić się wrażeniami z tego, jak dobrze działa (jeśli w ogóle).
Aktualizacja: Zwróć uwagę, że niektóre maszyny wirtualne, takie jak Avian, obsługują prawidłowe wywołania końcowe bez żadnych problemów.
Odpowiedzi:
Diagnozowanie kodu Java: zwiększanie wydajności kodu Java ( alt ) wyjaśnia, dlaczego maszyna JVM nie obsługuje optymalizacji wywołań końcowych.
Następnie podaje przykład kodu Java, który nie zostanie przekształcony.
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ę:
źródło
instanceof
sprawdzenie, czythis
jestExample
obiektem (a nie podklasąExample
).Jednym z powodów, dla których widziałem w przeszłości, że nie implementowałem TCO (i jest to postrzegane jako trudne) w Javie, jest to, że model uprawnień w JVM jest wrażliwy na stos, a zatem wywołania końcowe muszą obsługiwać aspekty bezpieczeństwa.
Uważam, że Clements i Felleisen [1] [2] wykazali, że nie jest to przeszkodą i jestem prawie pewien, że łatka MLVM wspomniana w pytaniu również sobie z tym radzi.
Zdaję sobie sprawę, że to nie odpowiada na twoje pytanie; po prostu dodając interesujące informacje.
źródło
Być może już to wiesz, ale funkcja nie jest tak trywialna, jak mogłoby się wydawać, ponieważ język Java w rzeczywistości udostępnia programiście ślad stosu.
Rozważ następujący program:
Nawet jeśli ma to wywołanie ogonowe, może nie zostać zoptymalizowane. (Jeśli jest zoptymalizowany, nadal wymaga prowadzenia księgowości całego stosu wywołań, ponieważ opiera się na nim semantyka programu).
Zasadniczo oznacza to, że trudno jest to wspierać, będąc nadal kompatybilnym wstecz.
źródło
g
w tym przypadku ... pomyśl na przykład o polimorfizmie i refleksji.getStackTrace()
metodę,x()
którą pokazuje kod źródłowy, był wywoływany z metody,y()
pokazuje również, żex()
została wywołana zy()
? Ponieważ jest jakaś wolność, nie ma prawdziwego problemu.Java jest najmniej funkcjonalnym językiem, jaki można sobie wyobrazić (no dobra, może nie !), Ale byłaby to wielka zaleta w przypadku języków JVM, takich jak Scala .
Z moich obserwacji wynika, że uczynienie z JVM platformy dla innych języków nigdy nie wydawało się być na szczycie listy priorytetów dla Sun, a teraz chyba dla Oracle.
źródło