2017
09.12

0から?それとも1から?

Category: その他
久しぶりに本格的にプログラミングなどをやっていたら、こちらがだいぶご無沙汰にになってしまった。プログラムを書くのは楽しい作業ではあるが、良い考えが浮かばない時などはそれなりに大変でもある。一息ついたので、今回は息抜きも兼ねてプログラミングに関する他愛もない話を書いてみよう。。。

どんな他愛もない話かというと、配列の添え字にからめた他愛もない話である。

言語によって配列の添え字を0から始めるものと1から始めるものの2つの流派があるなぁ、ということが以前から何となく気になっていた。筆者が物心ついた頃(?)に読み書きできたのは Fortran という言語であるが、Fortran での配列変数は A[1], A[2], ... というように添え字は1から始まるようになっている。一方、その後覚えた C や C++ では A[0], A[1], ... というように添え字は0始まりである。

これは確か C/C++ での添え字には「配列の先頭アドレスからいくつ離れているかを表す」という確固たるコンセプトがあるので、必然的に0始まりとなる、といった話だったと思う。ちょっとしたプログラムを書くのに便利な VB や VBA などの他の言語でも"0始まり"がデフォルトであり(デフォルトを"1始まり"とする命令も用意されているが)、コンピュータ言語での主流は"0始まり"のようである。

では Fortran はなぜ1から始めるようになっているのだろうか?その答えを筆者は知らないのだが、数を数える時に1から始めるのが人間にとっては自然であるということに関係があるのかも知れない。眠れない夜に「羊が0匹、羊が1匹、羊が2匹 ... 」と数える人がいたら、その人はかなり病んでいるに違いない。筆者の知人に C++ でコーディングしているのに、頑なに配列を1から始める輩がいたが、そうするとゼロ番目の変数用のメモリー領域は常に空き部屋となって無駄使いである。だが、その知人にとって0から始める方がそれにも増して気持ち悪いことだったのだろう。

この始まりが0か1かの問題は、コンピュータ言語に限らず、広く一般の問題としても存在するようである。それらの中には筆者には不自然と思える方が採用されているものもあるので、C 言語の仕様のような何らかの理由があるのかも知れない。

つい先日、新聞に出ていた感染症についての特集記事を読んでいたら、「患者第一号」という言葉の後ろに括弧して"ペイシャント・ゼロ"と書かれていたので、英語では患者第一号を patient zero というのだと初めて知った。一人目がゼロというのは筆者の感覚では不自然である。

これはとある知人から聞いた話であるが、「0番線ホーム」が存在する駅もあるのだそうだ。その知人が仲の良い友人達と小旅行に出かけた際に、自分たちの乗るべき列車の案内が駅の放送で流れたそうだが、2度聞いてもそれが何番線と言っているか分からなかったそうである。「駅員さんに聞いたら0番線だって言われて。まさか0番線があるなんて思わないから誰も聞き取れなかったわよ」とあきれていた。この命名の理由はよく分からないが、既存1番ホームの隣に新しくホームを作った、といったあたりだろうか。

人は生まれた時が0歳で1年経つと1歳になる。だが、昔は「数え年」という年齢のカウント方法があった。「数え年」では、生まれた時点で1歳で、年が明けると1つ歳を取る。年末に差し迫って生まれた人は、生まれて数秒で2歳になることもあるのだから大変である。特に女性はなるべく年を取りたくない生き物であるから、「数え年」というシステムが廃れて喜んだ女性も多かったのではないだろうか。

こちらは歳の数え方ではないが、中谷宇吉郎が高等学校の時に下宿していた家の「白頭巾のお婆さん」は時間を正しく数えることができなかったそうである。「科学以前の心」という随筆に以下のような話が出ている。

... 私はその頃からよく朝寝をしたらしく、いつも朝飯を半分かきこみながら、学校へとび出して行った。それである日白頭巾のお婆さんが、それでは身体に毒だと言い出した。

「もう一時間はよう起きなさりゃあ、楽やのに、そりゃそと夜は何時におやすみになりみすか」という。まあ十一時くらいでしょうというと、お婆さんは指を折りながら、「十一時、十二時、一時 ..... 」とかぞえ始めた。そして、「それみなされ、七時までなら、九時間もありみすやろ」という。

私は慌てて、「お婆さん、十一時にねるのに、十一時からかぞえられちゃやり切れませんよ」と抗議を申し込んだ。しかしその抗議の意味は、どのように説明しても、お婆さんには納得されなかった。「それじゃ、十一時に寝て一時に起きたら、何時間寝たことになりますか」ときいても、「十一時、十二時、一時。三時間ですやろ。」とすましている。

「それなら、十一時にねて十二時に起きたら」というと、「十一時、十二時」とかぞえながら、どうも少し可笑しいと気がついたらしく、「そんなら一時間ねたことになりみすやろ」と答えながら、不安げな顔付であった。

私はやっと安心して、「ですから、十一時にねたら、十二時までが一時間、一時までが二時間だから、十二時からかぞえるんですよ」と言うと、お婆さんも兜をぬいだ。しかしその兜のぬぎ方が実に意外なのであった。「やっぱし学問のある人にあ、かないみしん。うまいことだまかしなさる」と言うのであって、十一時から七時までが九時間という勘定に対する信念は毫もゆるがないのである。


引用が長くなったが、この下りの後にこのお婆さんの「兜の脱ぎ方」が「科学以前の考え方」であるということが語られるのである。数の数え方がここでの主題ではないのだが、これを読んだ時に筆者が思ったのは、お婆さんは「数え年」に親しんでいたせいで混乱してしまったのではないかということであった。つまり、科学云々は関係なくて、現代でも思い込みの激しい人には起きうることではないかと思ったのである。

実際そのような例が、永沢工著「はい、こちら国立天文台 -星空の電話相談室-」という本に出ているので、以下にそれを示そう(「二〇〇〇年、うるう年と二一世紀」)。2000年3月の出来事だそうである。

「人はね、一年経てば一歳になるんですよ。二年経てば二歳にね。二〇〇〇年経ったから二〇〇〇年になったんです。もう二〇〇〇年が過ぎたんですよ。だから、この一月一日から二一世紀なんです。この前天文台からもらった手紙では、二〇〇一年から二一世紀って書いてありました。そんなバカなことないですよ。いまはもう二一世紀なんです。天文台は間違っているんです」

かなり激しい口調で、さっきから五分くらいやりあっている。

「そうはおっしゃいますがね、ローマ帝国の分裂が三九五年とか、フランス革命が一七八九年とか、そういう風に歴史上の事件と西暦年号はそれぞれ対応がついているんです。それは天文台が決めたわけじゃない。昔の人が決めたんです。それを動かすことは出来ない相談です。そういう形で西暦は一年から始まっているんです。そのときは西暦一年とはいわなかったでしょうがね。そうすると、いまは一九九九年が終わったところですから、一年から一九九九年までに一九九九年しか経っていないことがわかるじゃないですか」

(中略)

「西暦一年から始めて一〇〇年ずつ区切っていくとすると、二〇〇〇年は二〇回目の区切りの最後の年になる」という客観的な事実から、国立天文台は「二〇〇〇年は二〇世紀、二〇〇一年から二一世紀」と説明をしている。

(中略)

さきほどの電話の人は、人が生まれてからの一年間を〇歳と数えている。つまり一世紀の最初の年を西暦〇年に振り当てている。ところが西暦〇年に当たる年は存在しない。存在しないというのは、歴史家が西暦〇年という年を設定しなかったという意味である。そのため、一世紀の一〇〇年間は、紀元前一年から始まることになってしまう。それを承知でありさえすれば、自分で二〇〇〇年は二一世紀と考えても、そこに何も矛盾は起こらない。


このように、コンピュータ言語に限らず「二つの流派」が生まれる事例は多くある様である。そのため各所で混乱も起きている。いつから二一世紀かといったことは上記にもある通り、実質的にはどうでもいいことだが、政治が絡むとそうとも言えない例が上記箇所の後に書かれているので興味のある方は同書を参照されたい。

少し建築に関係する話も書いておこう。それはビルなどの建物の階の英語での数え方である。アメリカでは、1階、2階、... を 1st floor, 2nd floor, ... と呼ぶので日本と同じであるが、イギリスでは1階を ground floor と呼び、2階、3階が 1st floor, 2nd floor となる。筆者が中学生の時に使っていた英和辞書では、この違いについて絵入りで詳しく説明されていたのを思い出す。紛らわしいと言えば紛らわしいが、さして問題になるようなことでもないので、何故そこまで丁寧に説明されていたのか今もって不可解である。

話をプログラミングに戻すと、筆者は"0始まり"が理屈から言ってスッキリしていると感じる。だが、A[10]と宣言するとA[9]までしか無い(実際は密かにA[10]のアドレスまで保証されているとどこかで読んだ気もする)のは直観的には間違いやすいかなとも思う。慣れればそんなことで混乱することは無いとは思うけれど。。

スポンサーサイト

トラックバックURL
http://ksmknd16.blog.fc2.com/tb.php/156-045fac53
トラックバック
コメント
管理者にだけ表示を許可する
 
back-to-top