ES6 Tail Recursion Optimization Stack Overflow

Po przeczytaniu opisu Dr Rauschmayera rekurencyjnej optymalizacji wywołań ogonowych w es6, od tamtej pory staram się odtworzyć 'zero-stos' wykonania rekurencyjnej funkcji czynnikowej, którą on opisuje.

Używając debuggera Chrome do przechodzenia między ramkami stosu, widzę, że optymalizacja ogona nie zachodzi i ramka stosu jest tworzona dla każdej rekurencji.

Próbowałem też przetestować optymalizację wywołując funkcję bez debuggera, ale zamiast tego przechodzi 100000 do funkcji czynnikowej. Powoduje to błąd "maksymalnego stosu", co oznacza, że w rzeczywistości nie jest zoptymalizowany.

Oto Mój kod:

const factorial = (n, acc = 1) => n <= 1 ? acc : factorial(n - 1, n * acc)
console.log( factorial(100000) )

Wynik:

Uncaught RangeError: Maximum call stack size exceeded
Author: Sam Hanlan, 2017-03-14

2 answers

V8, silnik JavaScript w Chrome, miał wsparcie TCO przez jakiś czas, ale od tej zaktualizowanej odpowiedzi (listopad 2017) już nie ma i jak to pisanie, nie ma aktywnego rozwoju TCO W V8, i żaden nie jest planowany. Możesz przeczytać szczegóły w Błąd śledzenia V8 dla niego .

Wydaje się, że wsparcie TCO osiągnęło przyzwoity poziom w V8 w pewnym momencie, ale pozostało za flagą z kilku powodów (problemy z debugowaniem, błędy). Ale potem stało się kilka rzeczy, między innymi, że Zespół V8 poruszył istotne problemy z TCO i zdecydowanie poparł zmianę specyfikacji nazwanąsyntaktycznymi wywołaniami ogonowymi (stcs) , które wymagałyby, aby wywołania ogonowe były celowo oznaczane w kodzie źródłowym (np. return continue doThat();). Jednak w lipcu 2017 r. propozycja ta stała się nieaktywna. Również w lipcu, bez prac związanych z TCO, zespół V8 usunął kod do obsługi TCO ze źródła dla Turbofana*, ponieważ w przeciwnym razie podlegałby on bitrotowi. (Np. stać się bólem podtrzymującym i źródło błędów.)

Więc obecnie (Listopad 2017) nie jest jasne, czy" niewidzialny " TCO kiedykolwiek będzie w V8, czy jakieś STC wejdą, czy co. Strona statusu Platformy Chrome wskazuje na "mieszane" publiczne sygnały od Mozilli (Firefox/SpiderMonkey) i Microsoft (Edge / Chakra) dotyczące obsługi TCO, że Safari jest wysyłane z TCO i że twórcy stron internetowych są "pozytywnie nastawieni" do tej funkcji. Zobaczymy, co dalej. Jeśli gdzieś.

* (TurboFan = The obecnie najnowocześniejszy kompilator JIT w V8, teraz przełączyli z pełnego kodu [JIT] + wału korbowego [agresywne optymalizowanie JIT] na zapłon [interpreter+] i TurboFan [agresywne optymalizowanie JIT])

 72
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-10 22:52:55

Zespół V8 (Chrome ' s js engine) na razie nie wdraża TCO. Jest wyrwany z najnowszych wersji (zobacz ten wątek).

Z głównych przeglądarek, tylko Safari zaimplementowało tę funkcję .

In Node.JS w wersji 8 i nowszej, TCO nie jest dostępne .

Może być jakaś nadzieja na wdrożenie TCO: podczas 2017 WebAssembly meeting, Google i wszystkie inne grupy były neutralne lub pozytywne wobec dalsze badanie wdrożenia TCO.

 11
Author: Freewalker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-11 16:19:02