1. dico_leque

    No comment

    dico_leque
Changes in body
Source | HTML | Preview

いろいろな言語で、キーと値とを対応づけるデータ構造、いわゆる連想配列、辞書、……たちがどのように呼ばれているか、気になったので調べてみた。

おおよそ、対応表(map)、辞書(dictionary)、実装の名前をそのまま(hash-table)、 Perl風(hash)に分けられると思う。

Common Lisp:
hash-table
Scheme:
hash-table (SRFI-69, SRFI-125 → R7RS-large), hashtable (R6RS Scheme, SRFI-126), map (SRFI-44)
Haskell:
Map
OCaml:
Hashtbl, Map
SML:
hash_table (sml-nj-lib)
C++:
map, multimap, unordered_map, unordered_multimap
Java:
Map, HashMap, Hashtable, LinkedHashMap, TreeMap, WeakHashMap, ...
Scala:
Map, HashMap, ListMap, SortedMap, TreeMap, LinkedHashMap, MultiMap, OpenHashMap, WeakHashMap, ...
ECMAScript:
Object, Map
Perl:
hash
Ruby:
Hash
Smalltalk:
Dictionary
Python:
dict
PHP:
array

この他に、配列/リストにキー・値の対応関係を格納したものを連想配列/連想リストとよび、それらに対する操作を提供している言語もある(例えば、 Ruby の Array#assoc、 Lisp の assoc、 OCaml の List.assoc)。

その他の言語での呼び名や、構造を操作する関数/メソッドの名前、リテラル表記、等々の比較については、 syntax across languages per category / dictionary も参照。


Scheme の SRFI-44 では M:1 のもの(M 個のキーをそれぞれ1つの値に対応づける)を map と呼び、 M:N のもの(M 個のキーをそれぞれ複数個の値に対応づける)を dictionary と呼んでいる。


ちなみに、『プログラミング Perl 改訂版』(Larry Wall, Tom Christiansen, Randal L. Schwartz 共著、近藤嘉雪訳、オライリー・ジャパン、 1997) p.8 ではhashという名前の由来について以下のように解説している:

そのためハッシュは「連想配列」(associative array)と呼ばれることもある。しかし、これは怠惰なタイピストにとってタイプするのが面倒だし、頻繁に使われるので、私たちはもっと短かくて、ぴりっとした(snappy)呼び名を付けることにしたのだ。「ハッシュ」という名前を選んだ別の理由は、中身が順番付けされていないことを強調するためである(ハッシュは、内部的にはハッシュ表を使って実装されている。ハッシュに値をどんなにたくさん格納しても、動作が速いのは、ハッシュ表のおかげである)。


さらにちなみに太古の Ruby は DictionaryDict という名前を使っていた時期があるようである。 Index of /pub/ruby/1.0/ で公開されている ruby-0.49.tar.gz の ChangeLog には以下のような記述がある。

Thu Jul 14 11:18:07 1994  Yukihiro Matsumoto  (matz@ix-02)

        * autoexec.c: 削除. autoload関係の機能は今後検討しよう.

        * dict.c: 辞書クラスの正式名称をDictに変更した. 別名としてHashを用
          意した. 今までDictionaryなどと長い名前にしていたが誰も使っていな
          かったしね. *BACKWARD INCOMPATIBILITY*

この時期の Ruby には dict.c というファイルが存在する。

ruby-0.71.tar.gz の ChangeLog には以下のような記述がある。

Mon Mar 27 15:41:43 1995  Yukihiro Matsumoto  (matz@ix-02)

        * dict.c: Dict->Hashに全面的に移行.

0.71 にはもう dict.c は存在しない。