2008-07-05

C++0xの完全なドラフトが9月に出ること、および、Iotaについて

yey! : Trip Report: June 2008 ISO C++ Standards Meeting « Sutter’s Mill

しかし、iotaはどういう語源なんだろうと思って調べてみた。何しろ、ノンネイティブな私に乗っては、意味がさっぱり分からない。iota(v.begin(), v.end(), 1)などと書かれていても、さっぱり意味が分からない。

アルゴリズム、iotaはとても簡単である。意味も簡単であれば、実装も簡単。

template < typename Iter, typename Value >
void iota( Iter first, Iter last, Value value)
{
    for ( ; first != last ; ++value, ++first )
    {
        *first = value ;
    }
}

であるから、先ほどの例、iota(v.begin(), v.end(), 1)は、1, 2, 3, 4, 5...という値を、順に代入する。この第参引数の関数オブジェクトを変えることによって、どんな型でも、連番を代入することができる。もちろん、連番である必要は無いが、関数の意味から考えると、連番を入れるためのものだ。連番の配列と言うのは、結構必要になったりする。そのたびに自前でループを書くのは、人間のすることではない。STLを食べて呼吸するプログラマならば、当然そういうよくあるアルゴリズムは欲しいはずだ。

しかし、名前がよく分からない。コレは一体いかなる意味を持てるにや。

まず、意味からだ。イオタとは、ギリシャ語で、[Ι]、[ι]、という文字である。これはローマ字では、IやJになっている。英語圏でイオタというと、"not one iota of difference"(イオタほどの差も無い)という慣用句があり、これは「ほとんど違いが無い」という意味である。つまりイオタは、とても小さい差を意味する。インクリメントは最小の差であるので、意味としてのiota関数は正しい。

プログラミングの話になると、たとえばAPLでは、イオタという文字は、連番の整数値の配列を生成する文字である。実は我々C++プログラマも、知らずにイオタを使っているのである。例えば次のfor文だが、

for ( int i = 0 ; i < 100 ; ++i )
{
// 何か百回行われる処理
    for ( int j = 0 ; j < 100 ; ++j )
        //何か一万回行われる処理
}

参考書などを見ると、大抵は慣習的に、iやjが使われている。この文字の使用は、ことC++にとどまらない。BASICですらIを使ったものだ。何故か。それはiやjが、それぞれ大文字小文字のイオタに相当するからだ。だから使われているのだ。

こうしてみると、意味的にも、プログラミングの慣習的にも、イオタという名称を使うのは正しいということになる。だからもし、iotaを使って、心ない同僚が、「おいおい、その関数名、何やってるか分かりづらいから使うなよな。手でループを書け、手で」などと言おうものなら、こう反論するがいい。「んじゃお前、ループのカウンタとしてiやjも使うなよ。いまから、iやjを使っている参考書の著者全員に抗議してこいよ」と。

Iota - Wikipedia, the free encyclopedia

追記:
でも、ひょっとしたらそんな深い意味はなくて、たんにindexのiかもしれないなぁ。

追記:
変数名の間違いを修正。
変数名iに関しては、Fortranの名残だという説が一般的なようです。
そういえばあれは、変数名によって型が決定される言語でしたっけね。

4 comments:

齊藤 said...

カウンタの変数名としてiから使うのは古いFortranの仕様に由来する説が有力です。変数名i ~ n は整数として解釈されたため、カウンタとして使うときはiからというのが慣例だったとのこと。FAQなので続きはウェブで。

Anonymous said...

出遅れた! 私も斉藤さんのおっしゃるとおりFORTAN(!Fortran)が由来だと思います。が、そのFORTRANでi~nが採用された理由は諸説あり、結局数学的に正しいから、というものだったと思いますので、イオタかインデックスのiかは定かではありません。

私の先生に聞きましたところ、FORTRANでは行列に対してはIとJを使っていたが、ふだんは視認性のためにIとKを対に使うことが多かったとのこと。なにしろ、カンマとピリオドを打ち間違えて……という都市伝説があるくらいですからね。

Anonymous said...

あれ?
Predは述語(boolを返す関数(オブジェクト))だから、この場合は意味が通らないんじゃないかと。

江添亮 said...

おかしいなと思いながら書いていたのですが、
どうも、引数名を見るとき、上下にあるアルゴリズムと混同したようです。