POP-2 (also referred to as POP2) is a
programming language
A programming language is a system of notation for writing computer programs. Most programming languages are text-based formal languages, but they may also be graphical. They are a kind of computer language.
The description of a programming ...
developed around 1970 from the earlier language POP-1 (developed by Robin Popplestone in 1968, originally named
COWSEL) by
Robin Popplestone and
Rod Burstall at the
University of Edinburgh
The University of Edinburgh ( sco, University o Edinburgh, gd, Oilthigh Dhùn Èideann; abbreviated as ''Edin.'' in post-nominals) is a public research university based in Edinburgh, Scotland. Granted a royal charter by King James VI in 15 ...
. It drew roots from many sources: the languages
LISP and
ALGOL 60, and theoretical ideas from
Peter J. Landin. It used an
incremental compiler
An incremental compiler is a kind of incremental computation applied to the field of compilation. Quite naturally, whereas ordinary compilers make a so-called clean build, that is, (re)build all program modules, an incremental compiler recompiles ...
, which gave it some of the flexibility of an
interpreted language
In computer science, an interpreter is a computer program that directly executes instructions written in a programming or scripting language, without requiring them previously to have been compiled into a machine language program. An interprete ...
, including allowing new function definitions at run time and modification of function definitions while a program was running (both of which are features of
dynamic compilation
Dynamic compilation is a process used by some programming language implementations to gain performance during program execution. Although the technique originated in Smalltalk,Peter L. Deutsch and Alan Schiffman. "Efficient Implementation of the ...
), without the overhead of an interpreted language.
Description
Stack
POP-2's syntax was Algol-like, except that assignments were the other way round: instead of writing
a := 3;
one wrote
3 -> a;
The reason for this was that the language had explicit notion of an ''
operand stack''; thus, the previous assignment could be written as two separate statements:
3;
which evaluated the value 3 and left it on the stack, and
-> a;
which popped the top value off the stack and assigned it to the variable 'a'. Similarly, the function call
f(x, y, z);
could be written as
x, y, z; f();
(commas and semicolons being largely interchangeable) or even
x, y, z.f;
or
(x, y, z).f;
Because of the stack-based paradigm, there was no need to distinguish between ''statements'' and ''expressions''; thus, the two constructs
if a > b then
c -> e
else
d -> e
close;
and
if a > b then
c
else
d
close -> e;
were equivalent (note the use of
close
, as
endif
hadn't become a common end-of-if-clause notation yet).
Arrays and doublet functions
There were no special language constructs for creating arrays or record structures as they are commonly understood: instead, these were created with the aid of special builtin functions, e.g
newarray(for arrays that could contain any type of item) an
newanyarrayfor creating restricted types of items.
Thus, array element and record field accessors were simply special cases of a ''doublet function'': this was a function that had another function attached as it
''updater'' which was called on the receiving side of an assignment. Thus, if the variable
a
contained an array, then
3 -> a(4);
was equivalent to
updater(a)(3, 4);
the builtin function
updater
returning the updater of the doublet. Of course,
updater
was itself a doublet and could be used to change the updater component of a doublet.
Functions
Variables could hold values of any type, including functions, which were first-class objects. Thus, the following constructs
function max x y; if x > y then x else y close end;
and
vars max;
lambda x y; if x > y then x else y close end -> max;
were equivalent.
An interesting operation on functions wa
''partial application'' (sometimes referred to as "
currying"). In partial application some number of the rightmost arguments of the function (which would be the last ones placed on the stack before the function is involved) were ''frozen'' to given values, to produce a new function of fewer arguments, which is a
closure of the original function. For instance, consider a function for computing general second-degree polynomials:
function poly2 x a b c; a * x * x + b * x + c end;
This could be bound, for instance as
vars less1squared;
poly2(% 1, -2, 1%) -> less1squared;
such that the expression
less1squared(3)
applies the closure of poly2 with three arguments frozen, to the argument 3, returning the square of (3 - 1), which is 4. The application of the partially applied function causes the frozen values (in this case 1, -2, 1) to be added to whatever is already on the stack (in this case 3), after which the original function poly2 is invoked. It then uses the top four items on the stack, producing the same result as
poly2(3, 1, -2, 1)
i.e.
1*3*3 + (-2)*3 + 1
Operator definition
In POP-2, it was possible to define new operations (operators in modern terms).
POP-2 Reference Manual
page 217, and An Introduction to the Study of Programming Languages, by David William Barron, page 75
vars operation 3 +*;
lambda x y; x * x + y * y end -> nonop +*
The first line declares a new operation +* with precedence (priority) 3. The second line creates a function f(x,y)=x*x+y*y, and assigns it to the newly declared operation +*.
History
The original version of POP-2 was implemented on an Elliott 4130 computer in the University of Edinburgh (with only 64KB RAM, doubled to 128KB in 1972).
POP-2 was ported to the ICT 1900 series
ICT 1900 was a family of mainframe computers released by International Computers and Tabulators (ICT) and later International Computers Limited (ICL) during the 1960s and 1970s. The 1900 series was notable for being one of the few non-American c ...
on a 1909 at Lancaster University by John Scott in 1968.
In the mid-1970s, POP-2 was ported to BESM-6
BESM-6 (russian: БЭСМ-6, short for ''Большая электронно-счётная машина'', i.e. 'Large Electronic Calculating Machine') was a Soviet electronic computer of the BESM series. It was the first Soviet second-generation ...
(POPLAN System).
Later versions were implemented for CTL Modular One, PDP-10
Digital Equipment Corporation (DEC)'s PDP-10, later marketed as the DECsystem-10, is a mainframe computer family manufactured beginning in 1966 and discontinued in 1983. 1970s models and beyond were marketed under the DECsystem-10 name, espec ...
, ICL 1900 series (running the George operating system). Julian Davies, in Edinburgh, implemented an extended version of POP-2, which he called POP-10 on the PDP-10 computer running TOPS-10
TOPS-10 System (''Timesharing / Total Operating System-10'') is a discontinued operating system from Digital Equipment Corporation (DEC) for the PDP-10 (or DECsystem-10) mainframe computer family. Launched in 1967, TOPS-10 evolved from the earlie ...
. This was the first dialect of POP-2 that treated case as significant in identifier names, used lower case for most system identifiers, and supported long identifiers with more than 8 characters.
Shortly after that, a new implementation known as WPOP (for WonderPop) was implemented by Robert Rae and Allan Ramsay in Edinburgh, on a research-council funded project. That version introduced caged address spaces, some compile-time syntactic typing (e.g. for integers and reals) as well as some pattern matching constructs for use with a variety of data-structures.
In parallel with that Steve Hardy at Sussex University implemented a subset of POP-2, which he called POP-11
POP-11 is a reflective, incrementally compiled programming language with many of the features of an interpreted language. It is the core language of the Poplog programming environment developed originally by the University of Sussex, and recentl ...
which ran on a DEC PDP-11/40 computer. It was originally designed to run on the DEC operating system RSX-11D, in time-shared mode for teaching, but that caused so many problems that an early version of Unix
Unix (; trademarked as UNIX) is a family of multitasking, multiuser computer operating systems that derive from the original AT&T Unix, whose development started in 1969 at the Bell Labs research center by Ken Thompson, Dennis Ritchie, an ...
was installed and used instead. That version of Pop-11 was written in Unix assembler, and code was incrementally compiled to an intermediate byte code which was interpreted. That port was completed around 1976 and as a result Pop-11 was used in several places for teaching. In order to support its teaching function many of the syntactic features of POP-2 were modified, e.g. replacing function ... end with define ... enddefine and adding a wider variety of looping constructs with closing brackets to match their opening brackets instead of the use of close for all loops in POP-2. Pop-11 also introduced
pattern matcher
for list structures, making it much easier to teach AI programming.
Around 1980 Pop-11 was ported to a VAX-11/780
The VAX-11 is a discontinued family of 32-bit superminicomputers, running the Virtual Address eXtension (VAX) instruction set architecture (ISA), developed and manufactured by Digital Equipment Corporation (DEC). Development began in 1976. In ...
computer by Steve Hardy and John Gibson, and soon after that it was replaced by a full incremental compiler (producing machine-code instead of an interpreted intermediate code). The existence of the compiler and all its subroutines at run time made it possible to support far richer language extensions than were possible with Macros, and as a result Pop-11 was used (by Steve Hardy, Chris Mellish and John Gibson) to produce an implementation of Prolog
Prolog is a logic programming language associated with artificial intelligence and computational linguistics.
Prolog has its roots in first-order logic, a formal logic, and unlike many other programming languages, Prolog is intended primarily ...
, using the standard syntax of Prolog, and the combined system became known as Poplog
Poplog is an open source, reflective, incrementally compiled software development environment for the programming languages POP-11, Common Lisp, Prolog, and Standard ML, originally created in the UK for teaching and research in Artificial I ...
, to which Common Lisp and Standard ML were later added. This version was later ported to a variety of machines and operating systems and as a result Pop-11 became the dominant dialect of POP-2, still available in the Poplog system.
Around 1986 a new AI company Cognitive Applications Ltd., collaborated with members of Sussex university to produce a variant of Pop-11 called AlphaPop running on Apple Mac computers, with integrated graphics. This was used for a number of commercial projects, as well as being used for teaching AI programming in several universities. The fact that it was implemented in an early dialect of C, using an idiosyncratic compiler made it very hard to maintain and upgrade to new versions of the Mac operating system. In addition to this, AlphaPop was not "32-bit clean" due to the use of high address bits as "tag bits" to signify the type of objects, which was incompatible with the use of memory above 8Mb on later Macintoshes.
See also
* POP-11
POP-11 is a reflective, incrementally compiled programming language with many of the features of an interpreted language. It is the core language of the Poplog programming environment developed originally by the University of Sussex, and recentl ...
programming language
* Poplog
Poplog is an open source, reflective, incrementally compiled software development environment for the programming languages POP-11, Common Lisp, Prolog, and Standard ML, originally created in the UK for teaching and research in Artificial I ...
programming environment
References
;General
*
*
*
POP references
;Inline
{{reflist
External links
Computers and Thought: A practical Introduction to Artificial Intelligence
An Introduction to the POP-2 Programming Language, by P. M. Burstall and J. S. Collins. POP-2 Reference Manual, by P. M. Burstall and J. S. Collins.
Functional languages
History of computing in the United Kingdom
Programming languages
Programming languages created in 1970
Science and technology in Edinburgh
University of Edinburgh