Software technology is the system component that bridges the gap between applications and computing hardware. As such, it includes tools for application development as well as software components that regulate system operation and the allocation of system resources. The former category includes compilers, debuggers, and program performance analyzers; the latter category includes the various operating-system functions such as scheduling, file systems, input/output systems, communication, security, and protection from errant user programs. On top of the actual hardware system, these components combine to build a ``virtual system'' that ideally is effective and pleasant for programmers and end-users to use, and also makes efficient use of the underlying hardware resources.
In the case of high performance and especially massively parallel computing, the need for such a ``virtual system'' has been all the more acute because the bare hardware for such machines is increasingly complex and challenging to use effectively. However, software technology can not perform miracles. It can only deliver efficient hardware utilization when methods for achieving that utilization are known and can be reduced to an algorithmic form. Even when such methods are known, software technology can only apply them to a given application program when the program is presented in a form that enables the software technology to extract the information needed to apply the methods correctly.