News for hackers. Stuff that matters.
Re:Applying NASA coding standards to JavaScript by wyager on Thursday January 08, 2015 @11:20AM (#8857046)
I suspect issue isn't that recursion is hard to analyze, but that non-tail-call-optimized recursion has unbounded memory usage.

In fact, what makes you say that recursion is difficult to analyze? Inductive proofs over recursive algorithms are generally much nicer than proofs over iterative algorithms.

Re:Applying NASA coding standards to JavaScript by DannyBee on Thursday January 08, 2015 @12:30PM (#8857521)
"In fact, what makes you say that recursion is difficult to analyze? Inductive proofs over recursive algorithms are generally much nicer than proofs over iterative algorithms."

For static analysis purposes, it is not great. Particularly if it is inside conditionals. Either you eat exponential path blowup (assuming bounded recursion and context-sensitivity) and fix-point it, or collapse the whole call graph cycle starting at the recursion into a single result (which generates false positives).

This assumes a single-thread.

Concurrent javascript code, with recursion, does not even have a decidable reachability problem, which makes it very difficult to get good answers.

Suffice to say, what is easy/hard for humans to prove is not the same as computers.

You would have a much harder time getting good static analysis results from a recursive fibonacci function than an iterative one (and this is simple tail recursion)

Re:Applying NASA coding standards to JavaScript by bronson on Thursday January 08, 2015 @11:57AM (#8857271)
Exactly right. Recursion is the easiest way to blow up the stack (with alloca a distant second). NASA stacks tend to be small, static, and can produce physical harm when damaged.

Why avoid recursion entirely? Because it's too easy for another programmer to accidentally convert tail-call optimized recursion into full recursion. That mistake is harder to make on code written as a loop.

Re:Applying NASA coding standards to JavaScript by jacquesm on Thursday January 08, 2015 @01:27PM (#8857925)
You nailed it. Tail calls have constant memory footprints, non-tail-call recursion (assuming the language runtime and/or compiler are able to recognize these situations and convert the tailcall into an adjustment of the variables in scope in the current stack frame followed by a jump).

If we'd be worried about our ability to analyze these then we wouldn't be able to optimize away that special case to begin with.

I do find that to my imperatively trained eyes it always screams 'stack overflow' at me and then I have to remind myself that will be optimized away.

It'd be nice if environments that provide tail call optimizations could be set to fail compilation if any non-tail-call recursion is detected.

Re:Applying NASA coding standards to JavaScript by DannyBee on Thursday January 08, 2015 @01:54PM (#8858114)
"If we'd be worried about our ability to analyze these then we wouldn't be able to optimize away that special case to begin with. "

Most compilers require you tell them, specifically, that it can tail call everything, before it will do it (i'm talking more about GCC and LLVM here, which are generic compiler frameworks). It will do some tail call optimization, but only fairly basic cases, exactly because it can't analyze what will happen.