IMP is an "ALGOL-like" high-level language that was originally [1966-1970?] designed as the implementation language for the Edinburgh Multi-Access System, developed at Edinburgh University. It was widely used at Edinburgh University for implementing systems, teaching programming and as a general purpose programming language on many different machines. (http://imp.nb-info.co.uk/index.htm
Despite heavy use there, it did not see significant commercial adoption.
The EMAS general purpose time-sharing system is notable for being coded entirely in IMP.
THE IMP-77 LANGUAGE (reference manual): http://imp.nb-info.co.uk/imp77.pdf
Article on Imp from The Computer Journal, Volume 17, Issue 3, pp. 216-223, http://history.dcs.ed.ac.uk/history/ImpLanguageAndCompiler
A new code generator for Imp on the Intel platform has been developed by the Edinburgh computer history project using the original Skimp bootstrap method. A translator to C has also been written which covers 90% of the language.
The Algol-60-like language 'Imp' from Edinburgh University (a descendant of Atlas Autocode, which itself was ported from the Atlas to the KDF-9) was a high-level language used initially for operating system coding, and later for applications - just like C, but predating it by several years.
- Web searching gives the impression that Atlas Autocoder ("on which Imp was based") predated C by several years (1966), but that ImpLanguage did not, unless I overlooked something in the material I just provided above. Please find some supporting evidence for that.
-- The KDF-9 compiler was written in 1966 as a port of the Atlas compiler. The Imp language manual was issued
in 1970, the same year as the ICL4/75 Imp compiler which was written entirely in Imp. Somewhere between those dates, and still to be confirmed, was an ICL compiler for Imp which was written in the older embedded-machine-code style. There was no firm line when the language stopped being AA and became Imp - it was discussed as
the new language for systems implementation in the EMAP papers from 1966 onwards and may have gradually morphed from AA to Imp over those years. The name change was definite by 1970, but the language change was a continuum from 1966 to 1970. One could reasonably argue that the 1966 KDF-9 Atlas Autocode compiler was actually the first Imp compiler, as it had already started incorporating Edinburgh language modifications which did not exist in Brooker's Atlas implementation.
Imp was widely ported to systems as diverse as the KDF-9, ICL4-50,4-75/IBM360,370/Amdahl V7, ICL1900, ICL2900, Modular 1, Univac 1108, IBM 7090, CDC Cyber, PDP-9/PDP-11/PDP-15/DEC-10, Interdata 32 series, Perkin-Elmer 3220, Sparc/SunOS, Acorn ARM/Archimedes [AcornArchimedes
], NS32000/Acorn Panos, Transputer, Ferranti DISC, Argus 700, Z80, 6809, (some HP calculator that has been forgotten), MTS, 68000, Sequent Symmetry, and finally Intel 386.
- Sounds like you know a fair amount about it, and it's interesting that it was ported so widely; can you give a reference?
-- we're collecting all the references and oral history on the Edinburgh Computer History Project website, at http://history.dcs.ed.ac.uk/
- you are also welcome to email me directly at firstname.lastname@example.org if there are some specifics you would like to know.
I note from a cursory reading, that Imp supports the "natural" reversed if
syntax; seen, for example, in DEC's Basic Plus and also Perl. Is this perhaps the first language to have this form?
(I am thinking of the construct which makes sense of: x := x/y if
y != 0)
-- Imp inherited that from AA and I suspect it was common in the earlier Autocodes. It was also used in another Edinburgh language, HAL (High-level Assembly Language). One trick used in HAL to keep the compiler short was that the 'reversed if' syntax was also valid after the REPEAT keyword of a CYCLE ... REPEAT, so whereas AA would have "%until condition %cycle; ...; %repeat" and Imp would have the functionally identical "%cycle; ...; %repeat until <condition>", HAL went for the reversed condition by saying "CYCLE ... REPEAT IF <condition>"