treated as an address from which a variable is fetched, or to which a variable is stored, according to the context of the call. Mapping functions thus enable symbolic names to be given to areas of storage outside the normal stack area allocated to the program. The pre-declared mapping functions: integer (I) real (I) string (I) shortinteger (I) longreal (I) record (I) byteinteger (I) are used to access a variable of the corresponding type whose address is given by the integer expression I. These functions are often used in conjunction with pointer variables. e.g. On the ICL 4-75 the word whose address is 72 is the Channel Address Word. To access this it is necessary to code: integername caw caw == integer (72) Hereafter, any reference to caw accesses the Channel Address Word. The function: addr (v) can be used to obtain the address of an IMP variable and the special mapping function: array can be used to map arrays on to data files. The mapping of arrays and records is a powerful and widely used facility which is very similar in effect to PL/I's 'BASED STRUCTURE'. Machine code It is possible to write assembly code at any point within an IMP program although, naturally, this is strongly discouraged. All the instructions are available and IMP variables and labels may be used. This seemed preferable to providing special functions to permit Supervisor to use the privileged instructions. The presence of assembly code served also to reassure those who are certain that a high level language is too 'inefficient' for a supervisor program. Punching conventions To facilitate punching on terminals or on cards, % character is reserved as a shift character to indicate that the following word is underlined. Statements are terminated by a semi-colon or by a newline. Consequently, if a statement is to occupy more than one line, all lines except the last are terminated by the continuation symbol e. Spaces and superfluous terminating characters are ignored (except within string constants). The " (double quotes) character is not used within the language and is used by EMAS Director (Rees, 1973) as a delete character when accepting input from a terminal. Comments may be inserted by means of: comment [text] or ! [text] The Atlas Autocode fault statement: fault [list of error conditions] → label has been retained. Its effect is to intercept non-catastrophic errors and to restart the program from the specified label. If a fault occurs which has not been trapped, execution of the program ceases and a stack post mortem is output. An example of such a termination is given in Appendix I. The unconditional instruction monitor can be placed at any point in the program. Its effect is to obtain a post mortem print without otherwise disturbing execution of the program. Language facilities withdrawn It may be of interest to comment on three features of the original IMP specification which have been discontinued 1. Arrays of pointer variables e.g. Integer name array na (1:50). Name arrays hold the addresses of variables assigned using the address assignment operator ==. These inoffensive variables proved of little use and were dropped. 2. Routine variables These were provided in an attempt to extend the routine parameter mechanism. Declarations took the form routine name r routine name array ra (1:m) Routines could be assigned to routine variables e.g. ra(1) == select input ra(2) == select output and finally a statement of the form ra(i) (k) calls the routine that was last assigned to ra(i) passing k as a parameter. To enable the call to be compiled, it was necessary to restrict the routines assigned to routine variables to ones having the same parameter structure. It was further necessary to ensure that all routines assigned were global to the routine variable declarations—otherwise calls could be made on routines when their global variables were not present on the stack. These restrictions emasculated what appeared to be an interesting facility. 3. Dynamic formats The early IMP compilers allowed arrays in record formats to have dynamic bounds. This meant that format statements had run time significance and that a dope-vector was required with each format. The price in execution time was judged to be too high for the advantages provided. Compiler restrictions The current EMAS compiler imposes two restrictions on the language described. (a) The static depth of nested blocks must not exceed eleven levels of which not more than five may be routine ... end groupings. (b) Own arrays, switches, and arrays within record formats are restricted to one dimension only. Compiler diagnostic facilities The compiler can operate in checking or optimising mode, the former being the default. In checking mode, additional instructions are planted to ensure that: (a) No variable is used before a value has been assigned to it. (b) All references to array elements are within the declared bounds. (c) No truncation takes place when assigning to variables of type byte integer, short integer or string. (d) Overflow is tested at every stage of every arithmetic operation. (e) Any cycle of the form cycle i = p, q, r will terminate. (f) Every switch label is set. (g) The source line which corresponds to the object code currently being executed is known. (h) Pointers are maintained to ensure a useful post-mortem can be produced in source language terms.