簡體   English   中英

是否有任何 JavaScript 引擎尾調用 (TCO) 優化?

[英]Are any JavaScript engines tail call (TCO) optimized?

我有一個用 JavaScript 實現的尾遞歸尋路算法,想知道是否有任何(所有?)瀏覽器可能會出現堆棧溢出異常。

ECMAScript 4 規范原本打算添加對 TCO 的支持,但它被刪除了:

JavaScript 中不再有尾調用?

據我所知,目前還沒有廣泛使用的 JavaScript 實現可以實現自動 TCO。 不過,這可能對您有用:

尾調用優化

本質上,使用累加器模式可以實現相同的效果。

暫時沒有快樂,但幸運的是,Harmony(ECMAScript 版本 6)有適當的尾調用http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls

幾乎您遇到的每個瀏覽器都會對“太多遞歸”感到厭煩。 這是V8 錯誤跟蹤器中的一個條目,可能會很有趣。

如果它是簡單的自遞歸,那么使用顯式迭代而不是希望消除尾調用可能是值得的。

未來將在 ECMAScript 6 嚴格模式中支持尾調用優化。 查看http://www.2ality.com/2015/06/tail-call-optimization.html了解詳情。

檢查http://kangax.github.io/compat-table/es6/以獲得當前的引擎支持。

目前(18-07-2019)以下引擎支持尾調用優化:

  • Safari >= 10
  • iOS >= 10
  • 奇諾瑪XS6
  • 杜克磁帶 2.3

如果打開“實驗性 JavaScript 功能”標志,則支持:

  • 節點 6.5
  • Chrome 54 / Opera 41當前版本的兼容性表不再列出

現在可以在編譯為 JavaScript 的LispyScript中使用尾調用優化。 您可以在此處閱讀更多相關信息。

目前沒有 JavaScript 實現識別尾遞歸。 ECMAScript 6正在發生變化,正如其他人所說, V8上有一張公開票。

在這里你可以看到 V8 為尾遞歸函數生成的匯編程序:

V8 如何編譯遞歸的例子

將其與Clang如何在 C 中編譯相同的函數進行比較

C 編譯器尾遞歸示例

V8 保留遞歸調用,而 C 編譯器已識別尾遞歸並將其更改為循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM