1. A method for optimizing execution of a single threaded program on a multi-core processor comprising: dividing the single threaded program into a plurality of discretely executable components while compiling the single threaded program; identifying at least some of the plurality of discretely executable components for execution by an idle core within the multi-core processor; and enabling execution of the at least one of the plurality of discretely executable components on the idle core; generating a graph of relationships between the plurality of discretely executable components, the graph comprising a main component and a plurality of discretely executable sub-components; assigning the main component to execute on a first core of the multi-core processor; and, assigning each of the plurality of discretely executable sub-components to execute on at least one idle core of the multi-core processor; and, dynamically recording addresses accessed by the main component and the plurality of discretely executable sub-components as well as changes of values to the addresses in the order in which the changes occur on a list; and wherein the graph groups a plurality of dependencies together within a single sub-thread so as to make execution of the sub-thread more favorable to speculative execution threads, wherein the addresses are memory addresses included in the list of addresses that were read from or written to by the main component and the plurality of discretely executable sub-components.