• ベストアンサー

ATOMは何の略ですか

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

質問者が選んだベストアンサー

  • ベストアンサー
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.4

#3 です. 基本的 (原始的?) な Lisp では,あらゆるデータおよびプログラムを二分木で 表現します.したがって,その要素は葉 (数値,文字列,シンボル (後述) など) と,中間節点 (リスト・セル,ドット対,cons などと呼ばれる) に分けられます. 後者は二分木またはその部分木 (の根節点) なので,さらに左の部分木 (car) と右の部分木 (cdr) に分けられますが,葉は分けられません.このため葉は アトム (atom:不可分なもの) と呼ばれます. (ただ実際には,アトムも物理的な原子と同様,内部構造を持っています.) S式 http://nicosia.is.s.u-tokyo.ac.jp/pub/staff/hagiya/kougiroku/rec/s-exp.txt ⇒ アトム,ドット対 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+cdr+%22%E4%BA%8C%E5%88%86%E6%9C%A8%22+%E3%82%A2%E3%83%88%E3%83%A0&btnG=%E6%A4%9C%E7%B4%A2&lr=

string
質問者

お礼

お礼、遅くなり申し訳ございません。 noocyte様の造詣の深さに脱帽いたしました。 完全に理解することができました。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.3

全くの個人的推測ですが,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" (原子) と呼ぶ理由についてはまた後で書くつもりです.

string
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

>ATOMは何の略でしょうか。 略称だと思われた理由はなんでしょうか? MSDNなどを見る限り略称などとは書かれていませんが。。。 >ATOMは具体的にどのようなメンバ変数をもつ構造体でしょうか。 ATOM型の実態は構造体ではなく、WORD型の変数です。(参考参照) ATOMテーブルとはOSなどがアプリケーションを一意に 認識させる為の仕組みとして作られています。 初心者レベルならWindowsプログラミングを行う上で、 開発者側が気にすることは特に無くウィンドウクラスの登録、 成功可否の判断が出来れば十分です。 私の考えですが、ATOMプログラミングを使う場合は、 使わないと本当に出来ないのか検討するべきです。

参考URL:
http://mtbeta.msdn.microsoft.com/ja-jp/library/aa920765.aspx?altlang=ja-jp
string
質問者

お礼

おっしゃるとおり、WORD型でした。 >略称だと思われた理由はなんでしょうか? まさか、原子という意味の単語が唐突に出てくるとは思わなかったというのが理由です。

string
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
  • crew21
  • ベストアンサー率26% (58/222)
回答No.1

オレはWindowsプログラミングやらないから正確な説明をしてあげられないけど、 要はATOMは「原子」のことだから、「分割不可能」という意味合いを持つんじゃないかな。 例えばJavaで、void synchronized aaa() { (略) } とした場合は、synchronized というキーワードが分割不可能の役割を果たして、 あるスレッドがaaa()を実行中は、他のスレッドがaaa()を実行できない(同時実行できない)、ということになるんだ。 実際、「シンクロナイズドにした」なんて言いにくいから、「アトミック」にした、っていう言い方をします。 要はスレッドの観点からすると、分割不可能な関数ということになる。 だからたぶん、質問者さんが書いているATOM型ってのも、そんなような意味合いを持つ型なんじゃないかな。 ハズしてたらすまん。

string
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • windowsの構造体にはなぜ自身のサイズを指定しないといけないのか?

    windowsのプログラミングをしていると、cbSizeというその構造体自身を 意味するメンバ変数がよく出てきます。 質問は、これが一体なぜ必要なのか?についてです。 内部でその構造体を生のメモリにコピーすることがあり、その場所では その構造体の宣言がなぜか参照できないからか?などと思っていますが、今一 よく解っていません。 これについてご存知方がいらっしゃいましたらご教授お願いします。

  • void関数などとATOMについて

    最近Windowsプログラミングを始めました。 で、思ったのですが、 void(int hInst) と ATOM InitAPP(HINSTANCE hInst) ってなんか同じような感じがするのですが・・・。 まだ始めたばかりなのでわかりません。

  • 構造体変数がないとメンバ操作できないのはなぜ?

    C言語の構造体に関して質問がありますが、structで型を作成して、構造体変数にてメンバの代入・参照をする。ということなんですが、なんでメンバ操作には構造体変数からでないといけないのでしょうか? 直接、型枠にてメンバ操作をすれば良いのに、なぜ構造体変数から操作しないといけないのでしょうか? 「クラス」や「オブジェクト」みたいに、一々ゼロから作成したり、コピペで作成しなくても済むように、このような形になっているのでしょうか? 回答の方よろしくお願いします。

  • gooブログのRSS/ATOMのURLって?

    ブログのリンクサイトに、自分のgooブログを登録しようとしたところ RSS/ATOMのURLを書き込むところがありました。 RSSもATOMもよく分からず、gooブログの何処に表示してあるのかも分かりません。 また、そこにはチェックするところがあり 1、未使用 2、自動検出 3、RSS形式 4、ATOM形式 どこにチェックしていいのか分かりません。 誰か具体的に教えて下さい。

  • C++、クラスメンバの構造体配列の初期化について

    クラスのメンバに構造体の配列を持っていて、その構造体はfloat値を4つ持ってます。 私はいつもメンバ変数の初期化はコンストラクタでしています。 クラス生成時に全てのfloatを0で初期化したいのですが、これはコンストラクタでfor文を回すしかないのでしょうか? 一文で初期化することは出来ないのでしょうか? 話は少し変わってしまいますが、今思ったのですがコンストラクタで値を決めるのは初期化じゃなくて代入と呼ぶのですかね? ご助力よろしくお願いします。

  • 参照送りした構造体のメンバ変数の扱い方が

    自作関数に構造体のポインタを送り、メンバ変数の値を扱いたいのですが、 &で送り、*で受け取り、*とアロー演算子でメンバを指定しても 「error C2100: 間接指定演算子 (*) の使い方が正しくありません。」 と出てしまいます。 変数と構造体とでは勝手が違うのでしょうか? どうすればメンバ変数の値を扱えるのでしょうか。

  • リスト構造の設定のしかた

    メンバ変数が配列のlist_before構造体に設定してあるものを、リスト構造のlist_after構造体に設定し直したいです。 どのように設定すればいいのでしょうか? また、list_before構造体とlist_after構造体を引数にした関数で設定したいのですが呼び出し元と先の引数はどう書けばいいのでしょうか? その際の構造体とメンバ変数は以下になります。 ご教授どうぞ宜しくお願いいたします。 struct list_before { char *name[5]; int size[5]; }; struct list_after { char *name; int size; struct list *next; };

  • VC++.NETのビルドエラーについて

    未経験で入社し、現在自習中のプログラマ見習いです。 ビルドエラーについて、解決の糸口を 教えていただけないでしょうか。 「Visual C++(1)はじめてのWindowsプログラミング」 山本信雄著の内容通り、サンプルプログラムを 入力しビルドしようとするとエラーとなりました。 APIのみを使って、「何もしない」空のウインドウを 出すだけのプログラムです。 二件あり、ひとつはウインドウクラス構造体の メンバの一つで、 C2039: 'hIcomSm' : 'tagWNDCLASSEXA' のメンバではありません。 という内容です。 もう一件が、アプリケーション終了の際にWinMainの 戻り値となるwParamメンバ(MSG構造体)です。 C4244: 'return' : 'WPARAM' から 'int' に変換しました。データが失われているかもしれません。 本通りに記述したつもりなのですが、エラーに なりました。環境がVC++6.0ではなく.NETであることと 関係するのか、単なる記述ミスなのか、判断できません。 どなたかヒントを頂けないでしょうか。 よろしくお願いします。

  • グローバルな構造体のメンバ変数のアドレスの取得

    グローバルな構造体のメンバ変数のアドレスはどうやって取得したらいいでしょうか?

  • C++のソースをライブラリ化すると問題が・・・・・・

    他の人のプログラムをLibにして流用しようとしているのですが, 問題にぶち当たってます. Libで定義されているクラスに, ある情報を取得/格納できるクラスがあるのですが, いざ,そのクラスをインスタンス化し, クラスで定義してあるメソッドを実行してインスタンスのメンバ変数に情報を格納した後に,インスタンスのメンバの情報をメソッドなどは使わずに取り出そうとすると一部の情報が格納されておらず抜き出すことができません. そのクラスにはシングルトンで実装されており,クラスが持っている情報表示用メソッドを実行すると,ちゃんと,格納されてるぽいのですが・・・・・.もちろん,メンバ変数はパブリックです. 唯一違うとすれば,取り出すことができるメンバの型はdoubleで,取り出せないのはVector< (独自の構造体) >という点くらいです・・・・.エラー内容は取り出せないというよりはVectorのメモリが確保されていないような感じです. 当然,Libをexeで起動した場合は正常に動いているます. 何か思いつく原因は無いでしょうか?? 宜しくお願いします!!