1. A method of debugging a program that includes declarative code and procedural code, the method comprising, recording execution steps of the procedural code, linking, for each of the execution steps, execution events that occur during the execution of the step with portions of the procedural code that were previously executed and that caused these execution events; recording execution of the declarative code, linking the execution events with portions of the declarative code that was executed and that caused the execution events; and recording procedural calls from the declarative code and computational processes that were performed due to execution of the declarative code; saving data that includes the recorded execution steps of the procedural code, the recorded execution of the declarative code and a chronological order of the recorded calls; and in post-process debugging, presenting the saved data on an output device in the form of a sequence of execution events corresponding to a computational flow of the execution of the program.