Modula2 was unique in that it used 2 different files for each module: one was the definition file, which is the exported to the outside world functions, types, constants, variables that are exported from a module, could be compiled, which emitted a .MSYM file, which could then be used by some other programmer who is going to use that module, without having access to the source code. And as long as the definition part didn't change, you could rebuild a huge program without recompiling the headers. It meant that someone could promise an interface, and as long as those promises didn't change the clients could be unconcerned with the internal workings. It doesn't pay off until you make a huge program, but as you know the N-squared aspect of programming complexity is present, and large Modula-2 programs were typically half of the the equivalent C program (and faster too, with many times lower nesting levels than Java programs). In Oberon he abandoned the practice of having a second separate file which did mean extra typing. But it did make compilation speedy, as you typically only change 1% of a program, and without any fancy incremental compilation features in the compiler (which can have errors) meant that compilation speeds were incredible compared to large C programs. I built some humongous products with it, like IBM DisplayWrite 5 Composer, Flying Colors, and Discus labeler, worked well on WIndows and Mac platforms. But again the module feature was just one aspect of Modula-2 that was great; it also had a much clearer definition syntax for a pointer to an array of functions that return a function that returns an integer. Try doing that in C, it is a mind-bender, while in Modula-2 it was clean and clear. The larger the program, the better Modula-2 looks, as its simplicity was born of clean logic. All of Wirth's work is elegant and very mathematical in its foundations.