Mam algorytm rekurencyjnego algorytmu rekursywnego, który zaimplementowałem w JavaScript i chciałbym się dowiedzieć, czy jakiekolwiek (wszystkie?) Przeglądarki mogą mieć wyjątki przepełnienia stosu.Czy zoptymalizowano połączenia ogłaszane przez silniki JavaScript?
Odpowiedz
Specyfikacja ECMAScript 4 początkowo zamierzała dodać obsługę TCO, ale została usunięta.
http://lambda-the-ultimate.org/node/3047
O ile mi wiadomo, nie ma powszechnie dostępne implementacje JS aktualnie zrobić automatyczne TCO. Może to być użyteczne dla was, choć:
http://www.paulbarry.com/articles/2009/08/30/tail-call-optimization
Zasadniczo, stosując wzór akumulatora osiągnąć ten sam efekt.
Albo po prostu użyj trampoliny. .. – sclv
Tylko FYI, Rhino ma automatyczny TCO oraz Kontynuacje w trybie "interpretowanym" (opt = -1) http://wiki.apache.org/cocoon/RhinoWithContinuations –
(przepraszam za trolling) ECMAScript 6 zawiera TCO, określane jako prawidłowe ogonki w specyfikacji. – frosty
Prawie każda przeglądarka, którą napotkasz, będzie oznaczać "zbyt dużą rekursję". Oto entry in the V8 bug tracker, która prawdopodobnie będzie interesującą lekturą.
Jeśli jest to prosta samo-rekursja, prawdopodobnie warto spróbować użyć jawnej iteracji zamiast mieć nadzieję na eliminację ogona.
Błąd został ostatecznie przyjęty. Jest pod epickim: "Harmonia żądania funkcji". Mamy nadzieję, że oznacza to, że planują dodać go do obsługi ES6 w V8. – Txangel
Możesz głosować na wsparcie TCO w Internet Explorerze tutaj: https://wpdev.uservoice.com/forums/257854-internet-explorer-platform/suggestions/6850816-es6-tail-call-optimization –
żadna radość na chwilę, ale na szczęście odpowiednie rekurencja ogonowa są skazane na Harmony (ECMAScript w wersji 6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
@MarkWilbur Pytanie dotyczyło w szczególności _browsers_, a nie wszystkich istniejących implementacji ECMAScript. –
@UselessCode Nie, to pytanie dotyczy "silników Javascript", więc ... nie tylko przeglądarek –
@BT Istnieje wiele środowisk poza przeglądarką JS, a tytuł używa bardziej ogólnych "silników JavaScript", ale treść pytanie określa "... chciałby wiedzieć, czy dowolne (wszystkie?) ** przeglądarki ** prawdopodobnie będą miały wyjątki przepełnienia stosu." –
optymalizacji połączeń Tail jest teraz dostępny w LispyScript który kompiluje do javascript. Możesz przeczytać więcej na ten temat here.
Co z wzajemną rekurencją? – cat
Obecnie żadna implementacja JS nie rozpoznaje rekurencji ogona. Zmiany dokonywane są w ECMAScript 6, i jak mówili inni, jest otwarty bilet na V8
Tutaj można zobaczyć wygenerowane asembler V8 dla funkcji ogon rekurencji
https://gist.github.com/mcfedr/832e3553964a014621d5
Porównaj to jak szczęk sporządziła samą funkcję C
https://gist.github.com/mcfedr/63ad08370d856bad3694
V8 zachowuje rekurencyjnej połączenia, natomiast kompilator C uznaje rekursji ogona i zmieniła mi w pętli
"Obecnie żadna implementacja JS nie rozpoznaje rekurencji ogona." jest niepoprawny od węzła 6.2.0, ale musisz podać flagę –
Optymalizacja wywołania końcowego będzie obsługiwana w trybie ścisłym ECMAScript 6 w przyszłości. Aby uzyskać szczegółowe informacje, sprawdź numer http://www.2ality.com/2015/06/tail-call-optimization.html.
Sprawdź bieżącą obsługę silnika pod numerem http://kangax.github.io/compat-table/es6/.
Obecnie (05-01-2018) następujące silniki optymalizacji wsparcie wezwanie ogon:
- Safari 10
- iOS 10
- Kinoma XS6
wsparcie czy „eksperymentalna Funkcje JavaScript "-flag jest włączona:
- Węzeł 6.5
Chrome 54/Opera 41Aktualna wersja compat stole nie wymienia go już
- 1. Silniki 2D dla Javascriptu
- 2. Dlaczego std :: weak_ptr :: expired zoptymalizowano?
- 3. Silniki szynowe rozszerzające funkcjonalność
- 4. Silniki do gier 2D XNA
- 5. Friendly ID i poręcze Silniki
- 6. Resetowanie połączenia wget przez peera
- 7. Zapytanie SQL przez dwa połączenia?
- 8. Java - Metoda połączenia przez JButton
- 9. JavaScript nawias kwadratowy funkcja połączenia
- 10. Wywołanie połączenia zwrotnego w javascript
- 11. JavaScript, aby sprawdzić stan połączenia bezprzewodowego
- 12. Które silniki są używane w większych przeglądarkach?
- 13. Silniki gier 3D dla Ruby lub Python?
- 14. Jak działają silniki renderujące 2d ze skanowaniem?
- 15. Drzewa decyzyjne i silniki reguł (Drools)
- 16. Czy IEnumerable <T> .Last() zoptymalizowano dla listy <T>?
- 17. Czy można odbierać połączenia wychodzące podczas połączenia?
- 18. Silniki i struktury do eksploracji danych?
- 19. Jak ograniczyć równoczesne połączenia używane przez cURL
- 20. Uniform GLSL aktualizowany tylko przez niezwiązane połączenia
- 21. Przekazywanie połączenia PostgreSQL przez inny serwer
- 22. NGINX + uWSGI Resetowanie połączenia przez Peer
- 23. Resetowanie połączenia podczas przekazywania portu przez Vagrant
- 24. Połączenia zwrotne w oknach JavaScript JavaScript z jQuery
- 25. Sprawdź, czy wynik połączenia jest niezdefiniowany.
- 26. Czy połączenia HTTP puli JMeter?
- 27. Wykryj protokół połączenia (HTTP/2, spdy) z javascript
- 28. Czy mogę zmienić: config w mozilla przez javascript?
- 29. Czy Greasemonkey umożliwia ładowanie lokalnego javascript przez @require?
Czy rzeczywiście rekurencyjny algorytm, lub iteracyjny algorytm realizowany z rekursji? Rozumiem, że TCO może pomóc tylko w tym ostatnim. – nmichaels
Chcę tylko dodać, że całkowity koszt posiadania nie jest "tylko" optymalizacją. Jego obsługa powinna być częścią specyfikacji języka, a nie kompilatora/interpretera, ponieważ kod napisany przeciwko jednemu interpreterowi/kompilatorowi z TCO prawdopodobnie nie działałby na interpreter/kompilator bez TCO. – Hoffmann
Możesz zobaczyć bieżące wsparcie i zobaczyć, jak rozwija się on w różnych silnikach w tabeli zgodności ES6 Kangax tutaj: http://kangax.github.io/compat-table/es6/#proper_tail_calls_(tail_call_optimisation) –