IMP (programming language)
|Paradigms||Multi-paradigm: procedural, imperative, structured, extensible|
|Designed by||Edgar T. Irons|
|Developer||National Security Agency|
IMP72 / 1972
|Typing discipline||Static, strong|
|Implementation language||ALGOL 60|
|Platform||CDC 6600, Cray, PDP-10, PDP-11|
|OS||COS, SCOPE, TOPS-10, Unix, others|
|IMP65, IMP70, IMP72|
IMP is an early systems programming language that was developed by Edgar T. Irons in the late 1960s through early 1970s, at the National Security Agency (NSA). Unlike most other systems languages, IMP supports syntax-extensible programming.
Even though citation needed], IMP excludes many defining features of that language, while supporting a very non-ALGOL-like one: syntax extensibility.[
A compiler for IMP existed as early as 1965 and was used to program the CDC 6600 time-sharing system, which was in use at the Institute for Defense Analyses since 1967. Although the compiler is slower than comparable ones for non-extensible languages, it has been used for practical production work.
Extensible syntax in IMP72
Being an extensible syntax programming language, IMP allows a programmer to extend its syntax, although no specific means are provided to add new data types or structures to it. To achieve its syntax-extensibility, IMP uses a powerful parse algorithm based on a syntax graph and several connectivity matrices. The programmer may add new Backus–Naur form (BNF) productions to the graph.
IMP72's syntax is extended by means of extended-BNF syntax statements included in a source code program. The mechanism is so powerful, that it allowed the implementation of the language by itself, i.e., by an IMP72 source file consisting entirely of syntax statements, which was input to a trivial compiler which was initially able to translate the simplest case of the syntax statement. There is also a simple form of the syntax statement which looks like a macro to the casual user.
Basically, the syntax statement is an augmented BNF production with associated semantics added on the right:
<class> ::= syntax-part ::= semantic-part
For example, to add the construct described by the following BNF:
<EXP> ::= INCREMENT <VBL>
with the semantics that
INCREMENT V should translate to
V ← V + 1, the programmer would only need to insert the following IMP statement:
<EXP> ::= INCREMENT <VBL,A> ::= "A←A+1"
The semantic-part can also contain calls to semantic routines, as in the following syntax statement:
<ATOM> ::= ABS ( <ATOM,A> ) ::= DEWOP(214B,AREG1(1,13),A)
The semantic part of this statement consists of a call on the semantic routine
DEWOP. The arguments are the octal constant
214B, the semantic routine call
A, which is the object on top of the stack at the moment this production is invoked.
DEWOP is a semantic routine which respectively takes as its arguments a PDP-10 machine language opcode, a register object, and any other object, and produces an object whose value is the result of executing the designated machine instruction using as address field the object which is its last argument. In this example, the opcode
214B designates the
Load Magnitude instruction, and thus the result of the above syntax statement will be to compile code to compute the absolute value of
Folklore operating system
- Edinburgh IMP language (contrast)
- Cotter, George. "High-Performance Computing at the National Security Agency". Frontiers of Supercomputing II. University of California Press. Retrieved 25 May 2012.
- Irons, Edgar T. (January 1970). "Experience with an Extensible Language". Communications of the ACM. Association for Computing Machinery. 13 (1): 31–40. doi:10.1145/361953.361966. S2CID 17635545.
- Bilofsky, Walter (May 1974). "Syntax Extension and the IMP72 Programming Language". SIGPLAN Notices. Association for Computing Machinery. 9 (5): 13–30. doi:10.1145/987413.987416. S2CID 2170981 – via Yale University.