A post on Tim Bray's ongoing blog got me thinking about programming languages. I love programming languages--they're so much easier to pick up than natural languages! Plus, they keep getting better in one way or another, so there's always a reason to switch once in a while. And once in a while I do switch. Over nearly four decades of programming I've written significant amounts (i.e. thousands of lines) of code in at least: Fortran, Snobol-4, PL/I, BLISS, SAIL, PUB, Sigma Assembler, Pascal, APL, Forth, TAL, C, C++, Ada, Awk, Perl, TeX, Metafont, TCL, Java, JavaScript, XSLT, and Python. In addition I've implemented interpreters or compilers for Forth, Metafont, Lisp and PostScript, so over the years I've had quite a bit of exposure to several languages at a variety of levels.
Everyone talks about what they do or don't like about Ruby, Python, and Java, so instead I thought I'd occasionally write a bit about languages everyone seems to have forgotten. I'll start with BLISS, which I used as a research assistant working for Martha Williams in her Information Retrieval Research Laboratory at the Coordinated Science Laboratory at the University of Illinois.
BLISS (Basic Language for Implementing System Software) was a 'high level assembly language' for the PDP-10. People often say that about C, but that's because they've never seen the real thing. In BLISS, the machine did what you told it to. No more, no less. An identifier represented an address. If you wanted the contents of the address you put a dot in front of it, so assigning the value of 'b' to 'a' would look something like:
a ← .b
Don't type 'a ← b' unless you mean it; that would assign the address of b to a. Very simple and straight forward, but there wasn't much (any?) context-sensitive 'syntactic sugar' in BLISS. This used to drive some people crazy, and they'd give up after creating a mess they couldn't straighten out. On the other hand, you could do things like .(x+.y) to extract the contents of an offset address, or ..x for indirection. It was very easy to get your dots wrong.
Since you knew exactly what sort of instructions BLISS was going to produce, it was easy to mix in assembler. This was pretty neat, giving you access to all the bit and byte twiddling instructions the PDP-10 was famous for, and which most languages completely ignored and isolated you from (although BLISS had ways to do a lot of that sort of thing within the language too).
The BLISS I used (and I think the original) was later called 'BLISS36' or 'BLISS-10', since it ran on the 36-bit word PDP-10 (you had a choice on how many bytes were in that word). There was evidently a 'Common BLISS', but I never had any contact with it. BLISS-10 made no attempt to be machine independent.
I've still got an official decsystem10 BLISS-10 Programmer's Reference Manual for Version 4 published by DEC in 1974, although it doesn't look used, so I must have been working from an earlier edition most of the time. I think page 1-1 is worth reproducing:
CHAPTER 1
LANGUAGE DEFINITION
1.1 AN EXPRESSION LANGUAGE
The programming language BLISS-10 enables programmers (persons who converse in a programming language) to construct text (programs) which evoke computations to transform input into a desired result. Programs written in BLISS-10 consist of declarations, which establish structure, and expressions sequenced to compute results. Expressions in BLISS-10 can assume remarkably complex forms built up from elementary forms; but regardless of their complexity every expression computes a value. This notion, that a BLISS-10 program consists solely of declarations and expressions, and that these expressions can become arbitrarily complex yet compute a single value during the execution of the program, represents a key concept the reader must understand to properly construct programs in BLISS-10 and fully exploit its power. The concept of a statement prevalent in many programming languages has no meaning in BLISS-10. In reading this manual the reader should strive to master the implications and meaning of the following statement:
BLISS-10 is an expression language.
Once in a while I miss that in Python. A consequence of this was no go-to's in BLISS. Instead of 'go-to', the original BLISS had 8 different 'escape' instructions to break different types of control structures, but by the time I used it you could label expressions and use that label to break out of them.
BLISS also had coroutines, which I tried out and remember thinking were neat. I'm still waiting for just the right application for coroutines.
BLISS was developed by W. A. Wulf at CMU who was involved in a number of programming language activities there. You may have heard of HYDRA and Tartan Laboratories which he led. I still fondly recall Harbison & Steele's C, a reference Manual that came out of that work. Work on BLISS started in 1969 or 1970, possibly slightly before C began at Bell Labs, so the idea of a language suitable for writing systems software was being discussed, but was far from an accepted idea at the time.
References:
W.A. Wulf, BLISS reference manual :
a basic language for implementation of system software for the PDP-10 /, 1971.
"BLISS: A Language for Systems Programming", W. A. Wulf et al, CACM 14(12):780-790 (Dec 1971).
BLISS-10 Programmer's Reference Manual DEC-10-LBRMA-A-D, Digital Equipment Corporation, Maynard, MA. 1974.
--Th