Abstract
The importance of integration in programming environments is well known. Perhaps the easiest way to build an integrated system is to build a closed system; the designers of the system can use whatever ad hoc techniques are available to make the pieces they provide hang together nicely. Many of the integrated editor/compiler/execution environments (like the Cornell Program Synthesizer) fall into this category [Teitelbaum81]. When building an open system, the problem for the designers of the system is not to integrate a fixed collection of tools, but to provide general mechanisms for tool integration. For instance, Unix “pipes” provide an elegant means of integrating new tools by making it easy to make the output of one tool the input of another; also, the simplicity of the Unix file system makes it easy to integrate new devices into the system - the file system conceals the physical peculiarities of the devices instead of making them visible [Kernighan81].