メッセージ (コンピュータ)
メッセージ（）とは、言付け、伝言、伝送文などの意味がある。
計算機科学におけるメッセージパッシングとは並列コンピューティング、オブジェクト指向、プロセス間通信で使われる通信方式である。プロセスもしくはオブジェクトといったモデルではメッセージ(ゼロ以上のバイト、複雑なデータ構造、プログラムコードも)を送ったり受けたりできる。メッセージを待つことによって同期 (計算機科学)することも出来る。メッセージパッシングに基づく主なモデルとしてアクターモデルやプロセス代数がある。
メッセージパッシングはひとつもしくは多くの受信者に対して送信者がデータを配送できる通信方法である。メッセージの形として遠隔メソッド呼び出し（RMI）、シグナル、データパケットなどがある。メッセージパッシングシステムを設計するとき、下記のような方針から設計方針を選択する。
重要な理論上の基礎であるアクターモデル、プロセス計算といった並行計算はメッセージパッシングを基礎としている。メッセージパッシングを使った並行システムは、言語内の機能としてメッセージパッシングする場合と言語からの一連のライブラリ呼び出しで実現する場合がある。
前者の例は多くの分散オブジェクトシステムが含まれる。後者の例としては、カーネルとサーバブロック間でメッセージをやりとりするマイクロカーネルオペレーティングシステムや、高性能計算における がある。メッセージパッシングの概念は、グラフモデル上のベイズ推定などでも使われている。
などのオペレーティングシステムにおいて、メッセージとは、オペレーティングシステム上で動くアプリケーションで、オペレーティングシステムが管理しているデバイスからの入力をアプリケーションまで伝えることまたはその内容のことである。
オペレーティングシステムはメッセージをメッセージキューに保管し、アプリケーションはメッセージキューに保管されていたメッセージを受け取り、それを元に処理を行う。例えば「(10, 20) 左クリック」という情報をオペレーティングシステムが感知したらオペレーティングシステムはその情報をメッセージキューに保管する。アプリケーションはそのメッセージを受け取って対応した処理を行う。
アプリケーションは常にオペレーティングシステムからのメッセージを待機するようなプログラムになっており、この一連のプログラムの機構をメッセージループという。
分散オブジェクトや ONC RPC、、、、、、、、、 のような遠隔メソッド呼び出しや似たものはメッセージパッシングシステムである。メッセージパッシングシステムは共有のないシステムと呼ばれている。なぜならば、メッセージパッシング型のシステムは、メッセージという抽象化によってその下位に存在する状態変化や実装などを隠蔽するものだからである。
メッセージパッシングモデルはデータを端末（アクター、プロセス、スレッドなど）に送信するような通達方式で、プログラミング言語で典型的に定義されている。そのようなメッセージングはによってWebサービスの中で使われている。この考え方はパケットより大きく、任意に信頼性や耐久性や安全性やトランザクションを追加したものを除く高いレベルのメッセージデータグラムである。メッセージもまた一般的に同じ向きのプロセス間通信につかわれる。また別の一般的に使われる技術はストリームもしくはパイプで、そのようなデータは初歩的なデータアイテムの一連として送信される（仮想回線の高等レベルでは）。
同期メッセージパッシングシステムでは送信者と受信者がお互いにメッセージの転送を待つ。つまり、送信者は受信者がメッセージを受信するまでプログラムを再開できない。
同期通信は二つの利点がある。利点の一つ目はメッセージ転送において送信者と受信者で同期をとるため、プログラムを単純化できることである。利点の二つ目はバッファを必要としないことである。メッセージはいつでも受信側に保存される。なぜならば、送信者は受信者の準備が完了するまで送信を待つためである。
非同期メッセージパッシングシステムは受信者から送信者に準備が出来る時間を待たずにメッセージを送る。非同期通信の利点はお互いに待つことがないので、お互いの計算をオーバーラップして行える。
同期通信は送信者がいつも受信者が続ける前にメッセージを応答したことを確実にする非同期通信をベースに築かれている。
非同期通信はバッファを必要とするが、そのバッファが満杯になると問題の原因になる。送信者をブロックするか今後のメッセージを切り捨てるか判断をしなければならない。送信者をブロックはすれば、予期しないデッドロックを引き起こすかもしれない。メッセージを捨てた場合通信の信頼性は無くなる。
メッセージパッシングはプログラム間で情報を受け渡す為のもうひとつの通信方法、つまりCallと対比されるべきである。伝統的なcodice_1においては、引数は典型的には一つ以上のレジスタか引数のアドレスを内包しているパラメタリストを通じて(受信者の)"callee"に渡される。この通信形式はメッセージパッシングと比較して少なくとも三つの大きな違いがある。
メッセージパッシングではどの引数も、新しいメッセージの中にコピーするのに十分なメモリを余計に必要とする。これはオリジナルの引数のサイズの大小によらない。一つの引数がwebページを記述するHTML文字列10,000オクテットとして(この記事と同じ位のサイズ)、受信プログラム(ローカルプログラムでないならば)に完全にそのサイズをコピーして(そして送信しなければならない)。
対照的に、callならば、それぞれの引数に対してアドレスを渡すのに4から8バイトしか必要でない、さらにレジスタならゼロストレージで、ゼロ送信タイムである。これは勿論分散システムでは不可能である。受信者のアドレス空間の(絶対)アドレスがリモートプログラムでは通常意味が無いからである。ただし、もし、calleeが前もってcallerのメモリの完全な(少なくとも一部)コピーを有していたなら相対アドレスが利用可である。オブジェクト指向の幾つかの専門用語の中にメッセージはオブジェクトにコントロールを渡すという意味で使われる。もしオブジェクトがそのメッセージに応答したならばそれはそのメッセージに対するメソッドを持っている。詳しくはオブジェクト指向プログラミングを参照すること。
純粋なオブジェクト指向ではメッセージパッシングは排他的にダイナミックディスパッチに投げられる様に機能する。
同じメッセージを二回同じオブジェクトに送信した場合、普通そのメソッドを二回請求する結果となる。もし、名前と引数が同じならば二つのメッセージは同じメッセージタイプと考えられている。
オブジェクトは自分のメソッド本体から他のオブジェクトにメッセージを送信できる。メッセージパッシングシステムの中で、究極遅延束縛）が可能である。
アラン・ケイ は彼の視点のオブジェクト指向プログラミングの中ではオブジェクトよりも重要なコンセプトだが、人々はよくそのポイントと場所を見逃し、オブジェクト自体に重点をおきすぎ、十分メッセージをその間に送ってないと主張した。ライブ分散オブジェクトのプログラミングモデルはこの所見を踏まえて作られた。それは分散型データフローのコンセプトを使い複雑な分散型システムの振る舞いをメッセージパターンの（高レベル）機能スタイル仕様書とみなした。
幾つかの言語では、あるオブジェクトがメッセージを処理するメソッドを持っていなくとも、それを持っているであろう他のオブジェクトを知っている場合に、メソッド呼び出しを1つのオブジェクトから他のオブジェクトに転送、もしく委譲することをサポートしている。メッセージ転送を参照。
1977年、カール・ヒューイットは計算制御構造は「メッセージパッシングのパターン」と見ることができると主張した。
Smalltalk及びSelfやObjective-CなどSmalltalk系統のオブジェクト指向言語においてメッセージは、メソッドを起動するセレクターと引数の組み合わせ、およびセレクターと引数を合わせたオブジェクトを示す。
result := receiver + 1.
result := receiver selector.
result := receiver selector: 0 and: 2.
例えば上記の式であれば、 codice_2とcodice_3とcodice_4が前者のメッセージとなる。C++系統の言語におけるメンバー関数の呼び出しに類似しているが、Smalltalk系統の言語はメンバー関数の実装部分にあたるメソッドとメッセージは独立した存在であり、メッセージはクラスに紐づかない。また、必ずしもセレクターとメソッドは一対一ではなく一つのメソッドに複数のセレクターを取り付けることができ、セレクターが異なるメッセージを同じメソッドで処理することができる。また、メッセージと対応したメソッドが一切存在しないオブジェクトでもメッセージを受信することが可能になっている。