プログラミング言語でゼロから数えることの起源は何ですか?


8

これは私が長い間疑問に思っていた(そして尋ねられた)質問です。

(ほとんど?すべて?)プログラミング言語では、配列、文​​字列などのインデックスはゼロから始まります。多くの言語で採用され、時間が経つにつれて慣例になったことを認識していますが、だれでもこの起源を指摘できますか?

おそらく、それはすべてバイナリに根ざしていることに関係しているのではないかと思いました。しかし、私は10進法での必要性を引き継ぐという考えがわかりません-なぜインデックスを1から始めないのですか?

ゼロからインデックスを開始する決定が説明されている可能性があるプログラミング言語の歴史的な知識を持っている人はいますか?

ありがとうございました!

編集:ダイクストラの文章は、数学的な観点からさらに役立ちますが、すべての言語がゼロインデックス化されているわけではないことを彼は指摘しました。WBTの説明は、なぜメモリアドレスに基づいてゼロから始めるのかについても理にかなっています。(一部の言語は、配列操作に基づいてわずかに異なるインデックス付けを処理することを知っています。)

私は必ずしも理由を探る必要はありません(理解を深めるのに役立つので非常に感謝しています)が、いつこれが規則になったのか、および/または特定の言語にたどり着くことができるかどうかという線に沿って探します。

したがって、たとえば、K&RのCでは、配列のインデックスについて説明するとき、KまたはRは「配列の添え字は常にCでゼロから始まる...」(p。22)と説明し、後で文字を処理する関数について説明します。配列、「...より有用な設計は、行の長さ、またはファイルの終わりが検出された場合はゼロを返すことです。ゼロは、有効な行の長さになることはないため、許容できるファイルの終わりを返します。」(p.127)

K&Rに基づいて、私は次のように収集します。a)規則は他の場所から採用されているため、Cはゼロインデックスの背後にあるインスピレーションではありません。b)2番目の例に基づいて使用する理由はもっと深い可能性があります。私はK&Rがその明確な散文で非常に広く評価されていることを知っています。それが、これを含めるもう1つの理由です。別の文書化された言語がゼロインデックスの背後にある理由を説明するために私が期待したことの例を示すためです。

私はWBTとbtillyの両方が同等に良い理由を提供していると思います。設計の決定を文書化した古い(Cより前の)言語を知っている人はいるかもしれません。同時に、そのような情報が存在しない可能性があることも認識しています。


3
簡単な答えは、配列がポインターの場合、底が0であることが最も論理的であるということです。その場合、myarray [0]とmyarray + 0は同じ要素であり、myarray [1]とmyarray + 1などです。これは、最初からのオフセットと考えてください。より複雑な回答が

@ThomasHそれは「ベース0」ではありません。ベースとは、数値に新しい位置を追加する前に、異なる値を表す一意の記号の数を指します。ベースは、そのシステムで10-1が何であるかを理解することで見つけることができます。10進数(10進数)、2進数(バイナリ)、16進数(16進数)が最も広く知られています。
WBT 2016年

1
@WBTタイトルを読んだだけなら

@ user6292850参考になると思いますが、まともではないと思います。
WBTは2016年

3
Dijkstraがゼロインデックスについてこれを書いた:cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
Thomas Eding

回答:


12

オフセットについてです。配列が始まるメモリ内の場所を指すアドレスがあります。次に、任意の要素にアクセスするには、配列のインデックスに要素のサイズを掛け、それを開始アドレスに追加して、その要素のアドレスを見つけます。

最初の要素は開始点にあるため、要素のサイズをゼロで乗算してゼロを取得します。これは、最初の要素の場所を見つけるために開始アドレスに追加するものです。

プログラマーがメモリアドレスが直接操作され、ほとんどの場合そこから構築される非常に低レベルの言語で作業を開始し、各ステップで同じ規則を維持するため、規則を広めることができました。規約の切り替え。特に低レベルの言語を扱う場合、このアドレッシングがどのように機能するかを理解することは依然として重要です。これは、高水準言語でプログラミングすることを最初に学習している人々にとって障害となる可能性があることに同意します。

このトピックに関するWikipediaの記事は、「後方」作業やループ、すなわちの終わりを検出する際にも使用される一般的な機械語命令を引き合いに出し、「デクリメントおよびジャンプゼロの場合を。」

例外:MATLAB と他のいくつかの言語は傾向を逆転させ、1から始まるインデックスを使用しました。明らかにそれは多くのターゲットユーザーにとって最初のプログラミング言語であり、1から始まるそれらの人々にとっては最初のプログラミング言語であるという印象の下に直感。これにより、異なる値でカウントを開始するプログラミング言語を頻繁に切り替える(比較的小さいサブセット?)プログラマーに不満が生じます。


1
はい。アセンブラとの接触があった人は誰もこの質問をしません:)
Martin James

4

「(ほとんど?すべて?)プログラミング言語では、インデックスはゼロから始まります」という文は単に正しくありません。遺産がCから公式または非公式に派生した言語は、この規則に従います。他はそうしないかもしれません。

Cは基本的に「高レベル」のアセンブラーであることが意図されていたので、Cはそのようにしました。他の言語にコンパイラーとマシンに重い仕事をさせるプログラマーに、ワークロードのかなりの負担をかけました。Cが開発された当時は、1ベースのカウントが標準でしたが、そのばかげた余分な1を追跡するようコンパイラーに要求することは、コンパイラーにとってあまりにも多くの作業であると考えられていました。

C ++はCから下位互換性があるという要件のためにCから取得しました。CはCから取得したものです。JavaはCから取得しました。Cプログラマーが開発した言語で、他に何も公開することなく、Cをコピーしました。他のCプログラマーに人気を得たかった、または他のCプログラマーがそれを行う方法を知らなかった。

FORTRANは、他のほとんどすべての時代に先駆けて1から始まりました。エンジニア、数学者、科学者がミレニアの1から数え始めているためです。(これにより、8クイーンの問題に対して非常に簡潔で非常に優れたアルゴリズムが可能になります。)MATLABはFORTRANをコピーしました。これは、ほぼ正確に同じユーザーコミュニティを対象としていたためです。

PASCALは実際に、プログラマーがどこで開始および終了するかを言うことを要求します。これにより、たとえば、インデックスを-7から+7まで実行する配列を定義できます。エイダはパスカルに続いた。(Adaをメンションすることは、その場で少なくとも3つの反対票を投じるのに適しているはずです。)

COBOLは1から始まったと思いますが、確かに思い出せません。エンジニア、科学者、数学者などの会計士が1から数えるので、非常に苦しい思い出をリフレッシュするつもりはありません。

PL / Iが好きな場所で開始および停止できるようにしたのは私の遠い思い出です。完全な開示:PL / Iコーディングを行ったことはなく、本をざっと読み飛ばしただけで、それを変更するつもりはありません。

GPSS(IBMの離散イベントシミュレーションパッケージ)でアレイを使用したことはありませんが、それを少しだけ触れたときは、GPSSがどのように実行したかはわかりません。

配列は伝統的に開始アドレスと開始アドレスからのオフセットに関して定義されるため、アセンブリ言語は通常0から始まります。(これは常に当てはまるわけではありません。IBM1130 Executiveには、「開始アドレス」が実際にはテーブルの中央にある大きな常駐ベクターテーブルがありました。1130のインデックス付きアドレッシングが符号付きオフセットを許可し、オフセットがゼロはテーブルの可能なサイズの半分を捨て、そのテーブルは大きくする必要があります。)


0

短い答えを試してみます。

ゼロから数えることは、プログラミング言語だけでなく、より一般的に言えば数学でも人気があります。

カウントはゼロよりはるかに古いです。ゼロと位置表記法が発明されたので、誰もがゼロから10秒、100秒、1000秒などを数えます。これが新しい最下位桁です。ゼロから単位を数えることは、特に半分開いた間隔と(多次元)配列で、いくつかの一貫性の利点をもたらします。詳細と例については、右側のリンクとhttps://en.wikipedia.org/wiki/Zero-based_numberingを参照してください


1
数値は0から9ではない1から10までに行く
イグナシオ・ソレル・ガルシア

私の経験では、1からnまでのインデックスは、数学で0からn-1までのインデックスよりも人気があります。
CodesInChaos 2018

-3

カウントのあらゆる可能な慣習が試みられました。代替案は事故が発生しやすい傾向があるため、ゼロ規則からのカウントが支配的になっています。

このバージョンがうまく機能する理由の1つの説明については、https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.htmlを参照してください


2
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。- レビューから
Vinoth Krishnan

6
「可能な限りの数え方の慣習が試みられてきた。」-eで始まり、πの単位で増加するものも含まれますか?
WBT 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.