小野@名古屋大学 です.

<bjpl36$gfg$1@bluegill.lbm.go.jp>の記事において
toda@lbm.go.jpさんは書きました。
toda> In article <qkpoexs3t6g.fsf@dash.tokyo.pfu.co.jp> kate@pfu.fujitsu.com writes:
toda> >> > (7)配列(ベクタ)を宣言すると、同名の単純変数も同時に確保され、
toda> >> > 当該配列へのポインタで初期化される
toda> >> > わけのわからん無駄な仕様ですね。
toda> >> > 当該配列へのポインタを値とする定数名とするのが素直なんですけど。
toda> >> 定数オペランドアドレスにアクセスするアドレッシングモードがない
toda> >> 計算機を想定していたのでは?
toda> だからって、「変数」としてアクセス可能にする必要は無いでしょう。
toda> 変数と同じメモリ領域に値を保持するとしても、「無名の変数」にして
toda> プログラムからはアクセスできなくする方が素直だと思います。
BCPL の都合上 a!i と書いたら a にアクセスしてしまうので,
# BCPL のバージョンにより配列の要素参照はいろいろな構文があるので
# すが, ここでは a!i を使います.
「無名の変数」の意味はないでしょう (配列名をその変数の名前にして
しまえばいいわけで). まぁ, 「変数」である必要はよくわかりませんが
(「定数」でもいいので).

toda> >これは、
toda> >> > データは言語レベルでは内部表現としてのみ意味があり、
toda> >> > その内部表現にどういう意味を持たせるかはプログラマ次第
toda> >> > という意味で「機械寄り」の「区別の無さ」です。
toda> >> 要は word ですよね。
toda> >こっちと関係があるのではないかと思います。
toda> >配列宣言でその配列へのポインタも用意しておくことで、配列というデー
toda> >タ型をコンパイラが覚えておく必要が無くなります。
toda> よく解りません……
toda> 配列は「データ型」ではありませんよね。
toda> コンパイラにとっては、
toda> 「宣言されただけの記憶域をシステムが確保する」というのが
toda> 配列というオブジェクトの本質であり
toda> (この「確保」がシステムにとって一番の負担ですよね)、
toda> それは、対応するポインタ変数を確保するかどうかに関係ありません。
ただ, 対応するポインタ変数を確保することによって「コンパイラが配
列の大きさを意識しなくていい」ということは言えると思います.

これは 2次元以上の配列になると影響してくるんですが, C で a[M][N]
という配列 (M, N は定数) を確保したときに a[i][j] をアクセスしよ
うとすると, 実質的に *(a[0] + i*N + j) という計算をすることになり,
このため N を記憶しておく必要があります (場合によっては i*N とい
う乗算も必要). ところが, BCPL では同じ配列に対して a の分に加えて
a!0〜a!(M-1) の分も確保します (a の内容は a!0 のアドレス, a!i の
内容は a!i!0 のアドレス). こうすると a!i!j のアクセスに必要な処理
は C で書くと *(*(a + i) + j) となり, N の値を記憶する必要はなく
なります (しかも乗算も不要).

toda> そして、いずれにしても配列名は
toda> 「確保された記憶域のアドレスという意味を有するword型のデータ」であり、
toda> 今問題になっているのは、
toda> それが「定数」なのか「変数」なのかという違いに過ぎません。
BCPL にとっては「変数」か「定数」かはどうでもよくって, 単に「メモ
リ上に存在すればいい」ということです.

toda> やはり、必然性の無い仕様なのではないでしょうか?
「変数」である必然性はないですね.

でも, 「メモリ上にポインタとして存在する」というのは便利だと思い
ますよ. 実際, C だってまともに 2次元配列を扱う (ex. 行列演算) ラ
イブラリを作ろうと思ったら同様の方法を採るしかないわけですし.
-- 
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男