1. A method, comprising: dividing, by a compiler, source code into code sections; evaluating each of the code sections based on pre-defined criteria; characterizing each of the code sections based on results of the evaluating, the characterizing including preliminarily allocating each of the code sections to a corresponding one of a group of heterogeneous processors based on the characteristics, the group of heterogeneous processors including a main processor, a processing element, a parameterized main processor, and a parameterized processing element, wherein a determination that any of the results of the evaluating reflect no decision on allocation of one or more of the code sections to a processor causes the compiler to pass the decision on allocation to runtime code, the runtime code rendering the decision based on at least one of dynamically changing power requirements and performance considerations; analyzing side-effects and costs of executing the code sections on preliminarily allocated processors; transforming at least one of the code sections based on results of the analyzing to produce multiple versions of the at least one of the code sections, each of the versions having a different sequence of instructions and each of the versions optimized for a different set of performance characteristics, the optimization of the versions is a function of characteristics of each of the heterogeneous processors; and selecting one of the versions based on evaluation of parameters, and evaluation of the performance characteristics, the selected version indicated for alternate execution by the runtime code in a runtime environment; wherein the costs evaluated include costs due to placing successive code sections on different processors, costs associated with processing element start-ups or any additional data transfers required as a result of executing the code sections on the allocated processors.