To cope with the complexity of very large systems, it is not sufficient to
divide them into simple pieces because the pieces themselves will either be
too numerous or too large. A hierarchical modular structure is the natural
solution. In this article we explain how that approach can be applied to s
oftware. Our compilation manager provides a language for specifying where i
ndividual modules fit into a hierarchy and how they are related semanticall
y We pay particular attention to the structure of the global name space of
program identifiers that are used for module linkage because any potential
for name clashes between otherwise unrelated parts of a program can negativ
ely affect modularity. We discuss the theoretical issues in building softwa
re hierarchically, and we describe our implementation of CM, the compilatio
n manager for Standard ML of New Jersey.