今回は、プロデルの配列の添字が1から始まる話を書きたいと思います。プロデルでは、配列の添字が1から始まります。身近な多くのプログラミング言語では0からはじまりますので、プロデルのクセがある所の1つだと思います。なぜ1から始まるのかの理由やその利点と欠点をまとめられればと思います。
リストの0番目
プロデルやTTSneoの言語仕様を設計するに当たっては「日本語として自然に書ける」というコンセプトを大切にしています。その上で「0番目」という表記が自然かという疑問がありました。添字の始まりを検討するにあたり、0から数えるコンピュータのルールを取るか、一般生活のルールを取るかは悩み所です。身近な生活では、1から数えることが自然なのは、言うまでもありません。ですのでプロデルでは日本語として自然な1番目から数えるルールを採用して現在に至っています。
利点
プログラミングをはじめて学ぶ人にとっては特にわかりやすさの点で利点があると思います。配列は要素を集めた集合ですので、要素を1番目,2番目、、、と数えるのはむしろ自然なことかと思います。一方で実際の多くのプログラミング言語では0から数えます。「添字が0から4までの5個の要素」という表現をよくしますが、このように0から数える点がプログラミングを難しく感じてしまう点の一つだと思っています。(これを難しいとは思わない。むしろプログラミングっぽくてカッコイイと思う人もいるかもしれません)
プログラミングを知っている人にとっては「慣れれば困らない話」かもしれませんが、逆に言えば1から数えることも「慣れれば困らない話」と言ってしまうこともできるかもしれません。
繰り返しと添字
配列を操作するときには、for文のようなループ処理と縁を切ることはできません。 例えば、5つの要素がある配列ですべての要素にアクセスする時のことを考えます。この時、添字をC言語のように0からはじめる場合では、0,1,2,3,4とカウンタ変数をカウントします。プロデルのように1からはじまる場合は、1,2,3,4,5とカウントしていきます。
単純にすべての要素を操作するプログラムの例として、配列の要素に2,4,6,8,10の値を順番に入れるプログラムをC#とプロデルで書いて比較してみます。
for(int i=0; i<5; i++) {
array[i] = (i+1)*2;
}
番号に1から5まで繰り返す
一覧(番号)は、番号*2
繰り返し終わり
このプログラムを見比べる限りは、値の計算に違いがあるものあまり違いが無いかと思います。
ただ、少し複雑な配列操作をしようとすると、気になるケースがあります。例えば5番目の要素から3個の要素を順番に操作したい場合はC#言語では次のように書きます。
int offset = 5;
for(int i=0; i<3; i++) {
array[i+offset] = array2[i];
}
一方プロデルでは、次のように書きます。
オフセットは、5
番号に1から3回繰り返す
一覧(番号+オフセット-1)は、一覧(番号)
繰り返し終わり
このように特定の添字だけを操作する場合に、必要な数字(5や3)を頭で計算せずにそのまま用いた場合、この例では添字が1からはじまることでオフセットを足した時に添字がズレてしまいます。そのため、添字を-1にする必要ありました。ぱっと見でもプログラム中に5,3以外に-1という数字があるので、添字が正しく計算されているか考えて移植する必要がありますし、書き忘れてしまうこともあるかと思います。僅かな違いではありますがプログラムを移植するときにこの違いが手間になっている可能性はあります。
移植性の問題
プロデルのような小さな世界のプログラミング言語では、他のプログラミング言語で書かれたプログラムから移植しやすいかどうかも大切です。配列の操作が必要なプログラムの場合、添字が1つずれるだけで単純に置き換えるだけでなく、プログラムの内容もよく理解して本来と同じように動作するように移植しないといけません。
実際ゲームのような配列を多用するプログラムを移植する時には特に添字に関して考えることが多々あり、移植の手間を感じています。
とはいえ、例に挙げたような添字を意識して配列の操作を多用するプログラムは、実際は少ないように思います。配列の要素をすべて操作するか、特定の要素だけを操作するかだけのケースがほとんどなのではないかと思います。最近のLINQのようなデータ操作言語では添字が使われることはありませんし、将来的には添字を意識してプログラムを書く機会は少なくなると思います。
どちらがよいか
これまでプロデル掲示板を見ている限りでは、添字が1からはじまることについて混乱している、不満に思われている、といった様子は見受けられません。しかし、タダでさえクセのあるプロデルですので、一般に0からはじまる添字をあえて1から始める必要が本当にあったのかは未だに悩むところではあります。VBA(VB6)ではOption Base ステートメントで添字を0または1のどちらかを選択することができましたが、プロデルでもこういったオプションがあってもよいのかもしれません。