いろいろな言語で、キーと値とを対応づけるデータ構造、いわゆる連想配列、辞書、……たちがどのように呼ばれているか、気になったので調べてみた。
おおよそ、対応表(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), mapping (SRFI-146)
- 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 と呼んでいる。
SRFI-146 では高階関数の map
との名前の衝突を嫌い map ではなく mapping という名前を採用している(Schemeでは手続きの名前を データ型-操作 の形式で付ける慣習があるため、 map データ型に対する map 操作は map-map
という名前になってしまう)。
ちなみに、『プログラミング Perl 改訂版』(Larry Wall, Tom Christiansen, Randal L. Schwartz 共著、近藤嘉雪訳、オライリー・ジャパン、 1997) p.8 ではhashという名前の由来について以下のように解説している:
そのためハッシュは「連想配列」(associative array)と呼ばれることもある。しかし、これは怠惰なタイピストにとってタイプするのが面倒だし、頻繁に使われるので、私たちはもっと短かくて、ぴりっとした(snappy)呼び名を付けることにしたのだ。「ハッシュ」という名前を選んだ別の理由は、中身が順番付けされていないことを強調するためである(ハッシュは、内部的にはハッシュ表を使って実装されている。ハッシュに値をどんなにたくさん格納しても、動作が速いのは、ハッシュ表のおかげである)。
さらにちなみに太古の Ruby は Dictionary
や Dict
という名前を使っていた時期があるようである。 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
は存在しない。