BLISS
| Company type | Programming language |
|---|---|
| Industry | Software, Systems programming |
| Founded | 1970 |
| Founder | W. A. Wulf, D. B. Russell, A. N. Habermann |
| Headquarters | Pittsburgh , United States |
| Products | BLISS compilers (BLISS-10, BLISS-11, BLISS-16, BLISS-32, BLISS-36, BLISS-64) |
BLISS is a system programming language created at Carnegie Mellon University around 1970 by W. A. Wulf, D. B. Russell, and A. N. Habermann. It was recognized as a prominent system language until C emerged and surpassed it in widespread use. Initial discussions at Bell Labs often contrasted the advantages of BLISS with those of C.
As a typeless and block-structured language, BLISS emphasizes expressions over statements. It includes features such as exception handling, coroutine support, and macros, while deliberately omitting the goto command.
The acronym BLISS has been variously expanded as Basic Language for Implementation of System Software or System Software Implementation Language, Backwards. Nevertheless, Wulf clarified that its original meaning was "Bill's Language for Implementing System Software."
The CMU-developed compiler for BLISS gained attention due to its advanced optimization techniques and served as the foundation for the influential publication The Design of an Optimizing Compiler.
Digital Equipment Corporation (DEC) produced and supported BLISS compilers across multiple hardware platforms, including the PDP-10, PDP-11, VAX, PRISM, MIPS, DEC Alpha, and Intel's IA-32. Although BLISS adoption among DEC's customer base remained limited, it was extensively utilized internally throughout the 1980s; notably, the majority of utility programs within the OpenVMS operating system were implemented in BLISS-32. During transitions to new OpenVMS platforms, the DEC BLISS compiler was ported to IA-64 and x86-64 architectures. The x86-64 variant uses the LLVM framework as its backend code generator, replacing the proprietary GEM backend formerly employed for Alpha and IA-64 processors.
Language description
BLISS is characterized by several distinctive features:
- All constants correspond exactly to the machine word size (for instance, 16 bits on the PDP-11, 32 bits on the VAX, and 36 bits on the PDP-10).
- When referring to variables, their address is returned; to access their stored value, a period prefix is required (e.g.,
.Z+8computes eight added to the content of Z). - Assignments use
=to store constants at specific memory locations (for example,Z=8assigns 8 to Z's address, whileZ+12=14stores 14 twelve words beyond Z's address). - Blocks are structured similarly to ALGOL, using either
BEGIN/ENDor parentheses, with statements separated by semicolons and following conventional operator precedence. - Conditional logic employs the
IFexpression, which evaluates conditions, executes actions accordingly, and produces a result. - Comparison operators are expressed through keywords such as
EQL(equal),GTR(greater than), andNEQ(not equal). For instance:
Q = (IF .Z GTR 0 THEN .Z ELSE -.Z);
- Identifiers must be declared in advance using
OWN; variables may be associated with fixed hardware addresses viaBIND, enabling direct manipulation of registers or special memory locations. - Subroutines are defined as routines using the keyword
ROUTINE. - Text substitution macros are introduced with
MACRO. - Arrays—referred to as structures—are declared through
VECTOR. - Advanced language constructs include:
- Multiple execution branches via
CASE - Looping mechanisms provided by the
INCRexpression, analogous to ALGOL's FOR loop - Built-in functions for string manipulation
- Automatic conversion between data types such as numbers and strings
- Multiple execution branches via
Source example
Presented below is a direct excerpt from the Bliss Language Manual:
<syntaxhighlight lang=text> MODULE E1 (MAIN = CTRL) = BEGIN FORWARD ROUTINE
CTRL, STEP;
ROUTINE CTRL = !+ ! This routine reads an input value, processes it, and ! subsequently produces the output. !-
BEGIN
EXTERNAL ROUTINE
GETNUM, ! Reads a number from the terminal
PUTNUM; ! Writes a number to the terminal
LOCAL
X, ! Variable for input value storage
Y; ! Variable for output value storage
GETNUM(X);
Y = STEP(.X);
PUTNUM(.Y)
END;
ROUTINE STEP(A) = !+ ! This routine increments the provided value by 1. !-
(.A+1);
END ELUDOM </syntaxhighlight>
Versions
- BLISS-10 variant:
- BLISS-10 - CMU's native compiler designed for the PDP-10 platform
- BLISS-11 variant:
- BLISS-11 - CMU's cross compiler hosted on PDP-10 targeting the PDP-11
- Common BLISS variants (used by DEC compilers):
- BLISS-16 - Cross compiler hosted on VMS for PDP-11 systems
- BLISS-16C - Translator on PDP-10 converting a subset of Common BLISS to BLISS-11
- BLISS-32 - Native compiler running on VAX/VMS
- BLISS-36C - Translator on PDP-10 converting a subset of Common BLISS to BLISS-10
- BLISS-36 - Native compiler for the PDP-10 architecture
- BLISS-64 - Native compiler created for Alpha/AXP systems
References
- Wulf, W. A.; Russell, D. B.; Habermann, A. N. (December 1971). "BLISS: A Language for Systems Programming". Communications of the ACM. 14 (12): 780–790.
- Wulf, W. A.; Johnson, R. K.; Weinstock, C. B.; Hobbs, S. O.; Geschke, C. M. (1975). The Design of an Optimizing Compiler. New York: Elsevier. ISBN 0-444-00158-1.
- Brender, Ronald F. (2002). "The BLISS programming language: a history". Software: Practice and Experience. 32 (10): 955–981.
External links
- BLISS Manual at DECUS
- Lehotsky, Alan; a post about BLISS at DEC
- Madison, Matthew D.; Session notes for "Introduction to BLISS" (PostScript)
- BLISS Primer (1978)