(57)【特許請求の範囲】
【請求項１】
データコレクションの登録を受信するステップであって、前記データコレクションが第１のプログラムによって作成され、前記登録が前記第１のプログラムを実行する機械上のオブジェクトランタイムコンポーネントから受信される、ステップと、
前記第１のプログラムとは異なる第２のプログラムから前記データコレクションへの加入を受信するステップであって、前記データコレクションへの加入者のセットが存在し、加入者の前記セットが前記第１のプログラムおよび前記第２のプログラムを備える、ステップと、
前記加入者のうちの第１の加入者が前記データコレクションの状態に変更を行う第１の操作を前記データコレクションに実行したという第１の通知を受信するステップであって、前記加入者のうちの前記第１の加入者は、前記加入者のうちの前記第１の加入者が書かれたプログラミング言語がローカルコレクションに対する操作を実行するために提供するメカニズムを使用することによって、前記データコレクションが前記第１の加入者に対して完全にローカルであるかのように前記第１の操作を実行する、ステップと、
前記第１の操作に基づいて、前記加入者のうちの第２の加入者に、前記第２の加入者によって維持される共有コレクションのローカルコピーを更新させるために、前記状態の前記変更を前記第２の加入者に伝搬するステップと、
前記第２の加入者が前記データコレクションに第２の操作を実行したという第２の通知を受信するステップであって、前記第２の操作が前記第１の操作とは異なる、ステップと、
前記第２の操作を前記第１の操作に対して変換して、変換された前記第２の操作を前記第１の加入者に伝搬することによって、前記第１の操作と前記第２の操作との間の衝突を解決するステップと
を備える動作を実行するようにプロセッサーを使用するステップ
を備える、データコレクションの共有を容易にする方法。
【請求項２】
前記第２の通知が、前記データコレクションのアイテムの順序位置を使用して前記第２の操作を記述し、前記順序位置が、前記第１の操作が前記第２の操作の前に実行されるか、または前記第２の操作の後に実行されるかによって異なるアイテムを参照する、請求項１に記載の方法。
【請求項３】
前記伝搬するステップが、
前記第１の操作を実行することによって得られる、前記データコレクションの状態の前記加入者のバージョンに関連する変更の記述を、前記加入者に通信するステップを備える、請求項１に記載の方法。
【請求項４】
前記動作は、前記データコレクション内のアイテムのコンテンツの構造に関係なく実行される、請求項１に記載の方法。
【請求項５】
前記第１の通知が、前記データコレクションに実行される操作のタイプ、操作されているアイテムの前記データコレクション内の位置、および前記データコレクションの状態を備える、請求項１に記載の方法。
【請求項６】
プロセッサーと、
メモリーと、
前記メモリーに格納されて前記プロセッサー上で実行するコレクション共有コンポーネントと
を備え、
前記コレクション共有コンポーネントが第１の機械上にデータコレクションを作成する第１のプログラムから登録要求を受信し、第２の機械上で実行する第２のプログラムから前記データコレクションへの加入要求を受信し、前記第１のプログラムが前記第２のプログラムとは異なり、前記第１の機械が前記第２の機械とは異なり、前記コレクション共有コンポーネントが、加入者のセットの第１のメンバーから、前記データコレクションの状態を変更する第１の操作が前記第１のメンバーによって実行されたという第１の通知を受信し、前記状態が変更されたという第２の通知を加入者の前記セットの第２のメンバーに伝搬し、前記第２の通知は、前記第２のメンバーに、前記第１の操作に基づいて、前記第２のメンバーによって維持される共有コレクションのローカルコピーを更新させ、加入者の前記セットが前記第１のプログラムおよび前記第２のプログラムを備え、前記第１のメンバーは、前記第１のメンバーが書かれたプログラミング言語がローカルコレクションに対する操作を実行するために提供するメカニズムを使用することによって、前記データコレクションに対して前記第１の操作を実行し、前記第１のメンバーは、前記データコレクションが完全にローカルなコレクションであるかのように前記第１の操作を実行し、
前記コレクション共有コンポーネントが、前記第２のメンバーから、前記第２のメンバーが前記データコレクションに第２の操作を実行したという第３の通知を受信し、前記第２の操作を前記第１の操作に対して変換して、変換された前記第２の操作を前記第１のメンバーに伝搬することによって、前記第１の操作と前記第２の操作との間の衝突を解決し、前記第１の操作が前記第２の操作とは異なり、前記第１のメンバーが前記第２のメンバーとは異なる、データコレクションの共有を容易にするためのシステム。
【請求項７】
前記第２の通知が、前記データコレクションのアイテムの順序位置を使用して前記第２の操作を記述し、前記順序位置が、前記第１の操作が前記第２の操作の前に実行されるか、または前記第２の操作の後に実行されるかによって異なるアイテムを参照する、請求項６に記載のシステム。
【請求項８】
前記第２の通知が、前記第１の操作を実行することによって得られる、前記データコレクションの状態の前記加入者のバージョンに関連する変更の記述を備える、請求項６に記載のシステム。
【請求項９】
前記コレクション共有コンポーネントが、前記データコレクション内のアイテムのコンテンツの構造に関係なく前記第２の通知を伝搬する、請求項６に記載のシステム。
【請求項１０】
前記第１の通知が、前記データコレクションに実行される操作のタイプ、操作されているアイテムの前記データコレクション内の位置、および前記データコレクションの状態を備える、請求項６に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、共有データコレクションに関する。
【背景技術】
【０００２】
[0001]コレクションは、同時に操作されるべきデータアイテムの集まりである。コレクションのいくつかの例には、リスト、アレー、セット、バッグ、および他の様々なデータの集まりがある。プログラミングの黎明期には、プログラムは一般的に、互いに同時使用しないモノリシックのエンティティだった。したがってプログラムは、プログラマーが選んだ何らかの方法でコレクションを内部的に管理できた。しかし、現代のプログラミングでは、データの共有セットを操作することによって、同じプログラムの異なるインスタンス、または異なるプログラムが互いに同時使用することは、より一般的な慣行になった。
【０００３】
[0002]データを共有するために、プログラムが自身のメカニズムを実装することは可能であるが、それを行うことはプログラマーにとって一般的に面倒である。プログラマーは、共有メカニズムをプログラムの緊密に統合された部分として実装しなければならない可能性がある。たとえプログラマーが既存の共有メカニズムについてのコードを取得できても、そのメカニズムはしばしばプログラムの性質、および共有されているデータのタイプに特有のものである。また、他のプログラムが既存のプログラムとデータを共有したい場合、それらのプログラムを、同じ共有メカニズムが使用されるような方法で実装しなければならない。
【０００４】
[0003]プログラムがデータを共有できるようにすることは様々な問題を提示するが、コレクションの共有はさらなる問題を提示する。多くのタイプのコレクションにとって、コレクションの現在の状態は、コレクションのコンテンツによってだけでなく、それらのコンテンツが出現する順序によって定められる。たとえば、アレー｛１、２、３、４、５｝は、アレー｛２、３、１、５、４｝とは異なる。たとえそれらの２つのアレーが同じ基本要素（１から５までの数）を含んでいても、順序が異なるので、これらの２つのアレーは異なる状態を有している。コレクションの状態がいくつかのプログラムによって変更されうる場合、コレクションの状態、特に順序を維持することは、ある種の課題を提示する。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本発明は共有データコレクションを提供するものである。
【課題を解決するための手段】
【０００６】
[0004]共有コレクションの概念は、共有メカニズムをプログラマーにとって透過的にする方法で実装されうる。さらに、そのコレクションがいくつかの異なるエンティティによって操作されている場合、共有コレクションを実装するメカニズムは、コレクションのためにデータ収束を提供できる。
【０００７】
[0005]一例では、共有オブジェクトサーバーは、所与のどの時間にもコレクションの真の状態を維持することによって、コレクションの共有を管理する。コレクションにアクセスできるプログラムは、そのプログラムを実行している機械上の共有オブジェクトランタイムに接続しうる。共有コレクションにアクセスするプログラムは、そのコレクションを共有コレクションとして登録して、この登録はランタイムによって共有オブジェクトサーバーに通信されうる。コレクションにアクセスしたい他のプログラムも、そのコレクションを共有コレクションとして登録する。同様に、その登録がランタイムによって共有オブジェクトサーバーに通信される。さらに、プログラムはコレクションの変更通知に加入でき、加入要求はランタイムによって処理される。それぞれのプログラムは、コレクションのローカルコピーを維持する。コレクションの状態が何らかの方法で変更されると、変更が生じた機械上のランタイムが、その変更を共有オブジェクトサーバーに通信する。共有オブジェクトサーバーは、コレクションの真の状態をアップデートして、加入プログラムを実行している機械上の共有オブジェクトランタイムを通じてそのコレクションを登録した全てのプログラムに変更を通信する。次いで、これらのそれぞれのプログラムが、サーバーによって通信された状態変更に従ってコレクションのローカルコピーをアップデートする。コレクションに同時変更が生じた場合、共有オブジェクトサーバーは変更間のあらゆる衝突を解決して、コレクションの真の状態に決定論的に到達する。
【０００８】
[0006]他の例では、共有オブジェクトは、クライアント／サーバー方式ではなくピアツーピア方式で管理される。ピアツーピア実装形態では、共有コレクションへのそれぞれの加入者が、他の加入者に変更を通信できる。次いで、加入者が実行する機械上のランタイムは、あらゆる衝突を決定論的に解決しながら、彼らのローカルコピーを変更できる。
【０００９】
[0007]コレクションは、ほぼあらゆるプログラミング言語（たとえば、Ｃ、Ｃ＋＋、Ｊａｖａ（登録商標）、Ｖｉｓｕａｌ  Ｂａｓｉｃ等）で実装されうる。共有コレクションの概念は広範なプログラミングモデルで実装されうるので、異なる言語で書かれたプログラムが同じ共有コレクションを操作できる。さらに、プログラマーは、プログラムが完全にローカルなコレクションを操作するのと同じ方法で、共有コレクションを操作するプログラムを書くことができる。したがって、プログラムは、新しいコレクションを登録するための、または既存のコレクションへの変更に加入するための指示を出す以外の任意の方法で、コレクションの共有性質を認識せずに共有コレクションを操作できる。このように、効果的なコレクションの共有は、プログラムおよびプログラマーにとって透過的に行われる。さらに、共有メカニズムはコレクション内のデータのタイプにとらわれる必要はなく、したがってあらゆるタイプのデータのコレクションを共有できる。
【００１０】
[0008]この概要は、以下の詳細な説明においてさらに説明する概念の選択を、簡単な形式で紹介するために提供するものである。この概要は、特許請求の範囲に記載された対象の主な特徴または基本的な特徴を識別することを意図するものではなく、特許請求の範囲に記載された対象の範囲を限定するために使用されることを意図するものでもない。
【図面の簡単な説明】
【００１１】
【図１】[0009]共有コレクションの例のブロック図である。
【図２】[0010]共有コレクションへのアクセスをプログラムが共有できる例示的シナリオのブロック図である。
【図３】[0011]コレクション共有のピアツーピア実装形態の例のブロック図である。
【図４】[0012]共有コレクションが使用されうる方法の例のブロック図である。
【図５】[0012]共有コレクションが使用されうる方法の例のブロック図である。
【図６】[0013]コレクションが共有されうる例示的処理の流れ図である。
【図７】[0014]本明細書に記載された対象の実装形態に関連して使用されうる例示的コンポーネントのブロック図である。
【発明を実施するための形態】
【００１２】
[0015]現代のコンピューティングでは、同じ基本データへのアクセスを共有することによって、プログラムはしばしば互いに同時使用する。プログラムがデータを共有する場合、プログラムは、データが共有されているという事実を認識する方法でしばしば実装される。すなわち、一般的にプログラムは、他のプログラム、または同じプログラムの他のインスタンスとデータを共有するメカニズムの実装形態を含む必要がある。共有するためのメカニズムは、しばしば共有されているデータの性質、およびプログラマーの設計選択に特有である。したがって、２つのプログラムがデータを共有したい場合、それぞれのプログラマーは通常特定の共有メカニズムに同意して、実装する必要がある。限定された形式のデータ共有を可能にする特定の一般化されたメカニズムがあるが、特定の状況にはあまり適さない。
【００１３】
[0016]あらゆる種類のデータの共有が様々な実装形態の問題を提示しているが、共有されるデータがコレクションである場合はさらなる問題が提示される。コレクションは、同時に操作されうるデータアイテムの集まりである。コレクションのいくつかの例には、リスト、アレー、セット、バッグ、および他の様々なデータの集まりがある。いくつかのタイプのコレクションは順序付けされる。すなわち、順序コレクションの現在の状態は、単にコレクションのコンテンツによってだけではなく、それらのコンテンツが出現する順序によって定義される。たとえば、｛１、２、３、４、５｝は、１から５までの全ての整数を含むデータのコレクションである。コレクションが順序付けられると、｛１、２、３、４、５｝と｛２、３、１、５、４｝とは、両方とも同じアイテムを含んではいるものの順序が異なるので、これらの２つの状態は異なる状態である。
【００１４】
[0017]同時に実行しているプログラム間で任意のタイプのデータが共有されると、データの２つの修正が衝突する可能性がある。たとえば、あるプログラムがデータを修正しようとし、他のプログラムが同時にそのデータを削除しようとする場合がある。しかし、このような衝突が生じて、共有されているデータがコレクションの一部である場合、さらなる困難な事態が生じる。あるプログラムは、コレクション内の２番目のアイテムの後に、あるアイテムの挿入を要求する場合がある。他のプログラムは、２番目のアイテムを削除して、それによって、挿入されたアイテムを２番目のアイテムにするよう要求する場合がある。これらの変更を処理して、コレクションの真の状態に到達するために、元のコレクション内のどのアイテムが現在２番目であるかを決定しなければならない。それぞれのプログラムは、他のプログラムが同じコレクションを操作していることに気付かない場合があるので、両方のプログラムはコレクション内の「２番目の」アイテムを参照しながら、コレクション内のどのアイテムが実際に２番目の順序であるかについて異なる理解を有している場合がある。
【００１５】
[0018]操作変換の分野は、コンピューティングにおいてデータの決定論的な順序付けを可能にするメカニズムに関係がある。これらのメカニズムのいくつかは、同時に操作されているファイル間の衝突を解決するために、たとえば、２人のユーザによって同時に編集されているテキストファイルに何の編集が生じたかを決定するために使用されうる。しかし、これらのタイプの技法は、一般に本明細書に記載されたコレクションの一般化された共有のタイプには適用されない。
【００１６】
[0019]本明細書に記載された対象は、データコレクションを共有するためのメカニズムを提供する。本明細書に記載された技法は、いくつかのプログラムおよび／または同じプログラムのいくつかのインスタンスがコレクションへのアクセスを共有できるようにする、一般化されたコレクション共有メカニズムを提供するために使用されうる。これらの技法により、異なるプログラミング言語でプログラムを実装できるようになる。この技法により、コレクションが、そのコレクションを使用している全てのプログラムに伝搬されうる特定の状態に決定論的に到達できるような方法で、順序付けされたデータのコレクションを複数のプログラムおよび／またはプログラムインスタンスによって同時に操作できるようになる。さらに、本明細書に記載された技法により、プログラマーは、プログラムが完全にローカルなコレクションを操作するのとほぼ同じ方法で、共有コレクションを操作するプログラムを書けるようになる。さらに、共有メカニズムは、コレクション内の基本的なデータのタイプにとらわれないように作成でき、したがって、あらゆる適切な種類のデータについて、同じ一般化された共有メカニズムを使用できるようになる。言い換えれば、本明細書に記載された様々な動作を、コレクション内のデータアイテムのコンテンツに関係なく、またそれらのアイテムのコンテンツの構造に関係なく実行できるようになる。
【００１７】
[0020]データを共有するプログラムは、単一の機械上で実行してもよく、ネットワークを通じて接続された、いくつかの機械上で実行してもよい。データの共有を容易にするために、プログラムを実行しているそれぞれの機械は共有オブジェクトランタイムを有することができる。共有オブジェクトランタイムは、共有コレクションを含む共有データオブジェクトの共有および同期の管理に役立つ場合がある。一例では、共有オブジェクトサーバーが共有コレクションの真の状態を維持する。機械上の共有コレクションに変更が行われると、その機械上のランタイムは共有オブジェクトサーバーにその変更を通知する。サーバーは、ローカル変更に応答して、コレクションの真の状態を変更できる。２つのプログラムが同時にコレクションに変更を行うと、共有オブジェクトサーバーは、真の状態に到達するために変更を解決でき、可能な限り、両方のプログラムが達成しようとしたコレクションの状態を反映できる。したがって、２つの異なるプログラムが、他の変更を知らずに同じコレクションをそれぞれ変更すると、サーバーはこれらの変更のうちの１つを実行してコレクションの新しい状態を作成でき、次いで、変更を行ったときにコレクションの新しい状態を知っていれば、もう１つのプログラムが行いたかった変更を反映するために（可能な限り）もう１つの変更を変換できる。サーバーは、様々な機械上のランタイムに変更（または、該当する場合は変換された変更）を通知して、そのコレクションに加入しているプログラムが、サーバーによって伝搬された変更に従ってそのローカルコピーをアップデートする。他の例では、コレクション共有はピアツーピアアーキテクチャに実装され、そのアーキテクチャでは、共有コレクションに加入するそれぞれのプログラムが、プログラムが行った変更を他のプログラムに通知して、他の加入者（または、それらの加入者が実行している機械上のランタイムコンポーネント）がサーバーの援助なしにそれらのローカルコピーを変更に同期させる。
【００１８】
[0021]プログラムがコレクションを作成すると、プログラムはコレクションを共有コレクションとして登録するための指示を出すことができる。この指示は、プログラムを実行している機械上のランタイムによって受信でき、ランタイムは共有オブジェクトサーバーに登録を報告できる。次いで、共有オブジェクトサーバーは、コレクションの最初の状態を表すコレクションのコピーを受信する。この時点から、コレクションを作成したプログラムは、ランタイムが共有オブジェクトサーバーへの（または、ピアツーピア実装形態では他の加入者への）変更の報告、および共有オブジェクトサーバーから受信した状態変更の同期を管理するので、コレクションが完全にローカルであった場合とほぼ同じ方法で、コレクションを操作できる。
【００１９】
[0022]あるプログラムが、他のプログラムによって作成された共有コレクションを使用したい場合、そのプログラムはそのコレクションを登録するための指示を出す。その指示は、ランタイムによって受信されて、共有オブジェクトサーバーに送信されうる。次いで、共有オブジェクトサーバーは、加入プログラムを実行している機械上のランタイムに、コレクションの状態へのあらゆる変更を通知することを知っている。プログラムがコレクションに加入すると、コレクションの現在の真の状態のコピーを受信でき、次いでローカルコレクションとして格納できる。次いで、加入プログラムは、コレクションがローカルであった場合とほぼ同じ方法で、共有コレクションを操作できる。このようにして、効果的なコレクションの共有は、そのコレクションを作成および登録するプログラムと、そのコレクションに加入するプログラムとの両方にとって、透過的に行われる。上述のように、システムは、コレクション内のデータの性質にとらわれる必要がないので、共有メカニズムはあらゆる種類の基本的なデータを含むコレクションと協働できる。
【００２０】
[0023]図１は、共有コレクション１０２の例を示している。共有コレクション１０２は、何らかの方法で相互に関連する、ならびにプログラム１０４、１０６、および１０８などの複数のプログラムによってアクセス（たとえば、読出しおよび書込み）されうる、データアイテムのセットを備えうる。プログラム１０４〜１０８は、同じプログラムの異なる実行インスタンス（たとえば、いくつかの別個の処理で実行している同じアプリケーション）でもよく、異なるプログラムでもよい。さらに、プログラム１０４〜１０８は全て同じ機械上で実行してもよく、異なる機械上で実行してもよい。どちらの場合でも、プログラム１０４〜１０８は、異なるプログラムでもよく、同じプログラムの別々の実行インスタンスでもよいという意味で、「別個の」ものとして記述できる。コレクション共有メカニズム１１０は、プログラム１０４〜１０８の間で共有コレクション１０２を共有することを容易にすることができる。コレクション共有メカニズム１１０の例示的実装形態は、以下で図２〜７に関連して説明する。
【００２１】
[0024]共有コレクション１０２は、共通の名前空間を共有するプログラムによって共有コレクション１０２が識別されうるようにする、名前１１２を有することができる。名前１１２の代用として（または、名前１１２に加えて）、共有コレクション１０２は、共有コレクション１０２と他の共有コレクションとを区別する識別子１１４を有することもできる。識別子１１４は、たとえば、まだ名前が割り当てられていないコレクションに適用されうるので、これらのコレクションは、「フレンドリーな」名前がコレクションに割り当てられる前にシステムによって識別されうる。
【００２２】
[0025]共有コレクション１０２は、複数のデータアイテムを有することができる。図１の例では、４つのデータアイテム１１６、１１８、１２０、および１２２が示されているが、コレクションはいくつのデータアイテムを有してもよい。それぞれのデータアイテムは、あらゆるタイプのデータを含みうる。共有コレクションに格納されうるデータのいくつかの例は、以下で図４および５に関連してより詳細に説明する。しかし、一般的な例として、コレクションに格納されうるいくつかのタイプのデータは、数または単語などの基本的なデータタイプ、またはやることリスト上のタスクを表す構造などのより複雑なプログラマー定義のデータタイプ、あるいはユーザインターフェースの要素である。本明細書に記載されたメカニズムは、データのタイプにとらわれる必要がないので、コレクション内の個々のデータアイテムは、基本的なデータタイプから、入り組んだスキーマを備える複雑なユーザ定義のデータタイプまでのいずれでもよい。
【００２３】
[0026]図１の例では、共有コレクション１０２は順序付けされたコレクションである、上述のように、順序付けされたコレクションは、コレクションの状態が、コレクション内のデータアイテムによってだけでなく、それらのデータアイテムの順序によって定義されるコレクションである。データアイテムの挿入または除去は順序付けされたコレクションの状態を変更するが、２つの既存のデータアイテム間の位置も変更する。したがって、共有コレクション１０２内のそれぞれのデータアイテムは順序位置を有する。順序位置１２４、１２６、１２８、および１３０は、それぞれデータアイテム１１６、１１８、１２０、および１２２に対応する。したがって、データアイテム１１６は１番目の位置にあり、データアイテム１１８は２番目の位置にあり、以下同様である。アイテムの順序数のうちのいずれかを変更する場合、この変更は、たとえアイテム自体には変更がなくても、共有コレクション１０２の状態における変更という結果になる。
【００２４】
[0027]共有コレクション１０２に実行されうる例示的操作には、交換操作１３２および削除操作１３４がある。交換操作１３２はコレクション内の２つ（またはより多く）のアイテムの順序位置を交換し、削除操作１３４はコレクション内のアイテムのうちの１つを除去する。また、挿入操作１３６を実行して新しいデータアイテム１３８をコレクションに追加することによってコレクションを修正できる。これらの操作については、後に以下の議論で言及する。
【００２５】
[0028]図２は、プログラムが共有コレクション１０２へのアクセスを共有できる例示的シナリオを示している。機械２０２は、プログラムを実行する機械である。機械２０２は、デスクトップまたはラップトップなどのパーソナルコンピューター、サーバーコンピューター、ハンドヘルドコンピューター、スマートフォン、セットトップボックスなどの、何らかの種類のコンピューティング機能を有するどのようなタイプの機械でもよい。図示された例では、機械２０２上で２つのプログラム２０４および２０６を実行しているが、機械上でいくつのプログラムを実行してもよい。
【００２６】
[0029]機械２０２はデータを格納でき、機械２０２に格納されるあるタイプのデータは共有コレクション１０２のローカルコピーである。図２の例では、共有コレクション１０２はプログラム２０４によって作成される。コレクションが作成された時点では、コレクションはプログラム２０４にとってローカルかつプライベートでよい。しかし、プログラム２０４は、他のプログラムが（可能であれば、他の機械上で実行するプログラムを含む）コレクション１０２へのアクセスを共有できるようにするために、共有するためのコレクションを登録したい場合がある。したがって、プログラム２０４は登録指示２０８を出す。登録指示２０８は、プログラム２０４が書かれた何らかのプログラミング言語を通じて出されてもよく、共有オブジェクトランタイム２１０によって受信されうる。たとえば、共有オブジェクトランタイム２１０は、プログラム２０４が共有オブジェクトランタイム２１０に登録指示（ならびに加入要求、および他のタイプの指示）を出せるようにする、アプリケーション・プログラミング・インターフェース（ＡＰＩ）を提供できる。
【００２７】
[0030]登録指示２０８を受信すると、共有オブジェクトランタイム２１０は、共有コレクション１０２を共有オブジェクトサーバー２１２に登録できる。共有オブジェクトサーバー２１２は、共有コレクション１０２などの共有データオブジェクトの真の状態を維持して、また共有オブジェクトへの変更についての情報センターとして働くサーバーである。すなわち、共有オブジェクトサーバー２１２は、機械上で共有データが変更すると、およびその共有データの状態への変更を他の機械に伝搬すると、通知を受信する。共有コレクション１０２が共有オブジェクトサーバー２１２に登録されると、共有オブジェクトランタイム２１０は、共有コレクション１０２のコピーを提供できる。共有するために一旦コレクション１０２が登録されると、図２で共有オブジェクトサーバー２１２を表すボックス内部の「（真の状態）」で印をつけられたボックス内で示されるように、共有オブジェクトサーバー２１２はコレクション１０２の真の状態を維持する。（本明細書の記述を通じて、プログラムまたは加入者送信を、サーバーまたは他の加入者への送信登録または加入要求と呼ぶ場合がある点に留意されたい。これらのタイプの要求を送信するプログラムの動作は、プログラムが要求をランタイムに通信し、ランタイムがその要求をサーバー、あるいは他の加入者またはランタイムに通信する場合を含む。同様に、後述するように、加入者は状態変更をサーバーまたは他の加入者に通信できる。加入者が状態変更を通信する動作は、加入者の機械上のランタイムが通信を実行する場合を含む。）
[0031]共有するために共有コレクション１０２が登録されると、コレクションに加入することによってプログラム２０４以外のプログラムがそのコレクションにアクセスできる。コレクションに加入するために、プログラムは加入要求２１４を提出できる。いくつかのコレクションは、それらの作成者によって指定されたアクセス制御制限に従う場合がある。このようなアクセス制御制限は、共有コレクションにアクセスできるプログラムのセットおよび／またはユーザ、および／または機械を限定しうる。しかし、共有コレクション１０２にアクセス制限がない（または、アクセス制限があるが、共有コレクション１０２へのアクセスを求めている人は、そのコレクションにアクセスする許可を得る）と仮定すると、共有コレクション１０２の加入によって、加入者はそのコレクションを読み出す、および／または修正することができるようになる。
【００２８】
[0032]加入要求は、任意の機械の任意のプログラムから来る場合がある。たとえば、プログラム２０６は共有オブジェクトランタイム２１０を通じて加入要求を提出することによって、共有コレクション１０２に加入できる。プログラム２０６は、共有コレクション１０２の作成者（すなわち、プログラム２０４）と同じ機械２０２上にある点に留意されたい。しかし、加入プログラムは異なる機械上にある場合がある。たとえば、機械２１８上のプログラム２１６も、加入要求２１４を提出することによって共有コレクション１０２に加入する。プログラム２１６からの加入要求は、機械２１８用のランタイムである共有オブジェクトランタイム２２０を通じて提出される。（それぞれの機械は、それ自身の共有オブジェクトランタイムのインスタンスを有することができる。）さらに、共有コレクション１０２への加入要求は、機械２２２上、または他の任意の機械上で実行しているプログラムから来る場合もある。
【００２９】
[0033]プログラムが共有コレクション１０２に加入すると、そのプログラムは、共有コレクション１０２の現在の真の状態のコピーを受信できる。たとえば、機械２１８上のプログラム２１６は、共有コレクション１０２のコピーを受信して、そのコピーを、機械２１８を表す図１のボックス内の、機械２１８に格納できる（「（ローカルコピー）」とラベル付けされた共有コレクション１０２のインスタンスによって示されるように）。次いで、加入プログラムは、まるで完全にローカルなコレクションであるかのようにローカルコピーの読出しおよび書込みができる。プログラムを実行している機械上の共有オブジェクトランタイムのインスタンス（たとえば、プログラム２１６の場合は共有オブジェクトランタイム２２０）は、共有コレクション１０２のローカルコピーを監視して、プログラムが共有オブジェクトサーバー２１２に報告するべき変更を共有コレクションに行ったかどうかを決定できる。
【００３０】
[0034]共有コレクション１０２への任意の加入者が、共有コレクション１０２のローカルコピーへの変更を行う操作を実行すると、その加入者の機械上の共有オブジェクトランタイムが、その操作を共有オブジェクトサーバー２１２に報告する。次いで、共有オブジェクトサーバー２１２は、共有コレクション１０２の現在の真の状態をアップデートして、オブジェクトへの加入者（オブジェクトの作成者を含む）に状態変更を通知する。
【００３１】
[0035]共有オブジェクトサーバー２１２は、共有コレクション１０２の加入者間での状態情報の収集および伝搬を容易にする同期コンポーネント２２６を含むことができる。同期コンポーネント２２６が操作する方法は、実装形態に依存する場合がある。一例では、同期コンポーネントは、共有コレクション１０２のマスターコピーを真の状態で維持して、そのコレクションの状態が変化する時はいつでも共有コレクション１０２の新しいコピーを単に伝搬する。他の例では、同期コンポーネント２２６は、現在のバージョンに関連する共有コレクション１０２への変更のリストを維持して、それらの変更を様々なクライアントに伝搬する。次いで、それぞれのクライアントのランタイムは、共有コレクション１０２の真の状態を、そのローカル状態、および共有オブジェクトサーバー２１２から受信した変更に基づいて計算できる。共有オブジェクトサーバー２１２が全ての状態変更に応答して共有コレクション１０２の完全なコピーを伝搬しなくても、共有オブジェクトサーバー２１２は、共有コレクション１０２への同時変更を解決する方法を決定できるので、クライアント側のランタイムが変更の通知を受信すると、共有コレクション１０２の新しい状態を古い状態から計算できる。後述するように、同期コンポーネント２２６は必要に応じて変更を変換できるので、第１の加入者が第２の加入者の同時変更を知らずに行った変更を第１の加入者に送信でき、道理にかなう方法で適用でき、その結果、全ての加入者が共有コレクション１０２の同じ状態に収束する。
【００３２】
[0036]同期コンポーネント２２６によって実行されるある機能は、どちらのクライアントも他の変更を知らない２つのクライアントによってコレクションに行われた変更を適用する方法を決定するためのものである。この状況は、２つのクライアントが、コレクション内の同じアイテムに関係する変更をほぼ同時に行う場合に発生する場合があるので、それぞれのクライアントは他の変更の通知を受信する前に変更を行う。たとえば、コレクション内の最初の２つのアイテムがアルファおよびベータであると仮定する。ＡおよびＢと呼ばれる２つのクライアントの両方が、ほぼ同時にコレクションに変更を行う。Ａは新しいアイテム、ガンマをアルファの後の位置に追加したいが、Ｂはベータを削除したい。したがって、Ａは順序位置２で新しいアイテムを追加する操作を実行し、Ｂは順序位置２でアイテムを削除する操作を実行する。Ａの操作が最初に実行されると、両方の操作後の最終的な状態は、アルファおよびベータが位置１および２をそれぞれ占めることになる。Ｂの操作が最初に実行されると、両方の操作後の最終的な状態は、アルファおよびガンマが順序位置１および２をそれぞれ占めることになる。同期コンポーネント２２６は、この明らかな矛盾を以下の方法で解決できる。
【００３３】
[0037]この例のために、サーバーＳ、ならびにクライアントＡおよびＢを呼び出す。Ｓ、Ａ、およびＢは全て状態０から開始する。Ａは操作Ｘを実行し、Ｂは操作Ｙを実行する。ＡもＢも他の操作が実行されたことを知らないので、ＡおよびＢはそれぞれ状態０で操作をＳに報告する。すなわち、ＡおよびＢはそれぞれ、コレクションが状態０で存在する時に、そのコレクションに操作を実行したことを報告する。ある操作を実行したので、次にＡおよびＢはそれぞれ状態を１にインクリメントする。しかしこれらの操作のうちの１つが最初にＳに到達する。この例では、最初にＸが到達したと仮定する。操作Ｘが、Ｓの現在の状態と一致する状態０で実行されたので、その操作がＳに実行されて、変換されずにＢに送信される。さらに、肯定応答がＡに送信される。Ｓは現在状態１である。この時点で、ＢはＳから操作Ｘを受信する。操作ＹはまだＳによって確認されていないので、操作ＸがＹに対して変換されて、コレクションに適用される。現在、Ｂは状態２である。操作ＹがＳに到達すると、その操作は状態０で実行されたことを示す。０はもはやＳの現在の状態ではないので、Ｓは、Ｙを実行した時にＢは操作Ｘに気付かなかったと決定する。したがって、操作Ｙが操作Ｘに対して変換されて、Ａに送信される。肯定応答がＢに送信される。Ｓは現在状態２である。この時点で、Ａは操作Ｙの変換されたバージョンを受信する。Ａには未処理の操作はないので、変換されたＹをさらに変換することなしに適用する。（すなわち、変換されたＹは状態１に対して実行されていることを示す。Ａはすでに状態１なので、Ｙをこれ以上変換する根拠はない。）Ａは現在状態２である。さらに、ＡおよびＢの両方でのコレクションのコピーは、現在同じデータを同じ順序で示す。
【００３４】
[0038]図２は、サーバーがコレクションの共有を管理する、例示的クライアント／サーバータイプ実装形態を示している。しかし、ピアツーピア実装形態も使用されうる。図３は、コレクション共有のピアツーピア実装形態の例を示している。
【００３５】
[0039]図３の例では、機械２０２、２１８、および２２２がコレクション１０２の共有に参加する（図２で参加するように）。たとえば、それぞれの機械は、共有コレクション１０２の加入者である１つまたは複数のプログラムを有することができる（共有コレクションの作成者は、「加入者」の概念に含まれる）。それぞれの機械は、共有オブジェクトランタイムのインスタンスを有する。すなわち、共有オブジェクトランタイム２１０、２２０、および３０２は、それぞれ機械２０２、２１８、および２２２上で動作する。ピアツーピア実装形態では、共有オブジェクトランタイムは、サーバーと通信するのではなく、直接相互に通信できる。さらに、共有オブジェクトランタイムは、入ってくる変更をサーバーによって実行させるのではなく、それらの変更の変換を担当してよい。したがって、異なるランタイムがコレクションへの衝突する変更を解決するための同じアルゴリズムを実装する限り、コレクションの現在の状態を決定論的に知ることができる。
【００３６】
[0040]たとえば機械２０２上で共有コレクション１０２が変更されると、機械２０２上の共有オブジェクトランタイム２１０が状態変更３０４の通知を、機械２１８上の共有オブジェクトランタイム２２０、および機械２２２上の共有オブジェクトランタイム３０２に送出する。それぞれの共有オブジェクトランタイムは、コレクション１０２の新しい状態に到達するために、共有コレクション１０２の現在の状態に状態変更３０４を適用する。２つの異なる機械から２つの異なる状態変更が同時に来る場合、共有オブジェクトランタイムは、どの状態変更が適用されるべきかを決定するために、衝突解決アルゴリズム（たとえば、同期コンポーネント２２６に関連して上述したアルゴリズム）を適用できる。上述のように、アルゴリズムは決定論的に作成されうるので、衝突する変更の同じセットを受信する任意の２つのランタイムは、同じ方法で衝突を解決して、それによってコレクションを様々な異なる機械上で同じ状態に変更することができる。
【００３７】
[0041]図４および５は、共有コレクションが使用されうる方法のいくつかの例を示している。図４および５における例は例示的なものであり、本明細書に記載された対象を限定するものではない。図４および５における例は、共有コレクションが使用されうる方法のいくつかの特定の例を与えるために提供されるに過ぎないが、共有コレクションが使用されうる他の数多くのコンテキストがあることが理解されよう。
【００３８】
[0042]図４は、共有コレクションとして実装されうる例示的タスクリストを示している。タスクリスト内のそれぞれのアイテムは、実行されるべきタスクでよい。図示されたタスクリストは４つの例示的アイテム４０２、４０４、４０６、および４０８を含み、それらは会社のために新しい商品を開発しているワーキンググループによって実行されるタスクでよい。タスクリストはコレクションとして実装でき、実装されるべきそれぞれのタスクはコレクション内のアイテムであり、これらのアイテムが実行されるべき順序を表すこれらのアイテム間で順序が定められる。ワーキンググループのメンバーは皆、タスクリストの制御を有することができる。たとえば、タスクリストは、グループのそれぞれのメンバーがインスタンスを実行している電子メールおよびカレンダープログラムを通じてアクセスされうる。したがって、グループの異なるメンバーが、リスト上でアイテムを追加または削除してもよく、既存のアイテムを再構成してもよい。したがって、プログラムのそれぞれのインスタンスは、タスクリストを表すコレクションへの加入者でよい。グループの任意のメンバーがプログラムのインスタンスを使用してタスクリストに変更を行うと、その変更は、上述の方法でプログラムの他のインスタンスに伝搬されうる。したがって、ある人はプログラムの第１のインスタンスを使用して、１番目および２番目のタスクの順序を交換することができ（数字４１０で示されるように）、他の人はプログラムの第２のインスタンスを使用して、３番目のタスクを削除できる（数字４１２で示されるように）。これらの変更を処理して、コレクションの新しい状態に到達できる。
【００３９】
[0043]図５は、コレクションとして実装されうる例示的ユーザインターフェースを示している。ユーザインターフェースは、たとえばデスクトップサイドバーでよく、そこでは図５に示される様々なデータアイテム（すなわち、データアイテム５０２  ５０４、５０６、５０８、および５１０）は、コレクション内にアイテムが出現する順序に対応する何らかの垂直順序でサイドバー内に示されるべきウィジェットである。ウィジェットのリストはコレクションとして実装でき、異なるプログラムがコレクションへのアクセスを共有できる。たとえば、ユーザはニュースフィードの上に時計を置きたいと決定して、コレクション内の最初の２つの要素の順序を交換することができる（数字５１２で示されるように）。次いで、ユーザはサイドバー内のバグを情報技術管理者に報告できる。次いで、管理者は管理プログラムを使用して、サイドバーに接続できる。管理者は、たとえばフォトビューアにバグがあることを認識でき、そのウィジェットをサイドバーから削除できる（数字５１４で示されるように）。このようにして、２人が２つの異なるアプリケーションを使用して、コレクションとして実装されたユーザインターフェースを修正する。
【００４０】
[0044]図４および５の例では、図示されたコレクションは複雑なデータタイプを含みうる点に留意されたい。たとえば、図４のデータアイテムは、（要約、長い記述、納期、リマインド日等のためのフィールドを含みうる）タスクである。また、図５内のデータアイテムは、（アプリケーション名、ディスク上の位置、ランタイムパラメータ等のフィールドを含みうる）アプリケーションハンドルでよい。言い換えれば、これらの例は、共有コレクションにおいてあらゆるタイプのデータが使用されうること、および、コレクション共有メカニズムは、データの性質または構造に関係なく様々なタイプのデータを同じ方法で処理できることを示している。
【００４１】
[0045]図６は、コレクションが共有されうる例示的処理を示している。図６の説明に入る前に、図６の流れ図は、例として、図１〜５に示したコンポーネントを参照して説明されるが、図６の処理は任意のシステムにおいて実行でき、図１〜５に示したシナリオに限定されない点に留意されたい。さらに、図６の流れ図は、ブロックをつなぐ線によって示されるように特定の順序で処理の段階が実行される例を示しているが、この図に示される様々な段階は任意の順序で、あるいは任意の結合またはサブ結合で実行されうる。
【００４２】
[0046]６０２で、コレクションが作成される。たとえば、プログラムは、通常はローカルコレクションを作成するために使用されるメカニズムを使用することによって、コレクションを作成できる。コレクションは、リスト、アレーなどの任意のタイプのコレクションでよい。６０４で、コレクションは、共有するために登録されうる。たとえば、コレクションを作成するプログラムは指示を出すことができ、その指示はプログラムを実行している機械上の共有オブジェクトランタイムによって受信されうる。一例では、ランタイムは、プログラムが登録指示を出せるようにするＡＰＩを公開するが、登録指示は他の方法でも出されうる。
【００４３】
[0047]共有するためにコレクションが登録された後、コレクションへの加入要求が受信されうる（６０６で）。たとえば、コレクションを作成したプログラムと同じ名前空間を共有する他のプログラムが、そのコレクションへの加入要求を出すことができる。これらの加入要求は、加入プログラムを実行している機械上の共有オブジェクトランタイムに出すことができる。一例では、加入要求はランタイムが公開したＡＰＩを通じて出すことができる。本明細書に記載された対象のために、作成者は加入者のうちの１人と見なされる。（たとえ作成者が加入要求ではなく登録要求を出しても、共有オブジェクトの作成者は、加入者はコレクションにアクセスできるプログラムであるという意味で加入者である。）加入者は、コレクションの現在の状態を受信でき（６０８で）、コレクションのローカルコピーを格納できる。
【００４４】
[0048]いくつかの時点で、加入者がコレクションに変更を行う（６１０で）。例示的な変更には、挿入６５２、削除６５４、および移動６５６がある。挿入６５２は、コレクションの順序内の特定の場所で、新しいアイテムをコレクションに追加する。削除６５４は、コレクションから既存のアイテムを除去する。移動６５６は、コレクション内の２つ以上のアイテム間で順序を変更する。
【００４５】
[0049]加入者の機械上の共有オブジェクトランタイムによって変更が検出されると、共有オブジェクトランタイムが適用可能なエンティティに変更を通知して（６１２で）、これらの変更が、それらのエンティティによって受信される（６１４で）。どのエンティティが「適用可能なエンティティ」かは、実装形態に依存する場合がある。上述のように、たとえば、本明細書に記載された対象のクライアント／サーバー実装形態と、ピアツーピア実装形態との両方がある。クライアント／サーバー実装形態では、変更を検出するランタイムが、コレクションの真の状態を管理する共有オブジェクトサーバーに通知できる。ピアツーピア実装形態では、それぞれのランタイムが他のランタイムに直接通知する。
【００４６】
[0050]コレクションへの変更が受信されると、衝突する変更（たとえば、２つのクライアントがコレクションの同じ状態に操作を実行したことを示す変更）が決定論的な方法で解決されうる（６１６で）。たとえば、２つの加入者が、コレクション内の「２番目の」アイテムに影響を及ぼす変更を行った（たとえば、あるエンティティが１番目および２番目のエンティティの位置を交換して、他のエンティティが同時に２番目のエンティティを削除する）場合、コレクションの真の状態に到達するために、たとえば同期コンポーネント２２６（図２に示される）に関連して上述したアルゴリズムを使用して、これらの衝突する変更は解決されうる。衝突が解決される方法は、変更を行った加入者の目的を達成してもよく、達成しなくてもよいが、結果として得られる状態は明確に確定されうる。
【００４７】
[0051]クライアント／サーバー実装形態では、解決された変更が加入者に送信されうる（６１８で）。ピアツーピア実装形態では、加入者および／または加入者の機械上のランタイムが、他の加入者および／またはランタイムから変更情報を受信して、サーバーの援助なしに自身で衝突を解決する。決定論的な衝突解決処理によって、それぞれのクライアントが同じ方法で変更を解決できるようになるので、様々な加入者がコレクションの真の状態についての同じ結果に収束できる。（この場合もやはり、結果として得られる状態は明確に解決されうるが、結果として得られる状態は、変更を行った加入者の目的を達成してもよく、達成しなくてもよい。）
[0052]変更するための任意の既存の衝突が解決されると（および、クライアント／サーバー実装形態の場合は、その衝突解決の結果がサーバーから加入者に通信されると）、コレクションのローカルコピーを真の状態に沿って維持するために、それらのローカルコピーへの変更が行われうる（６２０で）。次いで、加入者はコレクションの読出しおよび書込みを続けることができる。
【００４８】
[0053]図７は、本明細書に記載された対象の態様が配置されうる例示的環境を示している。
[0054]コンピューター７００は、１つまたは複数のプロセッサー７０２、および１つまたは複数のデータ記憶コンポーネント７０４を含む。プロセッサー７０２は、一般的に、パーソナルデスクトップまたはラップトップコンピューター、サーバー、ハンドヘルドコンピューター、あるいは他の種類のコンピューティングデバイスで見られるマイクロプロセッサーである。データ記憶コンポーネント７０４は、データを長期間または短期間格納できるコンポーネントである。データ記憶コンポーネント７０４の例には、ハードディスク、リムーバブルディスク（光ディスクおよび磁気ディスクを含む）、揮発性および不揮発性ランダムアクセスメモリー（ＲＡＭ）、読出し専用メモリー（ＲＯＭ）、フラッシュメモリー、磁気テープ等がある。データ記憶コンポーネントは、コンピューター可読記憶媒体の例である。コンピューター７００は、ブラウン管（ＣＲＴ）モニタ、液晶ディスプレイ（ＬＣＤ）モニタ、または他の任意のタイプのモニタでよいディスプレイ７１２を備えうるか、それに関連付けられうる。
【００４９】
[0055]ソフトウェアは、データ記憶コンポーネント７０４に格納されて、１つまたは複数のプロセッサー７０２上で実行しうる。このようなソフトウェアの例には、図１〜６に関連して上述した機能のうちのいくつかまたは全てを実装できるコレクション共有ソフトウェア７０６があるが、任意のタイプのソフトウェアも使用されうる。ソフトウェア７０６は、たとえば、分散システム、別のファイル、別の機能、別のオブジェクト、コードの別の行等におけるコンポーネントでよい、１つまたは複数のコンポーネントを通じて実装されうる。プログラムが、ハードディスクに格納されて、ＲＡＭにロードされて、コンピューターのプロセッサーで実行されるコンピューター（たとえば、パーソナルコンピューター、サーバーコンピューター、ハンドヘルドコンピューター等）は図７に示されるシナリオの典型であるが、本明細書に記載された対象はこの例に限定されない。
【００５０】
[0056]本明細書に記載された対象は、データ記憶コンポーネント７０４のうちの１つまたは複数に格納されて、プロセッサー７０２のうちの１つまたは複数で実行するソフトウェアとして実装されうる。他の例としては、対象は、１つまたは複数のコンピューター可読記憶媒体に格納される指示として実装されうる。光ディスクまたは磁気ディスクなどの有形媒体は、記憶媒体の例である。指示は持続性媒体上に存在しうる。このような指示は、コンピューターまたは他の機械によって実行されると、方法の１つまたは複数の動作をコンピューターまたは他の機械に実行させることができる。動作を実行するための指示はある媒体に格納されてもよく、複数の媒体にわたって分散されてもよいので、全ての指示が同じ媒体上にあるかどうかに関わらず、１つまたは複数のコンピューター可読記憶媒体上に指示が集合的に出現しうる。
【００５１】
[0057]さらに、本明細書に記載された任意の動作（図示されているかどうかに関わらず）は、方法の一部として、プロセッサー（たとえば、１つまたは複数のプロセッサー７０２）によって実行されうる。したがって、本明細書に動作Ａ、Ｂ、およびＣが記載されている場合、Ａ、Ｂ、およびＣの動作を備える方法が実行されうる。さらに、本明細書に動作Ａ、Ｂ、およびＣが記載されている場合、プロセッサーを使用してＡ、Ｂ、およびＣの動作を実行するステップを備える方法が実行されうる。
【００５２】
[0058]ある例示的環境では、コンピューター７００は、ネットワーク７０８を通じて１つまたは複数の他のデバイスと通信可能なように接続されうる。構造の点でコンピューター７００と類似してよいコンピューター７１０は、コンピューター７００に接続されうるデバイスの例であるが、他のタイプのデバイスもそのように接続されうる。
【００５３】
[0059]対象を、構造的特徴および／または方法論的行為に特有の文言で説明してきたが、添付の特許請求の範囲に定められる対象は、上述の特定の特徴または行為に必ずしも限定されないことが理解されるべきである。むしろ、上述の特定の特徴および行為は、特許請求の範囲を実装する例示的形式として開示したに過ぎない。
【図１】
0005941461.tif 000002
【図２】
0005941461.tif 000003
【図３】
0005941461.tif 000004
【図４】
0005941461.tif 000005
【図５】
0005941461.tif 000006
【図６】
0005941461.tif 000007
【図７】
0005941461.tif 000008