powell@decwrl.UUCP (10/21/83)
From: Mike Powell <powell> The following are some brief opinions of mine about Modula-2. Since the good things are commonly believed, I won't elaborate on them. I will offer terse explanations of why the bad and questionable things are so. Note that I do not expect the language to be my dream language. I just want a language that looks like we learned something in the 10 years since Pascal. For a description of Modula-2, see Wirth's book, published by Springer-Verlag. Good things: Most of Pascal's problems have been fixed: No more begin/end idiocy; A loop-and-a-half is easy with the LOOP/EXIT; Procedure variables; VAL (like chr for enumerations); Allows multiple occurrences of CONST, TYPE, VAR, and PROCEDURE declarations; Some forward referencing allowed; ELSE on case; Some Pascal things were dumped, and good riddance: Untyped set expressions; strange I/O; label declarations and goto's; Some new things: MODULES AND SEPARATE COMPILATION! Explicit imports and exports; Type coercion; Co-routine mechanism; Open array parameters; Bad things: Keywords and standard identifiers in UPPER CASE; Do I really need identifiers such as If, iF, and if, or real, Real, ReAl, etc.? Putting words such as IF in upper case emphasizes them visually all out of proportion to their importance. Case should be ignored in language-defined tokens. String constants; Why allow either 'xxx' or "xxx"? Simply to allow '"' and "'"? This problem was solved long ago -- either allow doubling of the quote mark, or introduce a meta-character. Also, the one-character-string dilemma of (most implementations of) Pascal is retained in Modula-2. The C solution is better, but, since Modula-2 will assign a (multi-character) string constant to a character array of larger size, why not do the same thing for single-character strings? No set-former expressions; Since the type is known (specified or assumed) for all set expressions, why not allow, as Pascal did, expressions in set-formers? In Pascal, expressions caused problems when the set type wasn't known, but Modula-2 fixed that. Questionable things: Cardinal data type; The cardinal type itself is not bad, but the fact that non-negative subranges have cardinal (not integer) as their base type, coupled with the fact that cardinals and integers cannot be mixed in expressions, means means that i * j, where i : [0..10]; j : [-5..5], is illegal. Cardinal arithmetic is also MORE difficult on many machines, rather than easier as is claimed by Wirth. It would make more sense to say that only those subranges with upper bound > MAXINT would be of base type cardinal. Exercise for the unconvinced: write a code template for the loops for i := 10 to 0 by -1 do ... end; for i := 10 to 0 by -3 do ... end; where i is cardinal (Don't cheat by assuming 10 and 0 are constants). What is needed is a positive integer type, which takes on values in [0..MAXINT]. This would be used most of the time. Cardinal would be reserved for whole-word unsigned arithmetic and address calculations, would not be allowed as a for loop index, and might be more expensive to multiply and divide. No (reasonable) standard for I/O; I guess it is better not to do something than to do it wrong, but it will be difficult to have even vaguely portable programs without an I/O facility. It's hard to explain why output, at least, is not defined, since Pascal's solution worked well. In the absence (and even presence) of overloaded procedures, the procedure-call-per-item method is annoyingly verbose. Opaque types; Some data abstraction is better than none. Opaque types work for many common cases, so I can't complain about them. Yet for epsilon more mechanism, opaque types could have supported multi-word types. Summary: I give it a B+ (Of course, if Wirth were an undergraduate, he would get an A+, but he should be able to do better). Epilogue/Sequel: I have implemented a compiler for the VAX and, although (I think) it abides by the rules when you ask it to do so, I have relaxed some restrictions in some areas. More details will be forthcoming. Meanwhile, I am interested in hearing opinions about features of Modula-2, and compilers that may take liberties with the language. Michael L. Powell DEC Western Research Lab decvax!decwrl!powell