IMHO abstract discussions of modules should be motivated by the
practical problems they help overcome. The points of interest for me:|
1. Separate compilation and linking was the original purpose of modules
according to Cardelli in "Program fragments, linking, and modularization."
DLL hell on Windows has been overcome by .NET versioning.
.NET assemblies also allow a modular multi-language interface.
F#, C#, and SML.NET inter-operation are all thoroughly documented
with examples, but mutual recursiveness between
modules, like PLT units, but unlike ML modules, is a necessity for real systems code,
so is what is presently available on .NET really that useful?
2. Denotational semantics has always held the promise of
declarative language definitions, but it suffers from
lack of modularity, i.e. if you change one little thing, you have
top make extensive changes elsewhere. Only modular monadic
semantics overcame this problem.
3. Attribute grammars are an elegant way to present language
semantics (like the Aho-Ullman-Sethi compiler book (*) does)
but they have not been widely adopted because they
suffer from lack of modularity. Intentional Programming
(or at least the research funded by it) addresses this problem.
* Alfred V. Aho, Ravi Sethi, and Jeffrey D. Ullman.
Compilers: Principles, Techniques, and Tools. Addison Wesley, 1986.
(aka "The Dragon Book")
...and I haven't seen anything online that is easy enough for undergraduates except maybe Cardelli's paper
but I found a great bibliography that I've begun to look through: