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ビットとなる。

変数の参照は常にその変数のアドレスとなる。例えば、`Z+8` という命令は、Z の「アドレス」に 8 を加えることを意味し、「値」への加算ではない。Z の「値」に 8 を加算したい場合、変数名の前にピリオドを付け、`.Z+8` としなければならない。

代入は = 記号で行われる。例えば `Z=8` と書けば、8 を格納したフルワード定数が生成され、それが Z に対応したアドレス位置に格納される。従って、`Z+12=14`（あるいは `12+Z=14`）と書いた場合、定数 14 を Z のアドレスに12を加えた位置に置くことになる（悪い書き方の例）。

ブロックは ALGOL のものと似た構文であり、BEGIN と END で囲まれた部分がブロックとなる。文はALGOLと同様、セミコロン ";" で区切られる。文（式）の値が計算されると、それが次の文の終端まで保持される。つまり、計算されたり代入されたりした値は次の文の評価中も保持される。一方、ブロックを括弧で表す場合もある。式の中の括弧は一般的な計算順序の規則が適用され、括弧内が先に計算される。

`IF` 式によって値のテストが行われる。同値かどうかの比較は EQL を使い（ = 記号はオーバーロードされていない）、GTR は greater than、NEQ は not equal に対応する。例えば、次のコードは Z の値を絶対値を Q で示されるアドレスに代入する。

```
Q = (IF .Z GTR 0 THEN .Z ELSE -.Z);
```


識別子（変数と定数）は使用する前に宣言する必要があり、一般に `OWN` というキーワードを用いる。変数を宣言する部分では、コンパイラはその領域を確保する。場合によっては `BIND` というキーワードを使って固定アドレスに変数を割り当てる。これは、マシンのレジスタや特定のアドレスにアクセスするのに使われる。

サブルーチンは *routines* と呼ばれ、`ROUTINE` というキーワードで宣言される。文字列置換を行うマクロは `MACRO` というキーワードで宣言される。配列は *structures* と呼ばれ、`VECTOR` というキーワードで宣言される。

他にも次のような構成要素がある。
* `CASE` 式
* `INCR` 式を使ったループ構造。ALGOL の FOR 文に似ている。
* 組み込みの文字列関数や自動データ変換（数値から文字列など）

## ソースコードの例
以下のコード例は、上記で引用した *Bliss Language Manual* にあるものである。


```
MODULE E1 (MAIN = CTRL) =
BEGIN
FORWARD ROUTINE
    CTRL,
    STEP;
ROUTINE CTRL =
!+
! This routine inputs a value, operates on it, and
! then outputs the result.
!-
    BEGIN
    EXTERNAL ROUTINE
        GETNUM,     ! Input a number from terminal
        PUTNUM;     ! Output a number to terminal
    LOCAL
        X,          ! Storage for input value
        Y;          ! Storage for output value
    GETNUM(X);
    Y = STEP(.X);
    PUTNUM(.Y)
    END;
ROUTINE STEP(A) =
!+
! This routine adds 1 to the given value.
!-
    (.A+1);
END
ELUDOM
```


## バージョン
* BLISS-10
* BLISS-11 - PDP-11 向けクロスコンパイラ
* BLISS-16
* BLISS-16C - DEC自身による BLISS-11
* BLISS-32
* BLISS-36
* BLISS-64 
* Common BLISS - 移植性のあるサブセット

## 注釈

## 参考文献
* Wulf, W. A.; Russell, D. B.; Habermann, A. N. (1971). *BLISS: A Language for Systems Programming*. Communications of the ACM 14(12):780-790, Dec 1971
* 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, .

## 外部リンク
* Site with PDFs of manuals
* Alan Lehotsky posting about BLISS at DEC
* Language Reference Manual
* "BLISS: A Language for Systems Programming" by W.A. Wulf, D.B. Russell, and A.N. Habermann. (PostScript)
* Session notes for "Introduction to BLISS" by Matthew D. Madison. (PostScript)

### ダウンロード
* BLISS-10
* [ftp://iecc.com/pub/file/bliss.tar.gz Older BLISS-11]
* BLISS-36
* BLISS-11, BLISS-32 and BLISS-64
* [ftp://freevms.nvg.org/pub/vms/freevms/ FreeVMS Portable BLISS for GCC]