2010-09-07 35 views
86

Tôi có một thuật toán pathfinding đuôi đệ quy mà tôi đã thực hiện trong Javascript và muốn biết nếu có (tất cả?) Trình duyệt có thể sẽ nhận được ngoại lệ tràn ngăn xếp.Có bất kỳ đuôi đuôi động cơ Javascript nào được tối ưu hóa không?

+2

Có thực sự là một thuật toán đệ quy, hoặc một thuật toán lặp thực hiện với đệ quy? Sự hiểu biết của tôi là TCO chỉ có thể giúp đỡ sau này. – nmichaels

+1

Tôi chỉ muốn thêm rằng TCO không phải là 'chỉ' một tối ưu hóa. Hỗ trợ nó phải là một phần của đặc tả ngôn ngữ, không phải trình biên dịch/phiên dịch vì mã được viết trên một trình thông dịch/trình biên dịch với TCO có thể sẽ không hoạt động trên trình biên dịch/trình biên dịch mà không có TCO. – Hoffmann

+1

Bạn có thể xem hỗ trợ hiện tại và xem nó phát triển trên các công cụ trong bảng tương thích ES6 của Kangax tại đây: http://kangax.github.io/compat-table/es6/#proper_tail_calls_(tail_call_optimisation) –

Trả lời

46

Thông số ECMAScript 4 ban đầu sẽ thêm hỗ trợ cho TCO, nhưng nó đã bị loại bỏ.

http://lambda-the-ultimate.org/node/3047

Theo như tôi biết, việc triển khai không rộng rãi có sẵn của JS hiện đang làm tự động TCO. Điều này có thể được sử dụng đối với bạn, mặc dù:

http://www.paulbarry.com/articles/2009/08/30/tail-call-optimization

Về cơ bản, sử dụng mô hình ắc hoàn thành tác dụng tương tự.

+11

Hoặc chỉ sử dụng tấm bạt lò xo. .. – sclv

+1

Chỉ cần một FYI, tê giác có TCO tự động cùng với Continuations trong chế độ "giải thích" (opt = -1) http://wiki.apache.org/cocoon/RhinoWithContinuations –

+5

(xin lỗi vì trolling) ECMAScript 6 đã bao gồm TCO, gọi đúng các cuộc gọi Tail trong đặc tả. – frosty

12

Khá nhiều mọi trình duyệt bạn gặp phải sẽ bị chặn lại trong "quá nhiều đệ quy". Dưới đây là một số entry in the V8 bug tracker có thể sẽ rất thú vị.

Nếu nó đơn giản tự đệ quy, nó có thể có giá trị nỗ lực để sử dụng lặp lại rõ ràng hơn là hy vọng cho việc loại bỏ cuộc gọi đuôi.

+0

Lỗi cuối cùng đã được chấp nhận. Đó là theo sử thi: "Tính năng yêu cầu Harmony". Hy vọng rằng điều đó có nghĩa là họ có kế hoạch để thêm nó vào ES6 hỗ trợ trong V8. – Txangel

+0

Bạn có thể bỏ phiếu cho hỗ trợ TCO trong Internet Explorer tại đây: https://wpdev.uservoice.com/forums/257854-internet-explorer-platform/suggestions/6850816-es6-tail-call-optimization –

26

Không có niềm vui cho thời điểm này, nhưng may mắn cuộc gọi đuôi thích hợp được dự kiến ​​sẽ Harmony (ECMAScript phiên bản 6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls

+1

@MarkWilbur Các câu hỏi đã được cụ thể về _browsers_, không phải tất cả hiện thực hiện của ECMAScript. –

+1

@UselessCode Không, câu hỏi này là về "công cụ Javascript" vì vậy ... không chỉ các trình duyệt –

+1

@BT Thực tế có nhiều môi trường JS không phải trình duyệt và tiêu đề sử dụng "công cụ Javascript" chung chung hơn nhưng cơ thể của câu hỏi chỉ định "... muốn biết liệu có bất kỳ trình duyệt nào (tất cả?) ** có thể có ngoại lệ tràn ngăn xếp hay không". –

3

tối ưu hóa cuộc gọi Tail bây giờ đã có trong LispyScript mà biên dịch để javascript. Bạn có thể đọc thêm về nó here.

+0

Điều gì về đệ quy lẫn nhau? – cat

2

Hiện tại không có triển khai JS nào nhận ra sự đệ quy đuôi. Những thay đổi đang được thực hiện trong ECMAScript 6, và như những người khác đã nói, có một vé mở trên V8

đây bạn có thể nhìn thấy động cơ V8 của lắp ráp tạo ra cho một hàm đệ quy đuôi

https://gist.github.com/mcfedr/832e3553964a014621d5

so sánh với cách kêu vang đã biên soạn các chức năng tương tự trong C

https://gist.github.com/mcfedr/63ad08370d856bad3694

V8 vẫn giữ được cuộc gọi đệ quy, trong khi trình biên dịch C đã nhận ra đệ quy đuôi và thay đổi nó i nto một vòng lặp

+0

"Hiện tại không có triển khai JS nhận ra đệ quy đuôi." đó là không chính xác như của Node 6.2.0, nhưng bạn phải vượt qua một lá cờ –

7

Tối ưu hóa cuộc gọi đuôi sẽ được hỗ trợ Trong chế độ nghiêm ngặt ECMAScript 6 trong tương lai. Kiểm tra http://www.2ality.com/2015/06/tail-call-optimization.html để biết chi tiết.

Kiểm tra http://kangax.github.io/compat-table/es6/ để được hỗ trợ động cơ hiện tại.

Tại thời điểm (2018/05/01) các công cụ sau đây hỗ trợ cuộc gọi đuôi tối ưu hóa:

  • Safari 10
  • iOS 10
  • Kinoma XS6

hỗ trợ nếu "thử nghiệm Các tính năng JavaScript "-flag được bật:

  • Nút 6.5
  • Chrome 54/Opera 41 Phiên bản hiện tại của bảng compat không liệt kê nó nữa
Các vấn đề liên quan