2010-09-07 10 views
86

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?

+2

Czy rzeczywiście rekurencyjny algorytm, lub iteracyjny algorytm realizowany z rekursji? Rozumiem, że TCO może pomóc tylko w tym ostatnim. – nmichaels

+1

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

+1

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) –

Odpowiedz

46

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.

+11

Albo po prostu użyj trampoliny. .. – sclv

+1

Tylko FYI, Rhino ma automatyczny TCO oraz Kontynuacje w trybie "interpretowanym" (opt = -1) http://wiki.apache.org/cocoon/RhinoWithContinuations –

+5

(przepraszam za trolling) ECMAScript 6 zawiera TCO, określane jako prawidłowe ogonki w specyfikacji. – frosty

12

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.

+0

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

+0

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 –

26

ż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

+1

@MarkWilbur Pytanie dotyczyło w szczególności _browsers_, a nie wszystkich istniejących implementacji ECMAScript. –

+1

@UselessCode Nie, to pytanie dotyczy "silników Javascript", więc ... nie tylko przeglądarek –

+1

@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." –

3

optymalizacji połączeń Tail jest teraz dostępny w LispyScript który kompiluje do javascript. Możesz przeczytać więcej na ten temat here.

+0

Co z wzajemną rekurencją? – cat

2

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

+0

"Obecnie żadna implementacja JS nie rozpoznaje rekurencji ogona." jest niepoprawny od węzła 6.2.0, ale musisz podać flagę –

7

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 41 Aktualna wersja compat stole nie wymienia go już
Powiązane problemy