プロが教えるわが家の防犯対策術!

WINDOWSプログラミングで、ウィンドウクラスを登録した際、ATOM型の変数が返されます。ATOMは何の略でしょうか。
また、ATOMは具体的にどのようなメンバ変数をもつ構造体でしょうか。
よろしくお願いします。

A 回答 (4件)

#3 です.



基本的 (原始的?) な Lisp では,あらゆるデータおよびプログラムを二分木で
表現します.したがって,その要素は葉 (数値,文字列,シンボル (後述) など)
と,中間節点 (リスト・セル,ドット対,cons などと呼ばれる) に分けられます.
後者は二分木またはその部分木 (の根節点) なので,さらに左の部分木 (car)
と右の部分木 (cdr) に分けられますが,葉は分けられません.このため葉は
アトム (atom:不可分なもの) と呼ばれます.
(ただ実際には,アトムも物理的な原子と同様,内部構造を持っています.)

S式
http://nicosia.is.s.u-tokyo.ac.jp/pub/staff/hagi …
⇒ アトム,ドット対

Lisp の「シンボル (記号)」は,他のプログラム言語の「変数」を拡張したような
もので,名前を持ち,値やその他のデータ (へのポインタ) を格納できる構造体と
考えればいいでしょう.コンパイル言語の変数とは異なり,シンボルは実行時に
生成できます.

機能的にはスクリプト言語の連想配列と似ていますが,連想配列はコードの実行時に
検索を行うのに対し,シンボルの場合は Lisp プログラムを読み込む時に検索を行い
コードの実行時には検索なしで対応するデータにすぐアクセスできます.

X-Window の Atom が Lisp のアトムとどう関係しているかというと,
上記の「シンボル」に似た使い方をしているので Atom と名付けたのだと思います.
つまりデータが必要になるたびにその名前 (文字列) から検索するのではなく,
最初に文字列を intern しておいて (この時だけ検索を行う),検索結果へのポインタ
の役割を果たす数値 (つまり Atom) を求めておき,データへのアクセスにはこれを
使用する,という点が共通しています.

なお intern とは,(正確な定義は知りませんが私の理解では)
・指定された文字列が所定のデータベースに登録されていなければ登録する.
・登録済ならば,それをそのまま使用する.(二重登録エラーにはしない.)

Xlib - C Language X Interface:4章 ウィンドウ情報関数
http://xjman.dsl.gr.jp/X11R6/X11/CH04.html
⇒ Properties and Atoms

「Lisp car cdr "二分木" アトム」で検索.
http://www.google.co.jp/search?hl=ja&q=Lisp+car+ …
    • good
    • 0
この回答へのお礼

お礼、遅くなり申し訳ございません。

noocyte様の造詣の深さに脱帽いたしました。
完全に理解することができました。
どうもありがとうございました。

お礼日時:2008/01/26 15:05

全くの個人的推測ですが,Windows の ATOM は X-Window の Atom を


真似たものだろうと思います.これはいわば「動的列挙型」(実行時に
文字列と番号の対応を定義する) で,登録された文字列に対応する番号
が Atom (X-Window の場合は32ビット無符号整数) です.

一旦登録してしまえば,文字列を使うよりも Atom を使う方が,

 ・比較や検索が高速に行える.
 ・可変長データではなく固定長整数なので,メモリ管理がしやすい.
 ・X-Window の場合はネットワーク経由で Atom を送受信することがあり,
  そのメッセージを固定長かつ短くでき,通信の高速化につながる.

などの利点があります.ただし Windows の ATOM は X-Window に比べて使用
範囲が極めて限定されているので,あまりメリットはないように思います.

X-Window の Atom の起源を更に遡ると,(少なくとも用語は) Lisp の
アトムに由来しているのではないかと思います.X-Window には文字列を
登録して Atom を取得する関数 XInternAtom() がありますが,
「atom を intern する」という言い方は Lisp 特有の言い回しだと思います.
今は時間がないので,X-Window の Atom と Lisp のアトムの関係や,"Atom"
(原子) と呼ぶ理由についてはまた後で書くつもりです.
    • good
    • 0
この回答へのお礼

お礼が遅れて申し訳ございません。
歴史的ご解説、どうもありがとうございました。
ずいぶんとお詳しいですね。
Lispを調べてみます。

お礼日時:2008/01/12 12:54

>ATOMは何の略でしょうか。


略称だと思われた理由はなんでしょうか?
MSDNなどを見る限り略称などとは書かれていませんが。。。

>ATOMは具体的にどのようなメンバ変数をもつ構造体でしょうか。
ATOM型の実態は構造体ではなく、WORD型の変数です。(参考参照)
ATOMテーブルとはOSなどがアプリケーションを一意に
認識させる為の仕組みとして作られています。

初心者レベルならWindowsプログラミングを行う上で、
開発者側が気にすることは特に無くウィンドウクラスの登録、
成功可否の判断が出来れば十分です。

私の考えですが、ATOMプログラミングを使う場合は、
使わないと本当に出来ないのか検討するべきです。

参考URL:http://mtbeta.msdn.microsoft.com/ja-jp/library/a …

この回答への補足

ご意見ありがとうございました。

補足日時:2007/12/13 08:39
    • good
    • 0
この回答へのお礼

おっしゃるとおり、WORD型でした。

>略称だと思われた理由はなんでしょうか?

まさか、原子という意味の単語が唐突に出てくるとは思わなかったというのが理由です。

お礼日時:2007/12/13 08:39

オレはWindowsプログラミングやらないから正確な説明をしてあげられないけど、


要はATOMは「原子」のことだから、「分割不可能」という意味合いを持つんじゃないかな。

例えばJavaで、void synchronized aaa() { (略) } とした場合は、synchronized というキーワードが分割不可能の役割を果たして、
あるスレッドがaaa()を実行中は、他のスレッドがaaa()を実行できない(同時実行できない)、ということになるんだ。

実際、「シンクロナイズドにした」なんて言いにくいから、「アトミック」にした、っていう言い方をします。

要はスレッドの観点からすると、分割不可能な関数ということになる。
だからたぶん、質問者さんが書いているATOM型ってのも、そんなような意味合いを持つ型なんじゃないかな。

ハズしてたらすまん。
    • good
    • 0
この回答へのお礼

なるほど原子という意味かも知れません。
ここだけ単語のそのままでてくるというのはおかしい気もしますが。
ご意見ありがとうございました。

お礼日時:2007/12/13 08:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!