Edited at

いろいろな言語での Map, Dictionary 的なものの名前

More than 1 year has passed since last update.

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

おおよそ、対応表(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 は 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 は存在しない。