1. A system, comprising: a processor coupled to a memory, the processor configured to execute computer-executable instructions stored in the memory that are operable to cause the system to perform acts of: receiving a software workflow comprising a plurality of tasks, a plurality of items including task input and output items, and explicitly encoded dependencies between the tasks and the items, wherein the tasks include a first compilation task that outputs a first assembly item and a second compilation task that outputs a second assembly item which depends on the first assembly item; segmenting the plurality of tasks into a plurality of subsets for concurrent execution and scheduling the subsets on respective computational entities of a plurality of computational entities, wherein the segmenting and scheduling are performed automatically based on the dependencies and a plurality of cost factors including computation cost and communication cost; allocating the subsets to the respective computational entities for execution; and initiating a failure recovery process in response to identifying a failed execution of the first compilation task at the respective computational entity allocated the first compilation task, the failure recovery process comprising: identifying a previous version of the first assembly output by a previous successful execution of the first compilation task; performing a speculative execution of the second compilation task using the previous version of the first assembly to output a speculative version of the second assembly; re-executing, concurrently with the speculative execution of the second compilation task, the first compilation task to output a new version of the first assembly; after successfully completing the speculative execution and the re-execution, determining whether or not a difference exists between the previous version and the new version of the first assembly which would change the second assembly output by the second compilation task; and either utilizing the speculative version of the second assembly in response determining the difference does not exist, or alternatively re-executing the second compilation task using the new version of the first assembly to output a new version of the second assembly in response determining the difference exists and utilizing the new version of the second assembly.