In article <binuft$49p$1@bluegill.lbm.go.jp> I write:
>>  そもそも言語メカニズムというならCの祖先BCPLや親戚BLISSを調べる
>>必要はあるんじゃないでしょうか。
>ですよね。あと、algol 68も見ておきたいんだけど、
>教科書探しから始めねばならない状況です。
        M.Richards and C.Whitby-Strevens(和田英一訳)
        BCPL言語とそのコンパイラ(共立出版1985)ISBN4-320-02245-9
が滋賀県立図書館にあったので、借りてきました。

とりあえず、元の話題に関連するところでは、

(1)「構造体」という概念はBCPLには無い

データ型が無い(後述)ので、
種類の異なるデータを1つの配列(ベクタ)に混在させることはできますが、
要素を「指標数値」ではなく「名前」で識別するというものはありません。
オフセット値を定数名(マニフェスト定数)として定義することによって、
実質的に「名前による要素の識別」を行うことはできますが、
構造体のようにコンパイラが自動的にオフセット値を計算するのではなく、
プログラマがオフセット値を計算してプログラムに記述せねばなりません。

(2)C言語がPL/Iから直接受け継いだと思われる特徴はBCPL起源ではない

注釈に“/* */”を使う流儀ではありません。
“//”から行末までが注釈です……って、
最近のC++とかに追加された注釈の書法と同じだ^_^;

また、“;”は分離記号です。但し、行末も分離記号です。これはビックリ。
正確には、行の最後のトークンが文末に位置し得るものであれば分離記号で、
文末に位置し得ないトークンで終わっていたら次行に継続します。
何ちゅう投げ槍な仕様だ……

================================
元の話題と直接関係ない点で興味を引いたところとしては、

(3)データ型の区別が無い

CPLからBCPLへの最大の変更点は、この点なんだそうです。
区別が無いと言っても、AWKやPerlのように、
"123"という文字列が数式に現れたら「123」という数値になる
というような「人間寄り」の「区別の無さ」ではありません。
データは言語レベルでは内部表現としてのみ意味があり、
その内部表現にどういう意味を持たせるかはプログラマ次第
という意味で「機械寄り」の「区別の無さ」です。
まあ、アセンブリプログラマにとっては素直な発想ですし、
おそらくこの考え方がB言語に引き継がれ、
いくら何でもそれじゃ不便だというので
C言語で揺り戻されたということなんでしょうね。
(B言語の詳細を知らないので、その部分は推測です)
とはいえ、システム記述の上で重要な
「文字型データは、その内部表現を値とする整数型データでもある」
「アドレスデータ(ポインタ)は、
その内部表現を値とする整数型データと相互に変換できる」というような
「データの二面性」はC言語にまで引き継がれたわけです。

ちょっと気になったのが、
C言語の「charとshort intとlong int」に相当する区別が無いこと、
つまり如何なるデータも同一量の記憶域を占有するということです。
この仕様ってCPUを選んでしまうんじゃないでしょうか?

なお、文字列に関しては、1配列要素に何文字かを詰込んで取扱う
ライブラリが標準で準備されています。
C言語やPascalと違って、詰込まれた文字列に対する操作を
配列操作と同じ書式で行うことはできず、専用のライブラリを要します。

(4)IF構造に相当するものがELSEの有無で区別されている

IFにはTHEN節のみでELSE節がありません。
THEN節とELSE節が共存する場合はIFに代えてTESTを使います。
こういう言語って初めて見ました。

ちなみに、UNLESS〜DOというのがあって、
ELSE節だけあってTHEN節が無い状況に相当します。

(5)FORループの制御変数のスコープは、そのループ内
(FORTRANやPL/IのDOループに相当)

「ループを飛出した時の値を参照する」技法が使えないということです。
そのくせ、制御変数の値を途中で変えてしまって、
繰り返し回数に影響を与えることは認められています。変なの。
制御変数はFORループの形式に記述することによって宣言され、
改めて変数を宣言する必要は無い
……というより、改めて宣言してはならないことになっています。

(6)“A < B < C”という条件式が自然言語の数式と同じ意味を有する

つまり、「A < B」AND「B < C」という意味になります。
これも初めて見た……

(7)配列(ベクタ)を宣言すると、同名の単純変数も同時に確保され、
当該配列へのポインタで初期化される

わけのわからん無駄な仕様ですね。
当該配列へのポインタを値とする定数名とするのが素直なんですけど。
(C言語は、まさにそう)

(8)インラインの手続きが、親手続きの局所変数にアクセスできない

アクセスが必要な場合はグローバル変数を使うことになりますが、
親手続きの中で定義すれば、親手続きの外では見えないので、
スコープ的には素直に親子での変数共有になります。
しかし、変数のメモリ管理(寿命など)は、あくまでグローバルです。

                                戸田 孝@滋賀県立琵琶湖博物館
                                 toda@lbm.go.jp