A brief survey of time-travelling debuggers[1]. What [1] does not note is that it was heavily studied in relation to Prolog in the late 80s and early 90s. Some very fancy shenanigans were possible including scripts watching variable bindings and actions. Some of this becomes evident if the Pancake bibliography is scanned[2].
It's exciting seeing the dream of the 70s come alive. :-)
I'm a big fan of Chronon[1] for Java. Run a program and record everything about it. Use the same eclipse debug interface as always, but also have the ability to re-wind to an earlier point. Check out the state of any variable in the code, at any time. It knows about threads, can reproduce inputs/outputs, etc.
I believe it is now integrated with intellij as well.
No connection to the product, other than the fact that I paid for it. Unfortunately it doesn't seem to be very well marketed.
From what I recall (last few months I've been away from Java), you can't modify anything and re-run it (which Elm's debugger seems to be able to do).
This is some incredible work. I am writing a game engine and Elm has been a major influence. I've written a functional reactive programming API, but I'm far away from having such awesome interactive debugging. Thank you, Elm, for the awesome software and providing such good learning material. I was struggling to understand FRP until I came across Elm's "What is FRP?" page. http://elm-lang.org/learn/What-is-FRP.elm
I'm hoping more people in the browser world come around to the idea that concurrency and parallelism aren't so tricky if you start with language design. Passing immutable objects cheaply between web workers would be a huge deal for projects like Elm!
If you're interested in this sort of code editing with live feedback of results, checkout Choc http://www.fullstack.io/choc/ - a project we worked on earlier this year.
You can use vanilla javascript, step through the execution of each line of code, get a human readable description of what the line is doing, scrub constants, etc.
There's even a minecraft-like demo building a tower in voxel.js.
One improvement that this has over most of the "conventional" reversible debuggers mentioned in the comments is the ability to instantly see the effect of your change over time. For example, with Mario example, after jumping up and down, you can adjust the gravity parameter to see what paths Mario would have taken with different gravities and the same input stream.
I'm loathe to say with confidence, but you're right, that does seem to be a relatively novel contribution. It's certainly unusual!
I spent some time reading Hewitt's PLANNER paper recently. I am tempted to think that something drawing from his ideas on hypothetical explorations could be implemented for debugging (more than just numerical adjustments). But it's been a while since I reviewed the debugging literature to say with confidence if such a thing once existed.
I don't think that the OCaml debugger let you do the things demonstrated by Bret Victor in his talks, and implemented there. As explained elsewhere in this thread, these features let you replay a conputation sequence in a loop, and bind certain values of the computation context to visual inputs (sliders or more simply input boxes for instance) to modify these values during the replay loops. This let you observe how the computation sequence reacts to those changes. It allows a more playfull testing and tuning of a program. Of course it is way more useful in the case of a visual rendering performed by said computation. Please watch the Bret Victor's video for insight (maybe that one: http://vimeo.com/m/36579366).
The former (2007) applies live programming to an FRP language; the latter is newer and supports imperative update along with time travel and retroactive update via a concept we call managed time. It is quite easy to do this with FRP, but harder to scale up to richer languages.
Videos are linked into the last paper (and embedded in the first...) but I haven't tried releasing a language yet.
How much overhead does this add and how difficult would it be to implement in another language like Python or even C? I imagine implementing it for an interpreted language would be much easier if you could save and recover states at any given point.
For example, in a project I just completed where we implemented Scheme in C, perhaps we could just memcopy everything and add it to a stack upon each expression evaluation (much easier in Lisp dialects since expressions are nested and you could 'edit as you go' by just changing an inner expression).
As they note in the section entitled "How Elm Makes this Possible", the design of the language lends itself to this feature.
Functional purity and immutability mean that functions can be evaluated speculatively, as demonstrated in the video where Mario's jump trajectory is altered as the gravitational force is weakened or strengthened. There is no need to save any state beyond the user inputs (mouse position and clicks, keys pressed) and the time at which they occurred. Once saved, they can be reevaluated safely (due to the purity and immutability), and live-modifying the code or adjusting the time is a simple matter of rerunning. It's a wonderfully designed feature, but the ability to implement with relative ease is a natural consequence of strict FRP.
In an impure, mutable, stateful language this would be quite challenging, and potentially dangerous. Given a line of code that spawns a thread, for instance, how would it be made clear that the inverse of this state is shutting the thread down? What if the thread has already modified shared memory - how will you track that? If you were to attempt to preserve the entire state of the running program (threads, open files, etc.), how would you quickly reproduce it upon modification?
Any resource in how made a debugger? This is a step where I can't find a simple explanation (ie: for a self-made language: how make a debugger for it?)
intellij and many java IDEs do something similar with utils like mvl to change stack-history ,replay and to a minimal extent hot-swap byte-code in all standard-JREs.
With JVMs like Zing , however a lot more of hot-swap seems possible!
What is the limitation of this? I mean if I'm reading a text file that is a map, and I delete part of it, I'm guessing this is quite impossible to reverse debug correct?
Systems like gdb process-record-and-replay rely on logging machine state with every instruction [0]. This imposes limitations; for example gdb's record-and-replay system is not implemented on all platforms where gdb runs. Record-and-replay systems can also be impractical for many systems; for example VMWare record-and-replay debugging technically works on Firefox, but it's a tool of last resort because of the performance penalty. The browser can take several minutes just to start up in the record-and-replay debugger. [1]
Because of this, Mozilla developed its own record-and-replay system that is lower-overhead, but that again does CPU-specific and platform-specific work that needs to reimplemented for every OS and architecture, and relies on CPU features that aren't available at all on some processors and add some limitations of their own (like no recording of multiple threads with shared memory). [2]
In contrast, the Elm debugger apparently takes advantage of the language's pure FRP design to record and replay only input streams, rather than low-level machine/program state - a very different approach, with its own limitations, but also very different possibilities like interactively rewriting history by running different code on the same input stream.
Because who made it decided he liked to do it with js instead of serving static html. There is nothing wrong with that. It's not an api, it's designed to be consumed by browsers. And browsers have js enabled by default and make it very difficult to disable it. It's a problem only for you because you willingly decided to browse in crippled mode.
Elm normally generates <noscript> tags that are pretty good. It has come in and out of the compiler for various reasons, so it should be back in again at some point. Sorry for the trouble!
[+] [-] pnathan|12 years ago|reply
It's exciting seeing the dream of the 70s come alive. :-)
[1] http://jakob.engbloms.se/archives/1554
[2] http://web.engr.oregonstate.edu/~pancake/papers/biblio/
[+] [-] paperwork|12 years ago|reply
I believe it is now integrated with intellij as well.
No connection to the product, other than the fact that I paid for it. Unfortunately it doesn't seem to be very well marketed.
From what I recall (last few months I've been away from Java), you can't modify anything and re-run it (which Elm's debugger seems to be able to do).
[1]http://chrononsystems.com/
[+] [-] mateuszf|12 years ago|reply
[+] [-] mgkimsal|12 years ago|reply
[+] [-] davexunit|12 years ago|reply
[+] [-] corysama|12 years ago|reply
[+] [-] wheatBread|12 years ago|reply
I'm hoping more people in the browser world come around to the idea that concurrency and parallelism aren't so tricky if you start with language design. Passing immutable objects cheaply between web workers would be a huge deal for projects like Elm!
[+] [-] jashmenn|12 years ago|reply
You can use vanilla javascript, step through the execution of each line of code, get a human readable description of what the line is doing, scrub constants, etc.
There's even a minecraft-like demo building a tower in voxel.js.
[+] [-] omphalos|12 years ago|reply
[+] [-] pnathan|12 years ago|reply
I spent some time reading Hewitt's PLANNER paper recently. I am tempted to think that something drawing from his ideas on hypothetical explorations could be implemented for debugging (more than just numerical adjustments). But it's been a while since I reviewed the debugging literature to say with confidence if such a thing once existed.
[+] [-] eipipuz|12 years ago|reply
See: http://factorcode.org/ & http://concatenative.org/wiki/view/Factor/Features/The%20env...
[+] [-] psibi|12 years ago|reply
I would invest some time in learning this if it's good for production ready applications.
[+] [-] wheatBread|12 years ago|reply
With the two most recent releases ( http://elm-lang.org/blog/announce/0.11.elm and http://elm-lang.org/blog/announce/0.12.elm ) it is really easy to drop an Elm component into an existing JS application, which we are experimenting with both at Prezi and in the general Elm community.
So I'd (biasedly) say to give it a try. Even if it's still too young for you, I think you'll come out of it writing way better JS :)
[+] [-] Tomte|12 years ago|reply
[+] [-] fzltrp|12 years ago|reply
[+] [-] seanmcdirmid|12 years ago|reply
Really, you can examine both systems and make your judgments. It's not like this is a paper with a comprehensive related work section.
[+] [-] j_s|12 years ago|reply
[1] retailing for over $10,000: http://www.microsoftstore.com/store/msusa/en_US/pdp/Visual-S...
[2] http://msdn.microsoft.com/en-us/library/dd264915.aspx
[+] [-] seanmcdirmid|12 years ago|reply
http://research.microsoft.com/apps/pubs/default.aspx?id=1793...
http://research.microsoft.com/apps/pubs/default.aspx?id=2112...
The former (2007) applies live programming to an FRP language; the latter is newer and supports imperative update along with time travel and retroactive update via a concept we call managed time. It is quite easy to do this with FRP, but harder to scale up to richer languages.
Videos are linked into the last paper (and embedded in the first...) but I haven't tried releasing a language yet.
[+] [-] monokrome|12 years ago|reply
http://worrydream.com/Tangle/
[+] [-] Lutin|12 years ago|reply
[+] [-] adamcanady|12 years ago|reply
For example, in a project I just completed where we implemented Scheme in C, perhaps we could just memcopy everything and add it to a stack upon each expression evaluation (much easier in Lisp dialects since expressions are nested and you could 'edit as you go' by just changing an inner expression).
[+] [-] rybosome|12 years ago|reply
Functional purity and immutability mean that functions can be evaluated speculatively, as demonstrated in the video where Mario's jump trajectory is altered as the gravitational force is weakened or strengthened. There is no need to save any state beyond the user inputs (mouse position and clicks, keys pressed) and the time at which they occurred. Once saved, they can be reevaluated safely (due to the purity and immutability), and live-modifying the code or adjusting the time is a simple matter of rerunning. It's a wonderfully designed feature, but the ability to implement with relative ease is a natural consequence of strict FRP.
In an impure, mutable, stateful language this would be quite challenging, and potentially dangerous. Given a line of code that spawns a thread, for instance, how would it be made clear that the inverse of this state is shutting the thread down? What if the thread has already modified shared memory - how will you track that? If you were to attempt to preserve the entire state of the running program (threads, open files, etc.), how would you quickly reproduce it upon modification?
[+] [-] skybrian|12 years ago|reply
Elm runs in a browser and is designed to be accessible to beginners, but there is still plenty of work to do. Don't expect it to scale very well yet.
[+] [-] kevinnk|12 years ago|reply
[+] [-] mamcx|12 years ago|reply
[+] [-] th3iedkid|12 years ago|reply
[+] [-] Trufa|12 years ago|reply
[+] [-] corysama|12 years ago|reply
[+] [-] dekhn|12 years ago|reply
[+] [-] mbrubeck|12 years ago|reply
Because of this, Mozilla developed its own record-and-replay system that is lower-overhead, but that again does CPU-specific and platform-specific work that needs to reimplemented for every OS and architecture, and relies on CPU features that aren't available at all on some processors and add some limitations of their own (like no recording of multiple threads with shared memory). [2]
In contrast, the Elm debugger apparently takes advantage of the language's pure FRP design to record and replay only input streams, rather than low-level machine/program state - a very different approach, with its own limitations, but also very different possibilities like interactively rewriting history by running different code on the same input stream.
[0] https://sourceware.org/gdb/wiki/ProcessRecord
[1] http://blog.pearce.org.nz/2009/03/setting-up-vmware-to-recor...
[2] http://rr-project.org/
[+] [-] adamnemecek|12 years ago|reply
[+] [-] jimktrains2|12 years ago|reply
EDIT: Useless meaning there is 0 content that can be seen. It's not that it's ugly w/o JS, there is nadda, zilch, nothing without it.
[+] [-] y0ghur7_xxx|12 years ago|reply
[+] [-] wheatBread|12 years ago|reply