-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add tail recursion optimization #29
Comments
This comment was originally written by mprz1024@gmail.com I think this is one of the most important features Dart is missing. Tail call elimination, or a subset of this functionality — tail recursion elimination — supports the implementation of certain algorithms in a recursive way that is easier to think for some programmers (especially those coming from mathemathical or more formal computing science background) and allows for the implementation of parts of programs without side effects, which has been proven to be less error-prone. It's a feature from many functional programming languages we would love to have in Dart. Please note that this feature hurts no one: people without the understanding of it will simply not benefit from it, but it will not make their lives harder. |
Removed Type-Defect label. |
This comment was originally written by drfibonacci@google.com Added Triaged label. |
Tail recursion elimination needs to be balanced against issues like debugging. There are ways to do this, and maybe at some point we will do something, but honestly, it won't be very soon, if ever. |
Set owner to @gbracha. |
Just to comment on the "this feature hurts no one". Aside from the common debug arguments there is (or can be) also a runtime cost associated with them. Tail call optimization precludes some calling-conventions (which a VM normally can chose freely). I would compare it to disallowing --fomit-frame-pointer for gcc. |
This comment was originally written by martin.elsman...@gmail.com I would suggest adding tail-call optimization support quickly. For programming with continuations and other advanced control operators, tail-call optimization is essential. Tail-call optimization is also necessary for programming in a functional style using tail-recursion. Finally, DART could take off quickly as a target language for compilers for functional language compilers such as Hop, SMLtoJs, AFAX, and Links, to name just a few. |
Let me just stress that with popular frameworks like Node.js who rely heavily on a continuation passing style, the tail call optimization does seem more than relevant. |
An important goal of Dart is ensuring we can generate efficient JavaScript code. |
This comment was originally written by LuoZhongYao...@gmail.com This is a Bug? Run retunr is false. |
main(){ This is not a bug. 'a' is initialized to null and (null is num) returns false. (Please file a new issue for different bug reports) |
Added apr30-triage label. |
Removed apr30-triage label. |
Added triage1 label. |
Removed this from the Later milestone. |
Removed Oldschool-Milestone-Later label. |
It is unlikely that anything will happen on this front unless JS implements it reliably on all browsers. Even then there are interesting issues. See http://gbracha.blogspot.com/2009/12/chased-by-ones-own-tail.html Added Accepted label. |
This comment was originally written by lessmem...@gmail.com As I understand no changes happened with this case? |
Here's a minimal repro that this CL fixes: `ui.dart` ```dart library dart.ui; import 'dart:ffi'; part 'foo.dart'; ``` `foo.dart` ```dart part of dart.ui; @Native<Void Function()>(symbol: 'foo_func', isLeaf: true) external void foo_func(); ``` When compiling with `compile_platform.dart` with `--target=dart2wasm`, the following error appears: ``` Unhandled exception: Verification error: Target=wasm, VerificationStage.afterModularTransformations: Invalid location with target 'wasm' on FunctionNode() (FunctionNode): RangeError (offset): Invalid value: Not in inclusive range 0..56: 91 Context: 'foo_func_$import'. Node: 'FunctionNode()'. #0 VerificationErrorListener.reportError (package:kernel/verifier.dart:81:5) #1 VerifyingVisitor.problem (package:kernel/verifier.dart:222:14) #2 VerifyingVisitor._getLocation (package:kernel/verifier.dart:1361:7) #3 VerifyingVisitor._hasLocation (package:kernel/verifier.dart:1370:26) #4 VerifyingVisitor.getSameLibraryLastSeenTreeNode (package:kernel/verifier.dart:1342:28) #5 VerifyingVisitor.localContext (package:kernel/verifier.dart:1382:24) #6 VerifyingVisitor.defaultDartType (package:kernel/verifier.dart:1491:41) #7 Visitor.visitVoidType (package:kernel/visitor.dart:1309:37) #8 VoidType.accept (package:kernel/ast.dart:11190:42) #9 FunctionNode.visitChildren (package:kernel/ast.dart:3919:16) #10 VerifyingVisitor.visitChildren (package:kernel/verifier.dart:259:10) #11 VerifyingVisitor.visitWithLocalScope (package:kernel/verifier.dart:266:5) #12 VerifyingVisitor.visitFunctionNode (package:kernel/verifier.dart:721:5) #13 FunctionNode.accept (package:kernel/ast.dart:3908:38) #14 VerifyingVisitor.visitProcedure (package:kernel/verifier.dart:620:19) #15 Procedure.accept (package:kernel/ast.dart:3311:40) #16 visitList (package:kernel/ast.dart:14488:14) #17 Library.visitChildren (package:kernel/ast.dart:591:5) #18 VerifyingVisitor.visitChildren (package:kernel/verifier.dart:259:10) #19 VerifyingVisitor.defaultTreeNode (package:kernel/verifier.dart:196:5) #20 TreeVisitor.visitLibrary (package:kernel/visitor.dart:503:35) #21 VerifyingVisitor.visitLibrary (package:kernel/verifier.dart:367:11) #22 Library.accept (package:kernel/ast.dart:577:38) #23 visitList (package:kernel/ast.dart:14488:14) #24 Component.visitChildren (package:kernel/ast.dart:14320:5) #25 VerifyingVisitor.visitChildren (package:kernel/verifier.dart:259:10) #26 VerifyingVisitor.visitComponent (package:kernel/verifier.dart:342:7) #27 Component.accept (package:kernel/ast.dart:14313:38) #28 VerifyingVisitor.check (package:kernel/verifier.dart:171:15) #29 verifyComponent (package:kernel/verifier.dart:69:20) ... ``` The issue seems to be that after doing this native transformation, the node's `fileUri` references the enclosing library (`ui.dart` above), but the `node.location` references the actual source file (`foo.dart` above) indirectly through `node.fileOffset`. This ends up being an issue when compiling the platform dill in Google3, but I didn't look into why `flutter build web --wasm` isn't broken. Internal bug: b/292172146 Change-Id: I2b8d7d215b2c36354860257ce651d50168e9523d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/315360 Reviewed-by: Ömer Ağacan <omersa@google.com> Commit-Queue: Jia Hao Goh <jiahaog@google.com>
This issue was originally filed by paulp...@gmail.com
Tailrec optimization is a well-known feature of functional languages.
I propose to add support for it in dart.
The text was updated successfully, but these errors were encountered: