Unfortunately, it is impossible to generate code for opera- tions that move or compare data without knowing things like the size and layout of the data. But these are char- acteristics of the type's implementation, not its interface. Thus, supporting these operations conflicts with separate compilation, often weakening support for the latter. Even when a module does not represent a particular abstract data type, it usually represents a kind of abstraction over some set of facilities, in which some implementation infor- mation will be hidden behind an interface. Clients of a module want to know what module does, not how it does it.
Most languages use type information to give a partial char- acterization of what a module does.
An interface definition is then a collection of identifiers with their types. In many languages it is possible to write and compile client code based solely on type interfaces. By default, all components are exported, but they can be hidden using the static specifier. Manual methods must be used to ensure that such files are accurate and complete, and that they are used where needed.