When I was at Digital, I did a little bit of maintenance work in a language called Bliss. Like C, Bliss was a low-level high level language. It was designed for systems programming (for example, implementing parts of VAX/VMS). It had a strange macro facility which I don’t remember anything about, and was typeless: you dealt with memory layout similarly to how you would in assembler. The defining characteristic, though, was its use of variable names.
In most languages, what a variable name means depends on where it is used, but in a subtle way that programmers typically don’t even realize. For example, in this C statement:
a = b;
The “a” means the address of the variable a, and the “b” means the value of the variable b. The statement means: take the value of b, and store it in a.
Bliss didn’t make this distinction. For uniformity, variable names meant the same thing everywhere. And since the left-hand side of the assignment operator needed the address of a variable, that’s what variable names meant everywhere. To get the value at an address, you used the dot operator, which is the equivalent of C’s * operator. So in Bliss, the above statement would be written:
a = .b;
The most common error in Bliss was forgetting a dot. “a = b” meant store the address of b in a. Dealing with pointer variables meant double dots:
val = ..pVal;
What a headache. If you are really curious, the Bliss Reference Manual is online.