Modern programming languages have grown in their level of abstraction by offering task-based APIs and parallel structures in addition to manual thread operations. But one aspect of embedded programming has remained largely unchanged:
Programming is done in a sequential line-by-line fashion to mimic the sequential behavior of single-threaded execution on most
This is notably different from the flow-chart type of approach that many engineers pursue during the brainstorming process for an application. Instead of immediately concentrating on a set of sequential steps as mandated by CPU architecture, a flow-chart approach lets programmers more directly address the problems they are trying to solve by focusing on the algorithms needed to manipulate data, as well as the dependencies between those algorithms.
In addition, flow charts are a natural choice for expressing parallel processes (those that do not have data dependencies) in a way that is visually intuitive.
Traditionally, programmers have been required to translate flow-chart components into sequential statements before implementation on a CPU-a task that can be both time-consuming and especially difficult for parallel tasks. Decades of R&D, however, have yielded programming languages that can directly encode both function and data dependency information, rendering the translation step unnecessary. Referred to as dataflow languages, they have one important benefit that cannot be ignored: the ability to identify parallel sections of code automatically and execute them on multicore processors.
In short, traditional programming languages require programmers to adapt their ideas to a sequential execution model and manually identify parallel sections of code. Dataflow solutions are available today that use intelligent compilers to detect parallelism (Figure 2) and then choose how to best schedule sequential CPU instructions. That's a game changer in that it lets developers concentrate on the problem at hand, rather than on the underlying hardware.