発表した並行計算の数学的モデルの一種[1]。アクターモデルでは、並行デジタル計算の汎用的基本要素として「アクター」という概念を導入している。アクターモデルは並行性の理論的理解のフレームワークとして使われるほか、並行システムの実装の理論的基礎としても利用されてきた。外部リンク歴史[編集]アクターモデルはそれ以前の計算モデルとは異なり、物理法則を発想の基本としている。他にも、LISP言語、Simula言語、ケーパビリティ・システム、パケット通信、初期のSmalltalkなどの影響を受けている。アクターモデルは「数百・数千のマイクロプロセッサから構成され、個々にローカルメモリを持ち、高性能通信ネットワークで通信を行う並列コンピュータが近い将来登場するとの予測」から開発された[2]。その後、Webサービスやメニイコアアーキテクチャを活用した超並行性にも範囲を広げてきた。アクターモデルの操作的意味論を開発した[3]。ヒューイットはアクターシステムの公理的法則群を発表した[4]。基づいたアクターモデルの表示的意味論を発表[2]。意味論に基づいた遷移ベースの意味論モデルを構築した[5]。これらにより、アクターモデル理論が完成した。率いられたチームはアクターモデルに基づくメッセージパッシングを使用したコンピュータアーキテクチャを構築した。日本では、東京大学や京都大学での研究があり、特に東京大学の米澤明憲らの研究が有名である。基本概念[編集]アクターモデルの基本は「全てのものはアクターである」という哲学である。これはオブジェクト指向プログラミングにおける「全てのものはオブジェクトである」という考え方と似ているが、オブジェクト指向ソフトウェアでは基本的に逐次的に実行するのに対して、アクターモデルでは本質的に並行性を備えている点が異なる。Entity)である:(他の)アクターに有限個のメッセージを送信する。有限個の新たなアクターを生成する。次に受信するメッセージに対する動作を指定する。これらの振る舞いには逐次性は前提とされておらず、並列的にこれらを実行する。他のアクターとの通信は非同期に発生する(すなわち、送信側アクターはメッセージが受信されるのを待たずに次の計算に移行する)。メッセージを送信する相手のアクターはアドレスによって指定される(これをアクターの「メールアドレス」とも呼ぶ)。結果として、アクターはアドレスのあるアクターとのみ通信可能であり、他のアクターのアドレスは以下のような方法で獲得される:受信したメッセージ内にアドレスが書いてある。そのアクターが何らかの方法で既に相手のアドレスを知っている。そのアクターは生成したアクターである。アクターモデルは、アクター自体およびアクター間の計算の本質的並行性を特徴とし、メッセージ内にアクターのアドレスを含め、相互のやりとりは到着順が保証されない直接的非同期メッセージパッシングのみである。形式体系[編集]長年にわたり、アクターモデルを理解するための形式体系が開発されてきた。以下のようなものがある:操作的意味論[3][6]アクターシステムの法則[4]表示的意味論[2][7]遷移意味論[5]アクターモデルのメッセージパッシング機能を完全には形式化していない点でアクターモデルそのものには対応していない形式体系として、以下のようなものがある:いくつかのアクター代数系[8][9][10]線形論理学[11]応用[編集]アクターモデルは、各種並行システムのモデリングや理解のフレームワークとして利用可能である。以下のような例がある:電子メールはアクターシステムとしてモデル化可能である。アカウントをアクターとしてモデル化し、メールアドレスをアクターのアドレスとする。Webサービスは、SOAPによる通信をするものをアクターアドレスとしてモデル化できる。Serializer」としてモデル化できる。シリアライザはメッセージを連続的に受信可能なアクターの一種であり、シリアライザ向けに送信されたメッセージは必ず受信されることが保証される。Notation)はアクターモデルにある程度基づいている。主要テスト部品(MTC)がある。テスト部品は(他のテスト部品やテストシステムと)メッセージを送受信し、通信相手をアドレスで識別する。各テスト部品は固有の動作ツリーを持ち、並行的に動作し、他のテスト部品を動的に生成する。組み込み言語機能により受信したメッセージの種類に対応した動作を記述できる。アクターモデル以前[編集]アクターモデルは、それ以前の以下のような計算モデルの上に構築された。最初のメッセージパッシングプログラミング言語でもある。Simula最初のオブジェクト指向型のメッセージパッシング言語。真の並行性はなく、コルーチンを使用している。Smalltalkアラン・ケイはヒューイットのPlannerに影響を受けてSmalltalk-71を考案したが、それとは別にSimulaやLisp、Logoの要素と自分のメッセージパッシングのアイデアを組み合わせたSmalltalk-72をダン・インガルスらとともに開発していた。ヒューイットはAltoで動くSmalltalk-72のデモを見てそのアイデアに興味を引かれたが、メッセージパッシング方式の複雑さは気に入らなかった。メッセージパッシングに基づいた並行計算の数学的モデルはSmalltalk-72よりも単純化すべきであるとの考えが生まれた。Smalltalk-72やそれ以降の-76、-80には、Simulaになかった特徴として、整数などの基本的データ型もメッセージの受け手とした点が挙げられる。ペトリネットアクターモデル以前に広く使われていた並行計算用モデル。ペトリネットは制御フローはモデル化できるが、データフローをモデル化できないという弱点があった。ヒューイットが指摘した問題として、動作の同時性がある。ペトリネットでの不可分な計算ステップはトークンが入力箇所から消え、「同時に」出力箇所に出現することになっている。ヒューイットはこのような特徴を前提としたモデルでは実際の並行システムにそぐわないと考えた。そのような問題があってもペトリネットは現在も使われており、熱心な研究が行われている。メッセージパッシング意味論[編集]アクターモデルはメッセージパッシングの意味論でもある。無制限の非決定性に関する議論[編集]最初の並行プログラムは割り込みハンドラであった。コンピュータは通常処理の最中に外部(キーボード、ネットワークなど)からの情報を受け取る必要が生じた。そこで、情報が到着すると、コンピュータは割り込まれ、割り込みハンドラと呼ばれる特別なコードが呼び出されて情報をバッファに取り込み、逐次的に処理できるようにする。Processes」というパラダイムの始まりであり、この並行プログラムは、バッファを使って同期的に通信した逐次プログラムを並列に並べたものであった。共有メモリを伴う並列性は並行性制御という問題を生じた。元々は、これは1つのコンピュータ上の排他制御の一種であると考えられていた。これらの解決策は共有リソースへのアクセスをカプセル化するプログラミング言語構文には採用されなかった。初期の計算モデル(チューリングマシン、ラムダ計算など)は数学に基づいており、状態によって計算「ステップ」を表現した。各計算ステップは、ある状態から別の状態への遷移である。このような状態遷移的手法は、非決定性のものを含む有限状態機械などのオートマタ理論へと発展していった。非決定性オートマトンには有限の非決定性があり、マシンが初期状態から動作開始したとき常に停止するなら、停止するときの状態数は有限である。エドガー・ダイクストラは、この非決定的な状態遷移手法の研究を進めた。ダイクストラのモデルをきっかけとして無制限の非決定性に関する議論が発生した。無制限の非決定性[12]は、並行性の特徴であり、共有リソースの衝突の仲裁の結果として、サービスの遅延が無制限に発生することを意味する(タイムアウトなど、サービスを打ち切る仕様でない場合)。ヒューイットはアクターモデルにはサービスの保証を提供するとした。結果として、ダイクストラのモデルはサービスの保証を提供できなかった。ダイクストラは無制限の非決定性を実装することは不可能であると主張した。ヒューイットは調停回路と呼ばれる計算回路が安定するのにかかる時間に制限はないと主張した。調停回路はコンピュータが外部からの入力(キーボードからの入力、ディスクアクセス、ネットワークからの受信など)をクロックとは非同期的に処理する状況で使われる。そのため、あるメッセージがコンピュータによって受け取られるまでにかかる時間には際限がなく、その間にコンピュータが遷移する状態数にも制限がない。領域理論を使った数学的モデルで無制限の非決定性を導入している[2]。アクターモデルには、グローバルな状態という概念はない。通信と非同期性[編集]アクターモデルではメッセージをバッファに蓄える必要はない。この点はかつての並行計算のモデルとは明確に異なっている。バッファがないという点は当初から誤解されがちで、議論となる問題である。メッセージは「エーテル」や「環境」によってバッファリングされると主張する研究者もいた。「エーテル」は非常に良いバッファとは言えない。エーテルに置かれたメッセージは、受け取られるまでそこに留まるわけではない。アクターモデルでのメッセージは(IPのパケットのように)単に送られる。受信側と同期的なハンドシェイクをする必要はない。アドレスを伴うアクター生成は可変なトポロジーを可能にする[編集]アクターモデルの自然な発展として、メッセージ内のアドレスが含まれるようになった。1964]に影響され、ヒューイットは形式が固定されていない通信を使った新たな並行計算のモデルを提案した。メッセージは空でもよい。送信側が受信側に新たなアクセスすべきアドレスを伝えたい場合、通信によってそれが伝えられる。計算によっては、メッセージを受け取った側からの応答を得たい場合がある。そのためには、resumption(再開)と呼ばれる別のアクターのアドレス付きでメッセージを送る(継続またはスタックフレームとも呼ばれる)。メッセージにアクターのアドレスを含めることによって、アクター間の関係は可変なトポロジーを形成することができる。オブジェクトが可変トポロジーの関係を持つのと似ている。本来的な並行性[編集]逐次的プロセスの合成に基づく従来の手法とは異なり、アクターモデルは本来的に並行的なモデルとして開発された。アクターモデルでの逐次性はアクターモデル理論で説明されるように並行計算の特殊ケースである。メッセージ受信の順番は不同[編集]アクターモデルで送信された順番にメッセージが受信されるべきだという要求にたいしてヒューイットは反論した。出力の順序付けが必要なら、その機能を持つキューの役割をするアクターを導入すればよい。キュー・アクターは到着したメッセージをFIFO順にキューイングする。到着するとは限らない。この点でアクターモデルはパケット通信システムを反映している。パケット通信ではパケットが送信順に受信されることを保証していない。受信順を保証しないことで、パケット通信はパケットをバッファリングしたり、様々な経路でパケットを送信したり、パケットを再送したりといった最適化を可能としている。アクターはメッセージ処理をパイプライン化できる。これはパイプライン化することもできるというだけであって、必ずそうしなければならないということではない。メッセージをパイプライン化するかどうかはエンジニアリング上のトレードオフの問題である。パイプライン化可能なアクターの定義には曖昧さは全くない。トポロジー[編集]ロビン・ミルナー[1973]の論文は逐次型プロセスの合成でない並行性を扱っているという点で特筆すべきものである。アクターモデルとの違いは、固定個のプロセスを固定されたトポロジーで配置し、同期式のバッファ付き通信を使用している点である。モデルは、固定個の逐次型プロセスで構成された固定のトポロジーを持ち、同期式のバッファ付き通信を使用する。ミルナーやホーアの初期のモデルは、有限の非決定性を持つ。局所性[編集]アクターモデルの重要な特徴の1つとして、局所性がある。局所性とは、メッセージを処理するときにアクターがメッセージを送信できる相手はアドレスを知っているものに限られるということを意味する。複数の位置を同時に変更することがないことも局所性と称する。この点は他の並行性モデルとは異なる。ペトリネットモデルではトークンは同時に複数の場所から削除され、別の複数の場所に配置される。合成性[編集]合成性(Compositionality)とは、アクターシステム群から大きなシステムを構成できることを意味する。Talcott[6]で展開された。behavior」の導入により、アクターのメッセージ処理を数学的関数として記述できるようになった。振る舞いは並行性における共有を数学的にモデル化する機構を提供する。トークン・ストリーム・インタプリタのような)実装の詳細から解放された。アクターモデルで記述されたシステムを効率的に実装する際、大規模な最適化が必須となることは重要である。数理論理学との関係[編集]アクターモデルの開発と数理論理学との関係は興味深い。その開発の主要な動機として、Planner言語の開発で生じた制御構造問題を扱い、理解するという目的があった。主張に関連するモデルの能力を理解するという重要な目標があったのである。主張は、アクターモデルによる並行計算では偽であることが判明した(計算の不確定性参照)。主張は逐次計算やラムダ計算などの一部の並列計算では真であることから、この結論には未だに議論がある。それにも関わらず、論理プログラミングを並行計算に拡張しようという試みがなされた。Agha[1991]は、結果として生まれたシステムにおける計算ステップがその前のステップからの推論(演繹)ではないという意味で、演繹的ではないと指摘した。マイグレーション[編集]マイグレーション(Migration)とは、アクターが位置を変更可能であることを意味する。米澤明憲は学位論文で郵便局をアクターモデルでモデル化した。客をアクターとし、郵便局内で位置を変えながら何らかの処理をして出て行くというものである。マイグレートするアクターは位置アクターを導入することでモデル化できる。位置アクターはアクターのマイグレーションに応じて変化する。このモデル化は議論を呼び、現在も研究対象となっている。コンピュータネットワークなどの非局所的並行性)。このような並行性は指数関数的に増大しつつある。局所的並行性と非局所的並行性の間を埋める。透過性に関しては議論が続いている。研究者によっては、並行プログラミング言語(JavaやC#)による局所的並行性とSOAPによるWebサービスなどの非局所的並行性を明確に分けて扱うべきだとする。そのような分離は技術の進歩による並行性の移行(局所⇒非局所、あるいは逆)の際に透過性の問題となって現われる。