BLISS

BLISS は1970年ごろ、カーネギーメロン大学の W. A. Wolf、D. B. Russel、A. N. Habermann が開発したシステム用プログラミング言語である。数年後にC言語が登場するまでは、システム記述に最も適した言語とされていたが、C言語に取って代わられた。C言語が登場した当初、ベル研究所では BLISS と C のどちらがよいかという議論が行われた。
BLISS はデータ型のないブロック構造方式の言語であり、文ではなく式を基本構成要素とし、例外処理構文、コルーチン構文、マクロなどを備えている。goto文は持たない。
その名称の由来には諸説あり、"Basic Language for Implementation of System Software" の略だとか "System Software Implementation Language, Backwards" の略（書かれている通りに逆転させる）だとか言われている。開発者の Bill Wolf の名前から "Bill's Language for Implementing System Software" とも言われる。
カーネギーメロンで開発されたコンパイラは最適化を多用していることで知られ、その開発を元に古典的著作 "The Design of an Optimizing Compiler" が生まれた。
DECは、PDP-10、PDP-11、DEC Alpha、Itanium、VAX 向けにBLISSコンパイラを開発しており、1980年代には社内でも多用していた。VMS オペレーティングシステムのユーティリティプログラムの多くは BLISS-32 で書かれていた。
概要.
以下の記述は、DECが1987年に出版した Bliss Language Manualにあるもの（を翻訳したもの）である。
定数には必ず、そのマシンのフルワード長が使われる。例えば、PDP-11のような16ビットマシンなら、定数は16ビットである。VAXでは、定数は32ビットとなり、PDP-10では36ビットとなる。
変数の参照は常にその変数のアドレスとなる。例えば、codice_1 という命令は、Z の「アドレス」に 8 を加えることを意味し、「値」への加算ではない。Z の「値」に 8 を加算したい場合、変数名の前にピリオドを付け、codice_2 としなければならない。
代入は = 記号で行われる。例えば codice_3 と書けば、8 を格納したフルワード定数が生成され、それが Z に対応したアドレス位置に格納される。従って、codice_4（あるいは codice_5）と書いた場合、定数 14 を Z のアドレスに12を加えた位置に置くことになる（悪い書き方の例）。
ブロックは ALGOL のものと似た構文であり、BEGIN と END で囲まれた部分がブロックとなる。文はALGOLと同様、セミコロン ";" で区切られる。文（式）の値が計算されると、それが次の文の終端まで保持される。つまり、計算されたり代入されたりした値は次の文の評価中も保持される。一方、ブロックを括弧で表す場合もある。式の中の括弧は一般的な計算順序の規則が適用され、括弧内が先に計算される。
codice_6 式によって値のテストが行われる。同値かどうかの比較は EQL を使い（ = 記号はオーバーロードされていない）、GTR は greater than、NEQ は not equal に対応する。例えば、次のコードは Z の値を絶対値を Q で示されるアドレスに代入する。
識別子（変数と定数）は使用する前に宣言する必要があり、一般に codice_7 というキーワードを用いる。変数を宣言する部分では、コンパイラはその領域を確保する。場合によっては codice_8 というキーワードを使って固定アドレスに変数を割り当てる。これは、マシンのレジスタや特定のアドレスにアクセスするのに使われる。
サブルーチンは "routines" と呼ばれ、codice_9 というキーワードで宣言される。文字列置換を行うマクロは codice_10 というキーワードで宣言される。配列は "structures" と呼ばれ、codice_11 というキーワードで宣言される。
他にも次のような構成要素がある。
ソースコードの例.
以下のコード例は、上記で引用した "Bliss Language Manual" にあるものである。