1. A method of scheduling operations of a program on a multi-execution unit computing apparatus, the method comprising: receiving, at a first computing apparatus, a computer program comprising a set of operations; and optimizing the computer program for execution on a second computing apparatus, the second computing apparatus comprising at least two execution units, wherein the optimizing step comprises (i) initializing a set of memory-based dependencies, (ii) performing dataflow analysis to identify one or more dataflow dependencies within the set of operations, and (iii) scheduling the set of operations, the scheduling being based at least in part on a performance cost of a schedule and a memory-usage cost of the schedule, whereby (a) any dependency in the set of memory-based dependencies and the identified one or more dataflow dependencies are not violated, and (b) a subset of operations in the set of operations is scheduled for execution by a first unit of the at least two execution units and a subset of operations in the set of operations is scheduled for execution by a second unit of the at least two execution units.