I built two of the biggest Modula-2 projects ever made in the language, and used it exclusively for 20 years. Modula2 was the 10 year later sequel to Pascal. The big improvement other than a few expansions of the type system so you could have POINTER TO ARRAY [-5..+5] OF A_RECORD, which beats the hell out of C's nutty notation, was the module system. Modula2 had a unique approach that actually Prof. Wirth discard as cumbersome in Oberon. In Modula-2 each module had 2 separate files, an implementation file (the big one with the actual code) and a definition module, which held publicly visible constants, types, and function declarations. You compiled each of these 2 files separately; the definition first of course. What this gave you is that once you pinned down the external aspects of a module you were free to change the implementation part, and any other module that depended on it did not have to be recompiled when you change only the implementation file; just relink the program and execute. This goes way beyond compiled headers in C, because most of the time you change something in the implementation module, and don't modify the number or type of function parameters. This means recompilation of a 100k line program takes seconds. For small projects it is like having a REPL. There is a freeware Windows compiler (formerly the Stony Brook compiler) on the ADW website. This was the compiler i used for the WIndows side, and there is a small german firm P1 that made the Macintosh compiler.
Anyway by forcing you to constantly evaluate what symbols are public or private, and being able to check that every call has the correct precise type, a great many errors are caught at compile time. Modula-2 was targeting system programming; it had no graphical primitives, so I used Win32 API and on the Macintosh the QuickDraw system (for OS7). The way the language is structured, it drives you subtly towards a very modular type of coding style. You end up with various function libraries that tackle different tasks, and as your program gets larger you tend to make it even more modular and systematic. So it is a language that encourages virtue and a slightly lower exponent of expansion than C for example. When runtime checks are fully enabled in Modula-2 it puffs up the code by 30%, but that means you have tens of thousands of range checks, assignment compatibility, null pointer, etc. that are very helpful during testing. For golden master you turn them off and your program gets a big speed boost. Although i only got to speak with Prof. Wirth once, i consider myself a disciple of his Swiss school of programming which is all about neatness, economy, and rigor.
Modula2 as a language was damaged severely when Prof. Wirth made a sequel called Oberon, but in Oberon 1 he stripped out some very valuable features from Modula-2 and thus made it impossible for the Modula-2 users to move forward. This was not corrected until Oberon 2 and by that time the world has discovered the new panacea of OOP (a disaster IMHO), and Java ran away with the academic market. Modula2 did not have a good free compiler. Interestingly enough Logitech, the famous Mouse maker, was founded by a Swiss person, and they offered one of the first symbolic debuggers, which had the amazing feature that when your program crashed, it would save the entire state of memory and registers, and you could then browse the moment of the crash will full symbols. This post-mortem dump as it was called was a fantastic step forward over the memory dumps and very crude crash reporting systems of other languages.
I mention this because the single hardest feature of my Beads language is the ability to time travel debug post mortem from user submitted dumps. It is pretty easy on a huge development machine to support time travel debugging, but to do that in a shipping product in the customer hands, that is something you don't see often. It is the intermittent errors that are the hardest to debug in my experience, and recreating the exact conditions of the user can be often impossible. I think the biggest scandal in computers today is not the size of the code bases, because with enough sweat and blood you can get code pretty clean; what is embarrassing is that all the big companies have bug reports numbering in the hundreds of thousands if not millions of open cases that will never get fixed because the staff "cannot duplicate".