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?
Trả lời
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ự.
Hoặc chỉ sử dụng tấm bạt lò xo. .. – sclv
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 –
(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
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.
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
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 –
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
@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. –
@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 –
@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". –
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.
Điều gì về đệ quy lẫn nhau? – cat
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
"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ờ –
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 41Phiên bản hiện tại của bảng compat không liệt kê nó nữa
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
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
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) –