This book is concerned with the improvement of the programming experience of today’s and upcoming embedded systems in the multimedia and wireless communication domains. In these domains, two main interrelated trends have made programming a daunting task for embedded software developers. On the one hand, the underlying computing engines of new embedded devices have evolved to become complex Systems-on-Chip (SoCs) that integrate several processors of different types as well as dedicated hardware accelerators. These heterogeneous Multi-Processor Systems-on-Chip (MPSoCs) are nowadays commonplace in portable consumer electronics. On the other hand, the complexity of the software being deployed on multimedia and wireless terminals keeps rising exponentially. This software is no longer characterized by a single small application, but by a set of individually complex applications, each with constraints that have to be respected regardless of the presence of other applications in the system. As a result, programmers have to implement applications with ever increasing requirements, on platforms with ever increasing complexity. Additionally, they have to meet project schedules that shrink due to tight time-to-market constraints. This situation has given rise to the software productivity gap.