Help us understand the problem. What is going on with this article?

いろいろな言語での 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 は存在しない。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away