Mam rekurencyjny algorytm znajdowania ścieżki ogona, który zaimplementowałem w JavaScript i chciałbym wiedzieć, czy którakolwiek (wszystkie?) Przeglądarki prawdopodobnie otrzymają wyjątki przepełnienia stosu.
91
Mam rekurencyjny algorytm znajdowania ścieżki ogona, który zaimplementowałem w JavaScript i chciałbym wiedzieć, czy którakolwiek (wszystkie?) Przeglądarki prawdopodobnie otrzymają wyjątki przepełnienia stosu.
only
jest optymalizacją. Obsługa tego powinna być częścią specyfikacji języka, a nie kompilatorem / interpretatorem, ponieważ kod napisany dla jednego interpretera / kompilatora z TCO prawdopodobnie nie działałby na interpretatorze / kompilatorze bez TCO.Odpowiedzi:
Specyfikacja ECMAScript 4 pierwotnie miała dodać obsługę TCO, ale została odrzucona:
Nigdy więcej wywołań ogonowych w JavaScript?
O ile mi wiadomo, żadne powszechnie dostępne implementacje JavaScript nie zapewniają obecnie automatycznego TCO. Może się to jednak przydać:
Tail Call Optimization
Zasadniczo użycie wzorca akumulatorowego daje ten sam efekt.
źródło
W tej chwili nie ma radości, ale na szczęście Harmony (wersja 6 ECMAScript) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls ma na szczęście właściwe wywołania ogonowe
źródło
Prawie każda przeglądarka, którą napotkasz, będzie borykać się z „zbyt dużą rekurencją”. Oto wpis w narzędziu do śledzenia błędów V8 , który prawdopodobnie będzie interesującą lekturą.
Jeśli jest to prosta rekursja własna, prawdopodobnie warto spróbować użyć jawnej iteracji, zamiast mieć nadzieję na eliminację wywołań ogonowych.
źródło
Optymalizacja połączeń końcowych będzie obsługiwana w trybie ścisłym ECMAScript 6 w przyszłości. Sprawdzić http://www.2ality.com/2015/06/tail-call-optimization.html szczegóły.
Sprawdź http://kangax.github.io/compat-table/es6/, aby uzyskać aktualne wsparcie dla silnika.
W tej chwili (18-07-2019) następujące silniki obsługują optymalizację połączeń ogonowych:
obsługa, jeśli „eksperymentalne funkcje JavaScript” są włączone:
Chrome 54 / Opera 41Aktualna wersja tabeli kompatybilności już jej nie wymieniaźródło
Optymalizacja wywołań ogona jest teraz dostępna w LispyScript, który kompiluje się do JavaScript. Więcej na ten temat przeczytasz tutaj .
źródło
Obecnie żadna implementacja JavaScript nie rozpoznaje rekurencji ogonowej. Zmiany są wprowadzane w ECMAScript 6 , i jak powiedzieli inni, jest otwarty bilet na V8 .
Tutaj możesz zobaczyć wygenerowany asembler V8 dla funkcji rekurencyjnej ogona:
Przykład tego, jak V8 kompiluje rekursję
Porównaj to z tym, jak Clang skompilował tę samą funkcję w C
Przykład rekurencji ogona kompilatora C.
V8 zachowuje wywołanie rekurencyjne, podczas gdy kompilator C rozpoznał rekurencję ogonową i zmienił ją w pętlę.
źródło