TinyVM has a typical stack architecture, but in this paper, no details of its instruction set or register structure are given. Rather, the authors present a complex infrastructure for creating energy-efficient execution images on a variety of hardware. Their basic idea is to decompose a program into components, each of which is implemented in one of three ways: as byte code for TinyVM, as a domain-specific extension of TinyVM, or as native code for the underlying machine. Each implementation technique has advantages and disadvantages with respect to speed, space, and energy consumption. The trick is to find the best combination according to some predefined criteria.
The paper begins with a discussion of the compilation environment that allows a program to be split, with each part processed appropriately, and the results to be combined. The authors then consider the problem of performing the split automatically. They prove that this multi-objective problem is nondeterministic polynomial-time (NP) hard, but provide an approximation algorithm. Results from the approximation algorithm are then presented and discussed, and related work reviewed.
I found the paper interesting, particularly the range of technology that the authors used to build their infrastructure. The explanations of the infrastructure are clear, but to get some of the subtleties, I found it necessary to look into the paper’s extensive references. Nevertheless, the material is accessible to anyone with a rudimentary understanding of compiler construction.