XPL0 is a computer programming language that is essentially a cross between Pascal and C. It looks somewhat like Pascal but works more like C. It was created in 1976 by Peter J. R. Boyle who wanted a high-level language for his microcomputer and wanted something more sophisticated than BASIC, which was the dominant language for personal computers at the time.
XPL0 is based on PL/0, an example compiler in the book Algorithms + Data Structures = Programs by Niklaus Wirth. The first XPL0 compiler was written in ALGOL. It generated instructions for a pseudo-machine that was implemented as an interpreter on a Digital Group computer based on the 6502 microprocessor. The compiler was converted from ALGOL to XPL0 and was then able to compile itself and run on a microcomputer.
Since those early years XPL0 has been implemented on a dozen processors, and many features have been added. There are now optimizing native code compilers with 32-bit integers in place of the original 16-bit versions. Open source compilers for Windows and MS-DOS on PCs and Linux on the Raspberry Pi are available from the link below.
This is how the traditional Hello World program is coded in XPL0:
code Text=12; Text(0, "Hello World!")
Text is a built-in routine that outputs a string of characters. The zero (0) tells where to send the string. In this case it is sent to the display screen, but it could just as easily be sent to a printer, a file, or out a serial port by using a different number.
In XPL0 all names must be declared before they can be used. The command word code associates the name Text to built-in routine number 12, which is the one that outputs strings. There are about a hundred of these built-in routines that provide capabilities such as input and output, graphics, and trig functions.
The 32-bit versions of the compilers automatically insert code declarations, thus the program above can simply be written as:
Text(0, "Hello World!")
The TPK algorithm provides an example that can be compared to other languages:
func real F(T); real T; return sqrt(abs(T)) + 5.*Pow(T, 3.); int I; real Y, A(11); [for I:= 0 to 10 do A(I):= RlIn(0); for I:= 10 downto 0 do [Y:= F(A(I)); if Y > 400. then [IntOut(0, I); Text(0, " TOO LARGE")] else [IntOut(0, I); RlOut(0, Y)]; CrLf(0); ]; ]
Graphics has been a feature of XPL0 since its days on the Apple II computer.
int X, Y, Color; [SetVid($101); \set video mode to 640x480x8 repeat for Y:= 0 to 128-1 do for X:= 0 to 128-1 do Point(X, Y, X or Y xor Color); Color:= Color+1; DelayUS(50_000); \0.05 seconds until ChkKey; ]
- Fish, Larry (February 1979). "A Block-Structured Language for Microcomputers". Kilobaud, p. 24.