始まりはいつもゼロ? - 0オリジンと1オリジン

ポーランドの大数学者、ヴァツワフ・シェルピンスキーは・・・荷物を一つなくしてしまったのではないかと心配していた。「そんなことないわよ、あなた!」と妻は言った。「六つともここにあるじゃないの」。 「そんなはずないよ」とシェルピンスキーは言った。 「何度も数えたんだ。ゼロ、1、2、3、4、5」
415208524X今でこそ私たちの生活に入り込み、普通に使われている0(ゼロ)。しかし、中世まで0は当たり前の存在ではなく、むしろ忌むべきものとして排斥の対象ですらありました。アリストテレスを戦慄させ、近代科学の祖デカルトが否定し、天才アインシュタインが挑んだゼロ。。。最近読んだ「異端の数ゼロ―数学・物理学が恐れるもっとも危険な概念」という本は、ゼロが数学・物理学・宗教・哲学の歴史の中でどのように扱われてきたかについて書かれており、非常に面白かったです。この手のポピュラー・サイエンスものが好きな方にはお勧めです。古代ギリシャでは数学が幾何学と密接に関連していたために0がなかった話など、なるほどという話がたくさんありました。

さて、身の周りには0から始るものと1から始まるものが混在しています。西暦は1年から。西暦0年はありません。西暦1年の一年前は紀元前1年です。カレンダーで言えば月や日も1から。でも時間は0から。年齢は数え年は1から、満年齢は0から。ものを数える時は1からですが、カウントダウンは0で終わる。。。それぞれに歴史的経緯や意味が隠れています。。

プログラミングにおいても同様の問題が顔を出します。0オリジン/1オリジン(0 origin/1 origin)や0基準/1基準(0 base/1 base)と呼ばれているものです。最も分かりやすい例は配列の添え字でしょう。C言語系の言語(C++やJava)では配列の最初の要素はa[0]と書きます。FORTRANやCOBOL、BASICではa[1]と書きます。何番目の要素という意味合いを考えれば、添字は1オリジンが自然な気もします。しかし、C言語系の言語では、配列はポインタと強く結びついているために、a[0]は「aの0番目」というよりは「先頭からオフセット0の要素」「*(a + 0)」いう意味合いになっています(※1)。

最近は、C言語系の言語が主流なので、大抵のプログラマは0オリジンの頭になっているでしょう。私も1オリジンのプログラムを見て、「何だこれは」と感じたことはあります。この0オリジン/1オリジンの問題は、混在させると非常にややこしくなるので、少なくともプロジェクト単位くらいでは統一するようにした方が心の平穏を保つためには重要です。

私は大勢と同様、0オリジンが好きですが、最近は1オリジンも見直しています。見逃されがちですが1オリジンのメリットは0を使わない点にあります。よく変数を見初期化のまま仕様して0が入ったりすることがありますが、このように偶然入る0を0オリジンの場合はそのまま使用してしまいますが、1オリジンでは不正規な値として弾くことができます。偶然の動作を防ぐというのはデバッグ効率を考えると非常に重要な点です(参考:バグを潜伏させない工夫)。この点を考えると、1オリジンも捨てたものではないなと思う今日この頃です。

ちなみに、プログラミングにおける0は、0除算(zero devide)やヌルポインタ(null pointer)等、特殊な意味合いを持っています。

※1 C言語ではa[-1]も*(a-1)という意味になり、文法的に間違いではありません。

【関連記事】
バグを潜伏させない工夫
デバッグ指向のススメ

【関連書籍】
異端の数ゼロ―数学・物理学が恐れるもっとも危険な概念 Charles Seife
数の本 J.H. コンウェイ R.K. ガイ
零の発見―数学の生い立ち 吉田洋一
プログラミング言語C ANSI規格準拠

コメント

0か1か

興味深いお話ですね。

最近はすっかり0originになってしまいましたが、FORTRANやBASICの時は1originが当たり前と思ってました。
配列演算をする時は0originがいいですが、文字列操作としては1originの方が自然な感じがしますね。(substr(s,5,3)のように)
APIのエラーの意味や列挙型など、値としての意味合いがまちまちなのも、プログラミングを難しくしている要因の一つだと思います。

将来的には数値すら概念的に扱う言語が登場して、オリジンそのものが昔話のように語られる日が来るかもしれませんね。

あれれ

> 変数を見初期化のまま仕様して
インパクトの強い誤字っすね…

誤変換

ご指摘ありがとうございます。IMEは書く者の思考を超越しますね(^^;)。
あとで直したいと思います(これはこれで意味深そうですが)。

Re: 0か1か

yasuhoさん、コメントありがとうございます。

> APIのエラーの意味や列挙型など、値としての意味合いがまちまちなのも、プログラミングを難しくしている要因の一つだと思います。
0を成功とみるか、失敗とみるかですね。例えば、POSIX系は0が成功ですが、0はfalseの意味もあるし。。

> 将来的には数値すら概念的に扱う言語が登場して、オリジンそのものが昔話のように語られる日が来るかもしれませんね。
そうですね。現在でも抽象性の高い言語(ライブラリ)では、基準値を指定できるものもありますし、C++でもstd::map等の連想配列コンテナや、for_each等のalgorithmを使えば、添え字指定からはある程度解放されます。ただ、現実世界が、0オリジンと1オリジンが混ぜて使用している以上、この問題を完全に解決するのはなかなか難しいのかもしれませんね。
非公開コメント

トラックバック

IT技術者ブログへのリンクを追加

またリンク追加。 IT技術者のリンク集サイトになりつつあるような。。。 seesaaブログって使ってるが思ったより多いなって感じる。 hatenaも意外といる。 リンク追加の報告ばかりで申し訳ない。 そのうち役立つコンテンツを公開する予定なのでお待ちくださ...

本のおすすめ

4274065979

4844337858

482228493X

4904807057

4873114799


プロフィール

  • Author:proger
  • 組み込み関係で仕事してます

ブログ内検索