Multics > People > Stories
25 Mar 2001

Cryptic Messages from Antiquity

C. D. Tavares

A long, long time ago, there was Multics -- one of the very first computer operating systems to be written in anything more sophisticated than machine or assembly language.

Multics was written in PL/I -- a higher-level language that combined the computational features of FORTRAN with the string and structure-handling features of COBOL. PL/I featured some truly powerful data-handing capabilities for its time. It wasn't until almost 40 years later that the C family of languages escaped the limiting paradigm trap that "real data items fit in registers, and anything that doesn't fit in a register must be treated by the programmer as a pointer to things that do" -- yet PL/I avoided such limits from day one.

Of course, implementing that sort of power was a tall order for the software and the software engineers of the 1960s, when "human interface standards" weren't even on the top ten list of most code hackers. It was tough enough getting a PL/I compiler to work properly without also holding the hands of the engineers (and students) who were trying to use it.

As a result, submitting a less than perfect program to the early PL/I compiler (and who never did?) could often result in error diagnostics that were inscrutable, frightening, unduly pedagogical, or sometimes even downright arrogant.

Here are some of my favorites.

Never trust a compiler that eats your source file.

105. The statement has been truncated.

120. An identifier or constant has been truncated.

149. Text was deleted from this statement.

If at first you don't succeed...

37. The picture attribute does not seem to be followed by a picture. Processing of the declaration of <foo> has been terminated.

38. Multiple picture attributes have been specified for <foo>. Processing of this declaration has been terminated.

85. Implementation restriction: The picture attribute can not be processed by this version of the compiler. The picture attribute has been used in the declaration of <foo>.

Lucy... you got a lotta esplainin' to do...

209. Conflicting abnormality attributes have been specified for <foo>.

46. Implementation restriction: Fixed point division is not implemented by this version of the compiler. Use the divide built-in function to perform integer division. The only acceptable form of the divide built-in function is divide(j,k,p,0), where j is the dividend, k is the divisor, and p is a constant giving the desired precision of the quotient.

149. Implementation restriction: The "stringrange" on-condition can not be enabled when the "substr" pseudo-variable is used. Note that this restriction does not apply to the "substr" built-in function.

Lucy... aw, never mind.

176. Implementation restriction: This program contains a declaration which contains an expression. Within the expression a string or substr built-in function is used. For reasons which are too difficult for me to explain the compiler is unable to create a valid argument descriptor for the variable when it is passed as an argument. Either remove the offending built-in function from the declaration or do not pass the variable as an argument to an entry which requires descriptors.