説明

動的コード更新

【課題】コンピュータプログラムの実行を停止させる必要なく、コンピュータプログラムのコードを、プログラムの実行の中断を最小限に抑えるように更新する。
【解決手段】コンピュータプログラムを更新するためのプロセスであって、前記コンピュータプログラムのコード更新を実施するために、実行環境による前記コンピュータプログラムの実行中にコード更新手順を実行するステップを有し、前記実行環境は、i)異なる実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を許可し、かつii)同一の実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を阻止するように動作し、前記コード更新手順は隣接する実行フレーム間のフレーム遷移で行われるプロセスが提供される。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータプログラムのコードを変更するための技術に関する。詳細には、本発明は、動的に、すなわち、プログラムの実行中に、プログラムコードを更新および/または置換するための手法に関する。
【背景技術】
【0002】
問題を解決する、あるいは、プログラムに新機能を追加するために、エンドユーザへのリリース後に既存のコンピュータプログラムを変更することが必要な場合が多い。例えば、なかでも、通常はプログラムのユーザビリティおよび/または性能を改善する目的で、バグを修正したり、互換性の問題を解決したり、またはアルゴリズムを修正することが望ましい場合が多い。
【0003】
この目的のために、一般に「パッチ」と呼ばれるソフトウェアを使用することが知られており、パッチは、実行されると、既存のプログラムにコード変更を行う、あるいは実行可能モジュールを置換するように動作する。パッチファイルは、例えばインターネットを介してプログラムのユーザに配信され、これにより、ユーザは、所望のコード更新を実行するために、パッチファイルを実行できるようになる。
【0004】
コード更新手順を実行するための現在公知の技術では、一般に、更新を実行するためにプログラムの実行を停止する必要がある。これは、特に、マルチプレイヤーコンピュータゲームやMMOGなどの長時間にわたるおよび/またはインタラクティブな(マルチユーザ)アプリケーションの場合、ユーザにとって非常に不便となりうる。このような場合、プログラムサーバをシャットダウンし、所望の更新を実行した後、サーバを再起動する必要がある。更新が実行されている間は、プログラムクライアントは、プログラムの実行に参加するためにサーバに接続することができない。更に、分散システムのクライアントが、更新されたコードを受け取るためには、一般に、クライアントマシンは、プログラムを終了し、必要な更新またはパッチファイルをダウンロードした後、更新されたコードを使用してプログラムを再起動する必要がある。
【0005】
コンピュータプログラムは複数のプログラムコンポーネント(例えばプログラムオブジェクトや計算)に分割されるのが普通であり、これにより、複数のコンポーネントを並列に実行できる、あるいは1つ以上のコンポーネントを順次実行できることを読者は理解していることだろう。プログラムオブジェクトなどのプログラムコンポーネントは、データとそのデータを操作するために必要な手順を含むコンピュータプログラムを構成する別個のアイテムであるとみなすことができる。
【発明の概要】
【発明が解決しようとする課題】
【0006】
コード更新を実行するためにプログラムの実行の停止が必要である理由の1つとして、コンピュータプログラムに含まれる異なるスレッドまたはコンポーネント間で行われる対話が挙げられる。具体的には、プログラムコンポーネントは、多くの場合、他のコンポーネントからの命令を要求する。このように、プログラムの実行中の任意の時点において、1つ以上のコンポーネントによって要求されておらず、したがって安全に更新可能なコードシーケンスを特定することは、通常は不可能である。この問題は、実行環境が、ネットワーク(例えば、ローカルエリアネットワーク(LAN)やインターネット)を介して相互に対話する複数のマシンに分散されている、コンピュータプログラムの分散実行または並行実行を伴う状況では悪化する。このような状況では、多くの場合、プログラムコンポーネントが動作している時間が重複し、コード更新を実行するのに安全な時間、例えば、更新しようとしているコード部分が他のコンポーネントによって要求されない時間、を確定することが更に困難となる。
【0007】
したがって、好ましくはコンピュータプログラムの実行を停止させる必要なく、コンピュータプログラムのコードを、プログラムの実行の中断を最小限に抑えるように更新できることが望ましい。複数のマシンに分散されている実行環境内で実行されている一部のコンピュータプログラムに対してコード更新を実行できることが特に望ましい。
【課題を解決するための手段】
【0008】
本発明によれば、コンピュータプログラムを更新するためのプロセスであって、前記コンピュータプログラムのコード更新を実施するために、実行環境による前記コンピュータプログラムの実行中にコード更新手順を実行するステップを有し、前記実行環境は、i)異なる実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を許可し、かつii)同一の実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を阻止するように動作し、前記コード更新手順は隣接する実行フレーム間のフレーム遷移で行われるプロセスが提供される。
【0009】
本発明の実施形態は、プログラムの実行中に、コンピュータプログラムのコードを動的に更新することができる点で有利である。一実施形態によれば、プログラミング言語のための実行環境またはランタイムシステムは、実行中のプログラムの更新バージョンのプログラムテキストを翻訳し、プログラムの2つのバージョン間の互換性を確認して、実行中のプログラムのコードを新たにコンパイルされたプログラムのコードで置換するように動作するコンパイラを有しうる。
【0010】
好ましい実施形態によれば、コード更新手順は、実行中のコンピュータプログラムのプログラムコンポーネントのコードを、第1のバージョンから第2のバージョンに更新させる。好ましくは、所定のプログラムコンポーネントのコードを第1のバージョンから第2のバージョンに更新するプロセスは、前記プログラムコンポーネントのコードシーケンスの内容を修正する、前記プログラムコンポーネントのコードシーケンスの実行順序を変更する、前記プログラムコンポーネントの既存のコードシーケンスを削除する、前記プログラムコンポーネントの新しいコードシーケンスを追加する、のうちの1つ以上の効果を有する。
【0011】
別法では、あるいは上記に加えて、好ましい実施形態によれば、コード更新手順によって新しいプログラムコンポーネントのコードが導入される。以下にさらに詳しく述べるように、プログラムコンポーネントは、シャドウオブジェクトやwatchdogスレッドとしても知られる監視コンポーネントを有してもよい。
【0012】
本発明の第2の態様によれば、コンピュータプログラムの1つ以上のコンポーネントを複数の連続する実行フレームで実行するように動作する実行環境を生成するように構成された実行環境生成手段を含むシステムであって、前記実行環境は、i)異なる実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を許可し、かつii)同一の実行フレームにおける、あるコンポーネントと別のコンポーネント間の通信を阻止するように更に動作し、前記システムは、前記実行環境によって実行されているコンピュータプログラムのコード更新を実施するために、隣接する実行フレーム間のフレーム遷移においてコード更新手順を実行するように動作するコード更新手段を有するシステムを提供する。
【0013】
次に、英国特許出願第0712496.9号明細書を参照し、その全内容を参照によりここに援用する。英国特許出願第0712496.9号明細書の完全な写しを本願と共に提出する。英国特許出願第0712496.9号明細書の教示によれば、コンピュータプログラムの1つ以上のコンポーネントの実行が、複数の連続する実行フレームで有利に実行され、前記実行環境は、i)異なる実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を許可し、かつii)同一の実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を阻止するように更に動作する。また、英国特許出願第0712496.9号明細書の教示によれば、コンピュータプログラムの1つ以上のコンポーネントが複数の連続する実行フレームで実行されるように、実行環境が動作することが有利であり、前記実行環境は、前記コンピュータプログラムのコンポーネント間の通信を所定の順序で処理するように更に動作する。
【先行技術文献】
【特許文献】
【0014】
【特許文献1】英国特許出願第0712496.9号明細書
【0015】
英国特許出願第0712496.9号明細書に記載されている実行環境の内部構造は、従来考えられてきたプログラム実行技術とは大きく異なる。本発明の実施形態は、英国特許出願第0712496.9号明細書の教示に係る実行環境に固有の特性を利用しようとするものである。より詳細には、本発明の実施形態によれば、プログラムコードの「フレーム」、すなわち、時間または作業の単位、での実行を容易にするように構成され、プログラムの少なくとも1つのコンポーネントが各実行フレームに含まれている、ランタイムシステムを実装することが望ましい。コンピュータプログラムを一連のフレーム、すなわち、時間または作業の単位、に分割することは、基本的には、実行環境(1台のマシンに実装されるか数台のマシンに実装されるかを問わない)全体で、プログラムまたはプログラムコンポーネントの実行の進行を時間間隔で制限することであり、このため、プログラムコンポーネントの状態が一貫して定められるように、プログラムの実行を同期させることが可能となり有利である。本発明の好ましい実施形態によれば、プログラムコンポーネントは、フレーム内でのみ可視状態を変更し、前のフレームの終点でのみ他のオブジェクトの値を読み出すことができる。
【0016】
このため、隣接するフレーム間のフレーム遷移は、全てのコンポーネントが基本的には非アクティブであるポイント、すなわち、実行環境によって計算が実行されていないポイントを表す。このように、隣接する実行フレーム間の遷移は、コンポーネントの実行が停止されているポイントを表し、このため、実行中のプログラムに含まれる全てのコンポーネントの状態が一定に保たれる「安全ポイント」である。本発明の実施形態によれば、実行中に定期的な安全ポイントが生ずることにより、プログラムの実行を停止させる必要なく、プログラムコードを都合よく変更できる機会が与えられる。事実上、各種実施形態によるコンピュータプログラムの前進的実行(progressive
execution)は、a)場合によっては並行での、一連の計算または作業単位の実行と、b)作業単位が実行されていない安全期間(すなわちフレーム遷移)であって、次の一連の作業単位の実行がスケジュールされている期間と、の繰り返しからなるとみなすことができる。これは、所定の回数繰り返されるか、スケジュールすべき作業がなるまで続く。いうまでもなく、本発明の実施形態は、実行中に安全ポイントが頻繁に発生するという点、およびコード更新を可能にするためだけに、アプリケーションのアーキテクチャを設計したり、プログラムを適合させなくても、安全ポイントが自然に発生するという点により更に有利である。
【0017】
本発明の第1の態様と第2の態様の実施形態は、分散システムにおいてコード更新を実施するために特に適しており、コード更新は、通常、所定のプログラムに含まれる1つ以上のコンポーネントの複数の表現を含む。例えば、複数のマシンを有し、実行環境が複数のマシンに分散されており、マシンの数台が同じコンポーネント(例えば対応するオブジェクト)の異なる表現を実行することができる分散システムでは、本発明の好ましい実施形態は、プログラムの連続的な実行を中断させずに、システム内の対応する全コンポーネントの更新を容易にする。このため、本発明の実施形態によって提供される主な利点の1つは、例えば、マッシブリーマルチプレイヤーオンラインゲーム(MMOG)などの長時間にわたるネットワークアプリケーションの場合に、更新を実行するためにサーバをシャットダウンする必要が回避されることにある。更に、本発明の実施形態によれば、クライアントマシンは、プログラムから切断し、コード更新をダウンロードした後、アプリケーションを再起動する必要がない。それどころか、ネットワーク全体で更新を同期させて実施できるように、開発者が、実行中のプログラムのコードを変更し、サーバで更新を実行した後、更新を、現在接続中のクライアントと、将来の全クライアントとに(おそらくその接続時に)送信することができる。好ましくは、更新を送信するプロセスは、ユーザには見えない。
【0018】
また、特に好ましい実施形態によれば、分散システムに含まれるマシンにコード更新の形で送信されるコード量を最小限に抑えることも有利でありうる。例えば、好ましい実施形態によれば、既存のコードに対する変更分のみが送信される。クライアントとサーバでコードの表現が同一であるため、この変更分は、古いコードと新しいコードの2つのコードの差をとることによって計算することができる。このような実施形態は、更新の実行に必要な帯域幅の消費を低減できるという点で有利である。このことは、多数の並列クライアントを更新する際に特に有利であり、更新処理の速度向上につながり、これにより、修正や新しいプログラム機能の迅速が適用が可能となる。
【0019】
本発明の実施形態によれば、コンポーネント間の通信は、メッセージの送信、または他のコンポーネントの状態の少なくとも一部の読み出しの少なくとも一方を含むことができる。通信は、隣接するフレームのコンポーネント間、または1フレーム以上離れたフレームのコンポーネント間で行うことができる。また、プログラムを連続するフレームに分割することにより、プログラムコンポーネントの高度な並行実行が有利に実現される。このため、プログラム内のコンポーネントの数が増え、シングルプロセッサでは不十分である場合に、プログラムコードの実行を、複数のプロセッサに容易に分散させることができる。このように、異なるプログラムコンポーネントまたは異なるオブジェクトを、容易に並列に実行することができる。
【0020】
好ましくは、メッセージは、オブジェクト間で、あるいは外部世界(例えば、ユーザやC++プログラム)とオブジェクトの間で送信することができる。メッセージにより、システム内のオブジェクトと外部世界の間通信が可能となる。メッセージは、ネットワークを通じて送信することができる。メッセージは、特定のフレーム番号およびターゲットオブジェクトに伝達される。同一フレームにおけるコンポーネント間の通信を阻止するように動作する本発明の実施形態によれば、オブジェクトがメッセージを送信すると、そのメッセージは、別の後続のフレームでしか受信することができない。オブジェクトによるメッセージの受信は、好ましくは、各フレームの各オブジェクトに、着信メッセージのキューを提供することによって実装できる。キューは、好ましくは、ネットワークの一貫性を保つために、決定論的順序付け(deterministic
ordering)法を使用して順序付けされなければならない。
【0021】
決定論的順序付け法では、所定のフレームの所定のオブジェクトに対して受信された一連のメッセージ全体を以下に基づいてソートする。
1)送信順
2)送信側の識別情報
【0022】
このため、オブジェクトが、Aとこれに続くBの2つのメッセージを送信した場合、受信側は、A、Bの順で受信する。このように、到着順は、送信順と同じである。2つのオブジェクト(1)および(2)がそれぞれ2つのメッセージA1とB1、およびA2とB2を送信した場合、受信側は、A1 B1、次にA2 B2の順でこれらを受信する。この結果、順序が、ローカルにおいて(1つの送信側からのメッセージ内で)保たれると共に、グローバルにおいても保たれる(複数の送信側からのメッセージが送信側の識別情報によって配列される)。送信側が複数存在する場合、送信行為が重複し、例えば、オブジェクト(1)と(2)が並行に実行しうる。好ましくは、ユーザ入力メッセージもソートできるように、クライアントに与えられる識別情報に対して更に順序付けが行われる。例えば、2つのクライアントが同じオブジェクトにユーザ入力メッセージを送信した場合に、クライアント識別情報によって順序が決定される。
【0023】
本発明において、「外部世界」とは、本提案発明の実行環境内で実行されるプログラムを記述するための多くの好適な条件に従わない別の言語で記述されたソフトウェアを指す。例えば、外部世界は、ユーザから情報を受信したり、ネットワークを介してデータのストリームを送信したり、あるいはユーザに結果を表示する重要な作業を行う。外部世界は、好ましくは、後述するシステムの好適な条件に反してはならない。外部世界は、本発明を実施するシステム内のオブジェクトにメッセージに送信することができ、システム内のオブジェクトへの参照を保持し、システムにオブジェクトを作成し、複製または投機的に実行する一連のオブジェクトを作成し、あるいはシステム内のオブジェクトの状態を読み出しうる。外部世界は、システム内のどのオブジェクトの状態も変更することができないが、オブジェクトは関数を介して呼び出すことができる。しかし、このような関数呼び出しによって、異なるマシン上の対応するオブジェクトの実行間にばらつきが生じないことを保証するために、関数呼び出しは、好ましくは、関数への引数が同じで、関数が呼び出されたフレーム番号が同じであれば、常に、システム内の全コンピュータで全く同じ結果を返さなければならない。このような関数呼び出しは、好ましくは、呼び出しオブジェクトのローカル状態を変更できてはならない。
【0024】
また、メッセージは、コンピュータプログラムの所定のフレームに添付されるか、あるいはこれに関連付けられる。フレームがクロックに添付されてもよく、これにより、新しいフレームが、(例えば)50分の1秒ごとに起動されても、新しいフレームが最後のフレームの終了後直ちに開始されても、あるいは、フレームがパイプラインで実行され、個々のオブジェクトの実行が、実行を完了するために十分な入力データが利用可能になるたびに開始されてもよい。
【0025】
英国特許出願第0712496.9号明細書に提案されている実行環境は、高度の決定性によりコンピュータコンポーネントの実行を容易にするという点で非常に有利である。つまり、同じ状態にある、(例えば、ゲームのキャラクタを実装している)オブジェクト等の対応するコンポーネントが、2台の別のコンピュータまたは2つの別の時点で同じコードを実行した場合に、オブジェクトの新しい状態が、2台のマシンまたは2つの時点で同じとなり有利である。
【0026】
フレームは階層構造を有していてもよく、この場合、全体的なフレームクロックがサブフレームに分割される。この構成により、一連のプログラムコンポーネントが、複数のオブジェクトに分散されている特定のアルゴリズムについて、非常に高速なフレームカウンタで動作することが可能となり有利である。最も粒度の大きなフレームは、ネットワークフレームに対応し、最も粒度の小さい好ましいフレームは、現在のプロセッサ上でのオペレーションに対応することが想定される。本発明の実施形態によれば、コンポーネントの状態は、フレームの始点または終点においてのみ参照することができ、このため、あるフレームの始点における状態は、その前のフレームの終点の状態に等しくなる。このため、いうまでもなく、本発明の実施形態によれば、フレームの始点におけるシステムの状態は、その前のフレームの終点におけるシステムの状態およびシステムが受け取った任意の外部メッセージのみの関数である。フレームの始点におけるシステムの状態は、そのフレームの始点における全コンポーネントの状態と、その前のフレームから送信された全メッセージからなる。このため、複数のコンポーネントを含むコンピュータプログラムについて、システムの全コンポーネントのサブセットを定義することが可能である。サブセットは真部分集合であっても、1つのコンポーネントが存在する場合には、非自明な部分集合であってもよい。特定のフレームでのシステム内のコンポーネントのサブセットの状態は、その前のフレームの始点におけるこれらのコンポーネントの状態と、以前のフレームからコンポーネントのサブセットに送信された全メッセージとの関数である。
【0027】
数式化すると、On,iがフレームnの始点におけるコンポーネントiの状態であり、Mn,iがフレームnからフレームn+1までにコンポーネントiから送信されたメッセージのリストであり、fn,iがフレームnにおけるオブジェクトiの挙動に対応する関数であるとすると、以下の式が成立する。
(On+1,i,Mn+1,i)=fn+1,i(On,i
これは、フレームnの関数であり、フレームn+1の状態を返す。上記式からわかるように、フレームn+1の全体の状態はフレームnのみの関数である。つまり、フレームn内に相互依存が存在せず、このため、フレームn内の全オブジェクトを有利に並列に実行することができる。
【0028】
好ましくは、オブジェクトの各インスタンスの各フレームは、オブジェクトデータとオブジェクト実行ポイントを含む。このため、実行ポイントがエラーであるか終了の場合の計算の終了の場合を除き、どのフレームの始点および終点でも、実行ポイントは次フレームステートメントとなる。次フレームステートメントは、フレームで実行される最後の命令である。好ましくは、使用時には、本発明を実施する実行環境は、次フレームステートメントまで各フレームを実行するように動作する。このため、オブジェクトのコードが実行されるときには常に、オブジェクトの状態が反復的に変更される。しかし、好ましい実施形態によれば、反復的な変更および中間状態は他のどのオブジェクトからも決して見えず、他のオブジェクトからは、前のフレームの終点における状態しか見ることができない。
【0029】
本発明の実施形態によるコード更新技術の有用な用途は、プログラムの実行を観察する、より詳細には、実行中のプログラムの状態変化を観察または監視する役割を果たす、いわゆるwatchdogスレッドまたは監視オブジェクトを提供することが望ましい状況で生ずる。
【0030】
プログラムの実行の性能、例えば正確性や効率、の観察は、アプリケーションの実行の前後のそのアプリケーションの状態の知識に基づいて容易に行うことができる。また、プログラム実行環境の状態変化をリアルタイムで観察でき、場合によっては、この観察に基づいて実行中のプログラムとの対話を行うことができることは、いくつかの理由から望ましい。この目的のために、実行環境内に設けられ、別のスレッド、オブジェクトまたはルーチンの状態の定期的なチェック機能を実行するように動作する、いわゆるwatchdog、オブジェクトまたはルーチンを提供することが知られている。watchdogは、一般に、チェック対象のコンポーネントの特定の性質または挙動を観察すると、通知を出すことができる。例えば、実行中のプログラムの特定のアイテムを監視するように動作するwatchdogスレッドを提供し、クラッシュまたは実行の失敗の際に通知を出し、この結果、監視対象のアイテムを再起動することが知られている。
【0031】
多数のプレイヤー制御のアクターおよびAI制御のキャラクターのアクションと対話、およびその環境に応じて急速に変化する、システムの内部状態が極めて動的なMMOGなどの分散アプリケーションで行われているコンポーネントの実行を監視することが特に求められている。このような状況では、いうまでもなく、状態の一部は、サーバに非公開か、サーバと1つ以上のクライアントの間で共有されているか共有可能であるか、またはクライアントに非公開かである。これらの状況のそれぞれにおいて、この状態情報を監視し、場合によっては処理することが求められている。
【0032】
MMOGなどの分散システムの状態の検査または観察を行うための既存の技術では、通常、プログラムの実行の所定の時点におけるシステムの状態が、データベース管理システム(DBMS)にダウンロードされる。次に、この結果得られたデータは、例えばそのシステムのコンポーネントの挙動の点においてシステムに有益になされ、その後実装可能な変更または改良を特定する目的でオフラインで複製および照会されうる。
【0033】
常に進化しているインタラクティブな分散システムでは、いうまでもなく、DBMSを介してオフラインで照会されるデータは急速に古くなるかまたは役に立たなくなるため、既存の手法では不十分である。更に、システムを変更する機会がおそらく失われると考えられる。更に、データを元の形式から有用な問い合わせ可能な形式に変換するには、かなりの労力を要する。
【0034】
コンピュータプログラムのコンポーネントの実行を監視するための機能を改善および改良することが望ましい。特に、プログラムの実行が、通常はサーバとクライアントの組を含むマシンの組に分散されている分散環境、特にMMOGなどの長時間にわたる分散オンラインアプリケーション、で実行しているプログラムコンポーネントの状態のリアルタイムの監視を容易にできるようにすることが求められているが、これに限定されない。
【0035】
本発明の第3の態様によれば、複数のプログラムコンポーネントを含み、前記プログラムの1つの前記コンポーネントは、前記プログラムの少なくとも1つの他のコンポーネントとは独立して実行し、監視情報を得るために、実行中に前記他のコンポーネントの状態を監視する(が好ましくは変更しない)ように動作する監視コンポーネントを有し、前記監視オブジェクトは、前記監視情報に基づいて、前記他のコンポーネントの挙動および/または前記他のコンポーネントと対話するプログラムコンポーネントの挙動に作用するように更に動作する実行環境が提供される。
【0036】
監視コンポーネントは、他のプログラムコンポーネントと並列に実行されうる。別法では、あるいは上記に加えて、逐次実行のために、監視コンポーネントおよびプログラムコンポーネントをインターリーブすることもできる。
【0037】
第3の態様の一実施形態によれば、実行環境は複数のマシンに分散される。好ましくは、前記実行環境は、コンピュータプログラムのコンポーネントの実行が複数の連続する実行フレームで実行されるように動作し、前記実行環境は、i)異なる実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を許可し、かつii)同一の実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を阻止するように更に動作可能である。この実施形態の利点は、監視対象のコンポーネントに対して監視コンポーネントを実行するための一連の明確な安全ポイント(すなわち隣接する実行フレーム間の遷移)が存在するという点にある。従来の実行技術では、検査されている状態の妥当性を保証するのが難しく(例えば、監視の実行中に状態が変化しうる)、このため、監視の実行をスケジュールすることが困難である。
【0038】
本発明の第3の態様の実施形態の重要な特徴の1つに、監視コンポーネントが、監視対象のコンポーネントの挙動を制御するのではなく、他のプログラムコンポーネントの挙動に作用するように動作する点がある。プログラムコンポーネントは、独立した計算モデリング、例えば、ゲーム内エージェント、として実行する。このエージェントは、入力、プライベートな内部状態および事前にプログラムされている挙動の組合せから、自身の動作の流れを決定する。本発明の好ましい実施形態によれば、エージェントの内部状態を参照または変更することはできないが、つまり、エージェントを直接制御することはできないが、例えば、エージェントにゲームの世界を適切に知らせるために、エージェントへの入力を増やすことができる。ゲーム内エージェントは、自身の動作の流れを決定する際に、自身が受信した全入力を考慮するように記述することができる。
【0039】
監視コンポーネントは、監視されているコンポーネント、または監視されているコンポーネントと対話するシステム内の他のコンポーネントの挙動に直接作用するように動作してもよい。別法では、少なくとも1台のサーバマシンを含む分散システムの場合、監視オブジェクトは、関連するコンポーネントの挙動を変更するように求める要求を発行するように動作可能であり、これがサーバに送信される。サーバマシンは、この要求に適宜応答し、関連するコンポーネントの挙動の要求された変更を実施することができる。
【0040】
本発明の第1の態様および第2の態様の実施形態は、コンピュータプログラムに、1つ以上の監視コンポーネントを動的に、すなわちその実行中に、生成できるようにするために便利に使用することができる。例えば、コード更新には、プログラムの実行中に作成される監視コンポーネントを定義しているコードシーケンスまたはコード部分が含まれうる。好ましくは、監視コンポーネントは、プログラムの少なくとも1つの他のコンポーネントと並列に実行し、実行環境によって実行されている間に、監視情報を得るために、実行中に前記他のコンポーネントの状態を監視するように動作し、前記監視オブジェクトは、前記監視情報に基づいて、前記他のコンポーネントの挙動および/または前記他のコンポーネントと対話するプログラムコンポーネントの挙動に作用するように更に動作する。このため、コンピュータプログラムの実行によって生成される仮想世界をシミュレーションするように動作することが意図されていないが、これを監視しようとする1つ以上のコンポーネントからなる新しい計算を動的かつ安全に追加することが可能となる。このコンポーネントは、ゲーム世界内で対象のコンポーネントを効果的に「追跡(shadow)」し、例えば、監視対象のコンポーネントとの通信(メッセージの交換)を介してその発見物を報告するか、または何らかの訂正機能またはインタラクティブな機能を実行する。
【0041】
監視コンポーネントは、1)サーバ、または、2)クライアントとサーバの両方、のいずれかで実行可能であることはいうまでもない。
【0042】
前記監視コンポーネントの使用例として以下が挙げられる。
− ゲーム内通信のコンテンツの監視。例えば、猥褻または不正な挙動がないかについてのゲーム内テキストベースのチャットのコンテンツの監視など。
−難易度の動的チューニング。監視コンポーネントは、個々のプレイヤーオブジェクトを監視し、プレイヤーにとってのゲームの見かけの難易度を判定して、そのプレイヤーにとってゲームを簡単あるいは難しくするように、ゲーム内オブジェクトに指示する。
− 詐欺の検出。サーバ上の監視コンポーネントは、サーバ上のオブジェクトの観察可能な挙動をクライアントと比較し、クライアントのハッキングの有無を検出することができる。
− 統計情報の収集。他のオブジェクトの状態の測定および統計解析を実行するために、監視コンポーネントを使用することができる。例えば、時間経過に伴うプレイヤーの健康の変化範囲を記録することができる。
− ゲーム内からのログ記録。ゲーム世界内のイベントを監視および報告するために、監視コンポーネントを使用することができる。これを使用して、ゲーム内での進行の早さを決定するために、ゲーム世界内でのプレイヤーの進行をトラッキングすることができる。
− ゲーム内でのエラー条件の確認および報告。監視コンポーネントは、オブジェクトまたは一連のオブジェクトの何らかの不変条件を定期的に検査し、違反をエラーログに報告することができる。
− watchdog方式の監視。クラッシュしたゲームオブジェクトを検出し、これを再起動するために、監視コンポーネントを使用することができる。
− 所定のシナリオでとるべきアクションをプレイヤーにアドバイスする、ゲーム内ヘルプ/チュートリアル/アドバイスシステム。
− ゲーム世界の一部でないが、ゲーム世界の一部に関して問い合わせるか、またはこの結果をまとめる、ゲーム内ユーザインタフェース要素の表現(クライアント上のスコアボードやサーバ上のダッシュボードなど)。
− 通知の情報源をプレイヤーのシャドウ(shadow)として提示することにより、ゲーム外のイベント(例えば、電子メールの通知やインスタントメッセージング(IM))をゲームに送信することができる手段の表現。
【0043】
監視コンポーネントは、好ましくは適切なコンテキストで構成され、監視対象のオブジェクトの識別情報を与えられる。その後、監視コンポーネントは、監視されているオブジェクトと同じコンテキストで有利に実行し、監視対象のコンポーネントの実行に干渉することもなく、そのコンポーネントとの通信を介してのみ、例えば、オブジェクトの受け渡し機構によって、そのように動作するということもなく、その機能を実行する。
【0044】
監視コンポーネントは、ゲームサーバ上で生成され、クライアントに複製されてもよい。別法では、個々のクライアント上に生成されてもよい。
【0045】
監視コンポーネントにより、大規模かつ実行期間の長いシステムにおける複雑な動的挙動を詳しく理解できるようになる。更に、システムの一部の挙動を理解するために、一連のシャドウを連続的に導入および/または除去し、対象の部分の監視および報告を行うことも可能である。
【0046】
本発明の好ましい実施形態によれば、新しい挙動および機能を、実行中のシステムに安全かつ動的に追加することができ、最も適切な場所で実行することができる。従来はクライアントコードまたはサーバコードの変更と再起動を要した技術を、実行中のゲームにおいて有利に動的に行うことができる。
【0047】
いうまでもなく、オブジェクト指向システムにおいては、プログラムコンポーネントは、オブジェクト、すなわち、データとそのデータに操作するために必要なプロシージャを含むコンピュータプログラムの一部を形成している別個のアイテム、を含むことができる。しかし、本発明の態様または実施形態は、オブジェクト指向システムだけに限定されず、このため、プログラムコンポーネントがプログラムスレッドまたはルーチンを含むと考えてもよい。
【0048】
上記の実施形態または態様のいずれにおいても、各種特徴を、ハードウェアで実装しても、1つ以上のプロセッサで実行されるソフトウェアモジュールとして実装してもよい。ある態様または実施形態の特徴を、別のいかなる態様または実施形態に適用することができる。
【0049】
また、本発明は、ここに記載する技術を実装するためのコンピュータプログラムまたはコンピュータプログラム製品、およびここに記載する技術を実装するためのプログラムが記憶されているコンピュータ可読記憶媒体を提供する。本発明を実施するコンピュータプログラムは、コンピュータ可読媒体に記憶することもできるし、例えば、インターネットのウェブサイトから提供されるダウンロード可能なデータ信号などの信号の形式をとってもよいし、他のどのような形式をとってもよい。
【図面の簡単な説明】
【0050】
【図1】本発明の一実施形態によるコード更新方法に含まれるステップを示す。
【図2】本発明の一実施形態によるコンポーネントの実行中に発生する実行サイクルを示す。
【図3A】第1の元のコードシーケンスおよび第2の更新されたコードシーケンスを示す。
【図3B】第1の元のコードシーケンスおよび第2の更新されたコードシーケンスを示す。
【図4】プログラムコンポーネントの実行シーケンスの詳細図を示す。
【図5】分散コンピュータシステムのブロック図である。
【図6】オブジェクトのフロー図を示す。
【図7】プログラムの実行図である。
【図8】2台のネットワーク接続されたコンピュータの模式図であり、一方には複数のオブジェクトが記憶されている。
【図9】図8のコンピュータの別の図であり、オブジェクトのサブセット(a、b、cおよびd)が第1のコンピュータから第2のコンピュータにコピーされる。
【図10】図9のコンピュータの図であり、第1のコンピュータにおけるメッセージ(x、yおよびz)が第2のコンピュータに複製されている。
【図11】図9および図10の第2のコンピュータへの別のオブジェクト(e)の追加を示す。
【図12】図11の第2のコンピュータに複製されているメッセージを示す。
【発明を実施するための形態】
【0051】
本発明をよりよく理解し、これを実施することができる方法を示すために、例示を目的として添付の図面を参照する。
【0052】
図1は、サーバ装置Sと、2台のクライアント装置を含む分散システムにおけるコード更新方法に含まれるステップを示す。サーバとクライアントは、サーバ実行環境E、および2つのクライアント実行環境Ec1およびEc2を含む実行環境でコンピュータプログラムを実行しており、プログラム実行環境全体は、各装置にわたるとみなすことができる。サーバとクライアントは、ネットワーク伝送システムNを介して相互に対話するように動作可能する。
【0053】
実行環境は、i)異なる実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を許可し、かつii)同一の実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を阻止するように動作する。
【0054】
本実施形態によれば、最初のステップIにおいて、オペレータが、実行中のプログラムのソースコードの一部を変更するか、既存のプログラムコードに追加するために新しいコード部分を記述し、これにより、コード更新部分のソースコードを生成する。第1のサーバステップSにおいて、コード更新部分がコンパイラ11でコンパイルされる。第2のサーバステップSにおいて、安全性チェックが実行され、この間に、コード更新手段12(コードアップデータ)は、コンパイルされたコード更新部分を、サーバ実行環境Eによって実行中の既存のプログラムコードに組み込もうと試みる。具体的には、この試みは、コンポーネントの実行が停止され、このため、プログラムに含まれる全てのコンポーネントの状態が一定に保たれる隣接する実行フレーム間の遷移で実行される。
【0055】
本実施形態では、更新に対する安全性チェックはサーバで実行される。このため、サーバは更新を受け付けるか、または更新の実行が危険であるとしてこれを拒否する。受け付けられた場合、第3のサーバステップSにおいて、クライアントCおよびCへの更新の配信が、スケジューラ13によって、例えばユーザ指定の時間を置いた後などの指定された時間にスケジュールされる。最後に、更新がネットワークN全体で同期して行われるように、コード更新部分が、接続されたクライアントに送信される。本実施形態によれば、更新は、その更新を適用する時間が到来するまで、各クライアントマシンに記憶される。クライアントでの更新のタイミングは、フレーム識別情報(例えばプログラムの時間概念)に応じて指定される。
【0056】
第1のクライアントステップCにおいて、クライアントは、コード更新部分を受け取る。第2のクライアントステップCにおいて、クライアントは、特定のフレーム遷移においてコード更新手順を実行するように動作し、この間に、既存のプログラムコードにコード更新が組み込まれ、必要であれば、そのコード部分の前のバージョンが除去される。第3のクライアントステップCにおいて、プログラムの実行が、フレーム遷移の後のコードステートメントから続けられる。
【0057】
好ましくは、本発明を実施する方法は、以下の望ましい特性を示す。
1.処理は好ましくは安全でなければならない。実行中のプログラムのクラッシュやデータの破壊を引き起こす変更を許可しないように、好ましくは、実行中のプログラムの状態と互換性がないプログラムコードの変更は阻止する必要がある。
2.好ましくは、コード更新後のプログラムの実行の再開が、あらゆる場合において可能でなければならない。好ましくは、コード更新により、コード更新の実行後は実行することができないゲームオブジェクトを残してはならない。
3.好ましくは、コードを更新しても安全であるポイントを特定することが可能でなければならず、例えば、更新の適用が可能であることが保証されている明確なポイントが存在していなければならない。更に、好ましくは、このようなポイントに達するのに非常に長い時間がかかってはならない。
4.好ましくは、分散システム全体にグローバルでなければならない。システム内でコードが均一であることを保証するために、コード更新は、分散システムに参加している各クライアントに送信されなければならない。
【0058】
本実施形態によれば、第1の点は、サーバSにあるコンパイラ11により、更新のコンパイル中に適用される一連のルールによって保証することができる。このルールに反する更新は適用されなくなる。いうまでもなく、本質的には、本発明の実施形態は、プログラムのコードを変更しようとするものであって、実行中のプログラムコンポーネントの状態を変更するものではない。既存のデータが別の形で再解釈されるのを許容することは危険であるため、既存の状態の解釈を変更するコード変更が有利に阻止される。
【0059】
第2の点は、例えば、「イールドポイント」または「イールドステートメント」と呼ぶことができる、プログラム内の所定のポイントのみでコード更新手順を実行するように動作するコード更新手段によって保証することができる。本発明においては、「イールド」とは、計算の実行を停止し、実行環境に制御を戻し(実行環境が、スケジューリングなどの他のアクションの中でコード更新を実行できるようにする)、その後、実行環境により計算の実行が再度スケジュールされると、イールドポイントの直後のステートメントで計算の実行を再開することを含むと考えることができる。換言すれば、イールドポイントとは、1)実行停止、および2)実行再開の両方のポイントである。このため、実行は、コード更新手順後にイールドの直後のステートメントから再開されうる。本実施形態によるコード更新手順中は、好ましくは、各オブジェクトの実行を再開するための場所が存在するように、イールドポイントが削除されない(追加のイールドポイントが挿入されることもある)ことが、コード更新に対して実行されるチェックにより保証される。
【0060】
第3の点は、フレームベースの実行モデルの特性により保証することができる。フレームベースの実行モデルでは、プログラムスレッドが実行されていない保証されたポイント、すなわちフレーム遷移のポイントが存在する。これにより、フレーム遷移ポイントでコード更新を安全に適用できるようになる。
【0061】
第4の点は、新しいコードによる更新の時間に先立って、クライアントにメッセージを送信し、更新がスケジュールされているが、更新が実行される前に参加する新しく接続するクライアントにコードを送信する場合には、既存のコードと共に更新をバンドルすることによって処理することができる。
【0062】
最後に、いうまでもなく、実行中のコードを動的に更新できるからといって、全ての更新を、このように適用すべきであるとは限らない。動的に適用できない更新は、スケジュールされた保守時のMMOの利用の低い時間に、従来の方法で実行することができる。
【0063】
本発明の理解を助けるために、図2は、本発明の一実施形態によるコンポーネントの実行中に行われる1つの実行サイクルを示す。この実行サイクルは、4つの別個のステップを含むと考えることができ、そのうちの3つ(S、S、S)は、所定の実行フレームの実行中に行われ、一時的停止(S)は、フレーム遷移で行われる。
【0064】
本発明の好ましい実施形態によれば、実行中のプログラムコンポーネントは、その実行のためのコードを直接参照しない。その代わり、所定のプログラムコンポーネントは、識別情報ルックアップテーブルを備え、これが、実行中に、適切なコードシーケンス(1つ以上の命令を含む)を検索するために使用される。
【0065】
このため、再び図2を参照すると、ステップSにおいて、実行環境は、次の記憶された識別情報(ID)に対応するコードシーケンスを検索するように動作する。ステップSにおいて、次のイールドIDに達するまで、その記憶されたIDに対応するコードシーケンスの1つ以上の命令が実行される。このため、ある命令から次の命令に移動する(インクリメント)か、現在の命令のオフセットからオフセットする(加算/減算)ことによって、別の命令に移動することが可能である。次のイールドIDが取得されると、実行シーケンスはそのコンポーネントで有効に停止され、フレーム遷移Sが発生する。所定のコンポーネントの全命令が実行されると、実行サイクルは停止する(S)。
【0066】
図3Aは、プログラムコードシーケンスP、およびそのシーケンスの更新バージョンであるPの例を示す。プログラムシーケンスPには、命令のシーケンス1…Nが含まれ、プログラムシーケンスPには、命令のシーケンス1…Mが含まれる。このため、いうまでもなく、PがPに更新されるコード更新手順には、コードの追加が含まれる。図3Bは、好ましい実施形態による、プログラムコンポーネントが、一連のIDを含むルックアップIDテーブルによって有利に定義される方法を示す。各IDは、コードのシーケンスまたはコードのシーケンスの始点に対応しており、これらは、バルクのプログラムコード内で、そのコードシーケンスのオフセットを参照して取得することができる。より詳細には、図3Bは、コードシーケンスの第1のバージョンVと、そのコードシーケンスの更新バージョンであるVに対するルックアップIDテーブルを示す。本発明を実施するコード更新手順に従って更新されたコードシーケンスVが、追加のコードシーケンスIDを含むことは明らかである。本発明のコード更新技術によれば、コンポーネントが実行していないフレーム遷移で発生するコード更新手順中に、既存のコードと既存のルックアップテーブルが置換される。その後、命令を検索するための新しいIDテーブルに基づいて実行が再開され、これが新しいコードに由来する更新をポストする。
【0067】
本発明の実施形態によれば、コードシーケンスバージョンVの全てのIDがVに存在する、すなわち、コードシーケンスVはIDの上位集合である。しかし、コードシーケンスV内のIDに関連付けられているオフセットは、コードシーケンスV内のIDに関連付けられているオフセットと異なっていることがある。
【0068】
図4は、プログラムコンポーネントの実行シーケンスのより詳細な図を示し、実行シーケンス中に、コード更新手順が実行され、コンポーネントバージョン1(C)からコンポーネントバージョン2(C)へのプログラムコンポーネントコードのコード更新が実施される。コンポーネントバージョンCの実行中、完全な実行サイクルには、3つのコードシーケンスと2つのイールドポイントの実行が含まれる。コード更新は、このプログラムコンポーネントの変更されたバージョンを含み、変更されたバージョンには、4つのコードシーケンスと3つのイールドポイントが含まれる。このため、プログラムコンポーネントコードの変更には、追加コードシーケンスの追加、すなわちコードシーケンス4、と追加イールドポイント、すなわちイールドポイント3、の追加が含まれる。更に、実行シーケンスの全体の各コードシーケンスの順序/位置がバージョン2で変更されている。また、いうまでもなく、コードシーケンスの内容は、バージョン1とバージョン2では異なっていてもよい。
【0069】
本実施形態によれば、実行サイクルのイールドポイントでコード更新手順を実行するように動作可能なコード更新手段が提供され、各イールドポイントは、隣接する実行フレーム間のフレーム遷移と一致する。いうまでもなく、分散システムでは、プログラムコンポーネントの複数の表現またはインスタンスが実行されており、おそらく実行サイクルの異なる段階にあると考えられる。このため、プログラムコンポーネントは、コード更新部分を受け取ると、イールドポイント1またはイールドポイント2でコード更新手順を実行し、コード更新を実施しうる。更新手順の完了後は、元のコード(バージョン1)は今後使用されることはなく、コンピュータプログラムから削除または除去される。
【0070】
完璧を期するために、以下の説明では、本発明の実施形態による実行環境の動作および技術的な実装に関して更に詳細に記載する。
【0071】
図5は、複数のユーザのコンピュータ1〜4を、複数のプロセッサ/サーバに分散されているソフトウェアと対話可能にするコンピュータシステムを示す。このシステムには、実行環境、ネットワーク伝送システム、通常はインターネット、および外部の言語とシステム(「外部世界」)へのインタフェースが含まれる。実行環境は、ユーザのコンピュータとプロセッサ/サーバとに別々に存在しているように示されているが、いうまでもなく、これは模式図に過ぎず、実際には、実行環境がこれらの全てにわたって存在している。ソフトウェアを開発し、コード更新を記述するなどのために、開発コンピュータにコンパイラ(図示せず)が必要である。システムは、通常のデータアクセスモデルを提供している(つまり、プログラマからみた、システム内の全オブジェクトに対するアクセスが等しい)。システム内の全てのデータは、オブジェクトの形をとっている。オブジェクトへの参照は、分散システムのどの部分にあるオブジェクトを示していてもよい。ポインタが、システム内の複数のマシンに複製されているオブジェクトを参照していてもよい。
【0072】
コンパイラは、オブジェクトの定義を取得し、実行環境で実行するために、これらを命令にコンパイルする。利用可能な実行環境命令には、整数および浮動小数点の値に対する数値演算(浮動小数点演算は、全てのシステムで一貫して定義されている必要がある)、整数および浮動小数点の値または他の形式のデータに対する条件操作、現在のオブジェクトの状態を変更するが次のフレームの他のオブジェクトからしか見えない操作、特定のタイプの新しいオブジェクトの作成(次のフレームのみで利用可能)、他のオブジェクトへの参照の取得とその状態の読み出し、そのオブジェクトの破壊、別のオブジェクトへのメッセージの送信(次のフレームのみで受信される)、受信したメッセージのチェックとその値の読み出し、および外部システムによって定義される関数の呼び出し(この関数は、このフレームのシステム状態を変更してはならない)が含まれうる。
【0073】
図5に示すシステムの実行環境は、バーチャルマシンとして実装することができる。このバーチャルマシンは、一連のフレームを保持している。各フレームは番号を有する。各フレームにはオブジェクトとメッセージが存在する。メッセージは2つのフレームに添付される。メッセージは、1つのフレームから送信されて、次のフレームで受信される。バーチャルマシンは、フレーム、オブジェクト、およびメッセージを記憶するためのシステムを有する必要がある。所定の時間において、記憶されている少なくとも1つのフレーム(現在の一貫したフレーム)が存在する。フレームの実行中は、記憶域には、少なくとも2つのフレーム(現在のフレームと次のフレーム)が存在している。オブジェクトは現在のフレームから読み出され、実行された後、次のフレームに書き込まれる。
【0074】
高度の決定性を保証するために、メッセージのキューが保持され、これにより、フレームおよびターゲットオブジェクトが与えられると、そのオブジェクトに送信されるメッセージのリストを返すことができる。このため、実行環境は、このキューを保持するように動作する。このため、フレームnから送信されたメッセージはフレームn+1に到着する。このため、好ましくは、各フレームの各オブジェクトに対して、別個のキューを保持しなければならない。一貫した実行を維持するために、メッセージは、あらかじめ定義されたソート仕様を使用してソートされる。ソート仕様が、ネットワーク全体で一貫しており、プログラムの決定性が損なわれないようにメッセージを順序付けする限り、ソートの仕様は重要でない。このため、完全に同一の2つのメッセージAとBが存在する場合、AとBの相対順序は重要でない。AとBがどのような形であれ区別しうる場合には、順序が(場合によっては)重要となりうる。メッセージは、フレーム番号を添付されてシステムに送信される。このため、システムは、このメッセージを正しい場所に記憶する。
【0075】
本発明の実施形態は、好ましくは、オブジェクトを特定するためのシステムを提供し、これにより、オブジェクトおよびフレーム番号が与えられると、実行環境は、その記憶域内、またはネットワークの別の場所でオブジェクトを発見することができる。オブジェクトが記憶域内に存在しないが、ネットワークの他の場所で利用可能である場合、実行環境は、ネットワークを介して、オブジェクト状態を要求する要求を送信するように動作する。他システム上の実行環境は、この要求を受信し、ネットワークを介してオブジェクト状態を返送するように動作する。実行環境は、今後使用されないフレーム、オブジェクトおよびメッセージを破壊するように適合されうる。一般に、一貫した実行フレームよりも古いフレーム、オブジェクトおよびメッセージは今後必要とされない。また、システムは、オブジェクトのセットを保持し、そのセットに属するオブジェクトとそのセットの外部のオブジェクトとを迅速に判定するように適合されている。これは、投機的実行およびネットワーキングに使用される。
【0076】
図5のシステムは、あるフレームについて、全てのオブジェクト状態およびメッセージが利用可能となるタイミングを知るように動作する。メッセージがネットワークにある別のコンピュータから送信されている場合、システムは、全メッセージの到着が完了したタイミングを特定する必要がある。全てのメッセージが利用可能となるまで、フレームの一貫した実行が開始されない。また、システムは、1つ以上の投機的実行フレームを保持できる必要がありうる。これは、一貫した実行フレームより先の別のフレームである。投機的実行フレームは、一貫した実行フレームから投機的実行フレームまで実行し、失われたオブジェクトまたは利用可能でないメッセージを一切無視することにより生成される。システムは、この実行によって使用された全てのメッセージを元のフレームに保持しなければならない。オブジェクトが自身を破壊すると、そのオブジェクトへの参照の全てが、無効な参照(dead
reference)を明確に定義する状態に変更されうる。これは、オブジェクトが自身を破壊するとき、または使用時に行われうる。参照されていないオブジェクトを破壊することは許されない。このようなオブジェクトは、システムでまだ使用中の可能性がある。
【0077】
ネットワーク伝送システムは、オブジェクトおよびメッセージを、サイズに応じて1つ以上のネットワークパケットにシリアライズすると共に、パケットをオブジェクトおよびメッセージにデシリアライズする逆の手順を実行するように動作する。また、個々のフレームに添付されているオブジェクトおよびメッセージを受け取り、これらをローカル記憶域に記憶することも可能である。また、ネットワーク上の他のマシンに複製すべきオブジェクトのセットを特定するシステムも実装している。複製されるセットおよびマシンは、リストなどの適切なデータ構造に記憶されなければならない。セット境界を越える全てのメッセージを発見し、そのメッセージを、それを必要としているマシンに送信することが可能でなければならない。また、ネットワーク上の別のマシンに複製されているオブジェクトのセットに対して、ローカルマシン上のオブジェクトから送信されるメッセージは、関連するマシンにも送信する必要がある。現在のフレームについて、ローカルマシンからの全てのメッセージがオブジェクトに送信されると、このフレームについて、このシステムから全てのメッセージを受信していることを通知するメッセージを、この別のマシンに送信する必要がある。これにより、この別のマシンは、現在のフレームのメッセージの待機をやめることができる。ローカルシステムからネットワークプログラミングシステムへのメッセージは、現在の一貫したネットワークフレームではなく、現在の投機的フレームにおいて送信されるとみなされる。すなわち、ユーザから送信されるメッセージは、投機的状態に適用させ、一貫したネットワーク状態が全メッセージを処理するまで、待ち行列に格納されるだけである。
【0078】
ネットワーク上のマシンの接続が切断される状況を処理するために、タイムアウトが設定され、これにより、マシンが、完全なフレームで充分なメッセージ(worth
of messages)を送信しなかった場合には、他のマシンは、当該フレームについて、このマシンからメッセージが送信されないとみなす。このマシンは、当該フレームについてそのマシンのメッセージが、一貫したネットワーク状態に全く受け容れられていないと仮定しなければならないというメッセージの送信を受ける必要がある。時として、全てのフレームについて、オブジェクトの状態をネットワークに繰り返し送信することが必要となり、これにより、ターゲットコンピュータ上の他のオブジェクトが、そのオブジェクトを実行する必要なく、そのオブジェクトの状態を読み出すことができるようになる。これは、メッセージのみが送信される境界が存在しないためである。隣接するオブジェクトの状態を読み出す連続した一連のオブジェクトが存在しうる。このため、隣接するオブジェクトが、ネットワークに繰り返し送信され、これにより、その状態を、マシンによって読み出されているオブジェクトによって読み出すことができる。
【0079】
外部の言語およびシステムへのインタフェースは、外部のネットワークプロトコル、メッセージングシステム、関数呼び出しインタフェースにリンクするためのAPIである。外部システムは、特定のタイプの新しいオブジェクトの作成(次のフレームのみで利用可能)、オブジェクトへのメッセージの送信、次のフレームが実行を開始するタイミングの制御、ネットワークで複製されるオブジェクトのセットの生成、現在のフレームまでの投機的実行、前のフレームについて受信されたメッセージのネットワークへの送信、特定のフレーム番号のメッセージが今後受信されないことを通知するメッセージを別のマシンが送信した際の通知、システムから呼び出し可能な関数呼び出しの作成(関数呼び出しが、分散システムの実行に影響するようにはシステムのグローバル状態を変更してはならない。さもなければ、ネットワーク整合性が損なわれてしまう。しかし、この呼び出しは、ユーザに情報を送信し、オブジェクトの状態を読み出すことができる)を行うことができる。外部システムは、オブジェクトの状態を変更することはできない。
【0080】
各オブジェクトは、オブジェクトの生成後に呼び出されるメインプロシージャを有する。メインプロシージャには、例えば、「次フレーム」ステートメントが含まれうる。オブジェクトは自身の状態を変更することができる。しかし、変更された状態は、次のフレームが開始するまで他のオブジェクトからは見えず、このため、コードがオブジェクトのローカルコピーを保持する。ローカルコピーのみがオブジェクトにより変更される。この変更されたローカルコピーは、フレームの終点においてオブジェクトによって返される。実行システムは、この返された変更されたオブジェクトを、このフレームに提供されているデータ記憶域に記憶し、元のオブジェクトを、元のフレームのためのデータ記憶域に保持する。このため、フレームnの実行中に、フレームn−1を記憶し、各オブジェクトの実行結果をnに記憶することが必要となる。フレームn+1が実行を開始するまで、フレームnは読み出されない。
【0081】
図6は、各オブジェクトのメインプロシージャのフローチャートを示す。ここで、コードフラグメントとは、(1)オブジェクトの生成時、または1つの次フレームステートメントから開始する、かつ(2)フロー図の全ての出口ポイントは、次フレームステートメントまたはオブジェクトの終了である、かつ(3)どのコードフラグメント内にも次フレームステートメントが存在していない、を満たすコード部分であると定義される。各コードフラグメントは関数であり、入力として、フレームn−1における参照された全オブジェクトの状態と、フレームn−1からフレームnまでの全てのメッセージをとり、戻り値が、フレームnにおけるオブジェクトの状態と、フレームnからフレームn+1までのオブジェクトからのメッセージである。各コードフラグメントは別々に実行可能形式にコンパイルされてもよいが、他の選択肢も可能である。各コードフラグメントの実行可能形式は、1つのエントリポイントを含み、オブジェクトの変更されたバージョンを返し、次のフレームが開始されたときに続行されるコードフラグメントへの参照を返す。実行可能なコードフラグメントは、次のフレームが開始されるまで、他のオブジェクトから見えるデータの変更を行うことができない。ローカル変数の値などのデータをあるフレームから次のフレームに保持するために、ローカル変数の値を記憶するためのスタックフレームがヒープに作成されうる。
【0082】
実行はフレームに分割される。各フレームについて、システムは、システム内の全オブジェクトを順次、1つずつ実行する。オブジェクトを順不同にまたは並列に実行することが完全に可能である。各オブジェクトは、そのオブジェクトのデータ量および実行ポイントを含む状態を有する。オブジェクトの生成時には、実行ポイントはオブジェクトのメインプロシージャの始点にある。オブジェクトのメインプロシージャの実行が次フレームステートメントに達すると、そのフレームでの当該オブジェクトの実行が停止する。フレームの終点で、新しいオブジェクト状態が記憶される。オブジェクトのコードの実行中に、メッセージが生成されうる。このメッセージは、待ち行列に格納され、ターゲットオブジェクトに添付する必要がある。メッセージを読み出せるのは、次のフレームのターゲットオブジェクトだけである。メッセージは、後述するように、ネットワークに送信する必要がありうる。また、オブジェクトがメッセージを読み出すことがある。メッセージは、決定論的順序で読み出される。これは、複数のシステムで順不同実行および並行実行を可能にするためである。順序は、システムによって定義することができ、ここには記載しない。フレームの終点では、全ての未使用のメッセージが廃棄されうる。全ての変更されたオブジェクトが変更され、フレーム番号が1だけインクリメントされる。実行が次のフレームに続けられうる。
【0083】
オブジェクトのコードを実行する前に、(このフレームについて)システム内(すなわちネットワーク全体)のあらゆるオブジェクトからの全てのメッセージ、またはこのオブジェクトが参照する他のオブジェクトの状態が利用可能でなければならない、ということを知っている必要がある。そうでない場合には、投機的実行が望ましいこともある。この場合、オブジェクトおよびそのフレーム番号を記憶する必要があり、必要な情報の全てがなくても、実行を続けることができる。しかし、オブジェクトは「投機的」とマークされ、必要な情報が全て入手できたときに、このオブジェクトに再び戻って、これを正しく再実行する必要がある。
【0084】
図7は、a〜dで示される4つのオブジェクトを含むシステムの実行を示す。フレームnにおける状態は既知であり、フレームnの実行によってbからaへのメッセージが生成されている。フレームn+1では、オブジェクトcが、オブジェクトbとdからデータを読み出す。フレームn+2では、オブジェクトaが、オブジェクトcからデータを読み出す。図7から、同一フレーム内ではオブジェクト間の依存関係が存在しないことがわかる。メッセージの依存関係は、あるフレームから次のフレームにしか存在せず、読み出しの依存関係は、現在のフレームから前のフレームにしか存在しない。これにより、システムが並列に、ネットワークで実行されることが可能となる。この図には、aがフレームn+1まで計算され、bが無視される部分実行が示されている。これは、現在の一貫したネットワーク状態を越えて実行し、投機的状態(正しい入力データと推測された入力データとの組み合わせに基づく)を計算することが可能であることを示している。しかし、後から、フレームn+1においてbがaにメッセージを送信することがわかった場合、フレームn+1でのaの実行が誤っている可能性があり、再計算が必要なことがある。
【0085】
各フレームでの各オブジェクトのコードは、前のフレームにおいて参照された全オブジェクトの値と、オブジェクトによって受信された全メッセージとの関数であると考えることができる。このため、フレームnにおけるオブジェクトと、フレームnからフレームn+1までのメッセージがシステム全体で一貫していれば、フレームn+1における全オブジェクトの状態と、フレームn+1からフレームn+2までのメッセージは、システム全体で一貫性のあるデータの関数となる。このため、初期状態と最初のメッセージが一貫性があり、関数が一貫した状態で実行されている限り、オブジェクトは一貫した状態に保たれる。決定性を実現するために、オブジェクトの初期状態と最初のメッセージは、システム全体に一貫して転送される。また、関数の実行も一貫している。このため、言語によって定義され、ローカルバーチャルマシンによって実行される全てのオペレーションは、一貫して定められた挙動を有する必要がある。浮動小数点演算は一貫した結果を与える。全てのデータ値は初期化される。破壊されているオブジェクトを参照することはできない。破壊されたオブジェクトに応答するアクションは一貫している。破壊されたオブジェクトを参照しようと試みることは可能であるが、必ずエラーとならなければならない。言語のエラー処理は一貫した方法で実行され、同じエラーに対して、あるマシン上のプログラムが、別のコンピュータ上のプログラムと異なる応答をしてはならない。
【0086】
オブジェクトは、ネットワークで複製することができる。すなわち、所定のフレーム番号について、ネットワーク上のあるマシンのオブジェクトが、別のマシン上のオブジェクトと全く同じ状態を有するということである。異なるコンピュータの複数のユーザが同じグローバル状態を参照および変更できるようになるため、これは、システムの好ましい目的である。例えば、これにより、コンピュータゲームの多数のプレイヤーが、同じゲーム世界でプレイし、対話できるようになる。各プレイヤーは、プレイヤーのクライアントマシン上に作成されるオブジェクトであり、他のプレイヤーのマシンおよび(ほぼ確実に)ゲームサーバに複製される。ゲーム世界は、全プレイヤーのマシンに複製される。ゲーム世界が全プレイヤーが対話するには大きすぎる場合、ゲーム世界のサブセットがプレイヤーマシンに複製されうる。この方法は、フレームnにおけるオブジェクトの状態が与えられると、ネットワーク全体で一貫してフレームn+1のオブジェクトの状態を計算することが可能であるという点に基づいている。
【0087】
図8〜10は、複数のコンピュータにオブジェクトを複製するための技術を示す。ここでは、7つのオブジェクトa〜gを有するコンピュータAにある4つのオブジェクトを、オブジェクトが存在しないコンピュータBに複製しようとしている。オブジェクト間でメッセージが送信されており、オブジェクト間を結ぶ黒い矢印で示される。オブジェクトを複製するために、最初に所望のオブジェクト、通常はオブジェクトのサブセット、が選択される。本例では、オブジェクトa、b、c、dが選択される。次に、開始する特定の複製フレーム番号が選択される。「複製フレーム番号」とは、複製の始点となるフレームの番号である。複製されるオブジェクトの各セットについて、複製フレーム番号を記憶する必要がある。オブジェクトは、複製フレーム番号から先は、同期した状態で存在するようになる。つまり、(複製フレーム番号後の)任意のフレーム番号において、両方のコンピュータのオブジェクトの状態が等しくなるということである。
【0088】
図1に示すように、複製フレーム番号において、選択されたオブジェクトの状態がネットワークを介してコンピュータBに送信される。コンピュータAとコンピュータBは、複製フレーム番号から続いており、同期された状態を保つことができる。複製されたオブジェクトのセットがコンピュータBに複製されて存在している限り、コンピュータAとコンピュータBは、複製されたオブジェクトのセットを覚えていなければならない。全ての後続のフレームについて、コンピュータAとコンピュータBは、サブセットの境界を越える全てのメッセージを検出しなければならない。このようなメッセージが図11に示されている。サブセットの完全に境界外または完全に境界内のメッセージは、ネットワークに送信する必要はない。本例では、メッセージx、y、zをネットワークに送信する必要がある。サブセット外からサブセット内に送られるメッセージを送信するだけでよい。コンピュータBでは、サブセットからコンピュータBには存在しないオブジェクトに送られるメッセージは廃棄することができる。
【0089】
オブジェクトaは、メッセージの送受信を行わなくてもオブジェクトeの状態を読み出すことが可能であるため、時として、全てのオブジェクトの状態をネットワークに送信することが必要となりうる。これは効率が悪い可能性がある。このため、最適なシステムは、オブジェクトのアクセスとサブセットの境界を越えるメッセージの量を最小限に抑えるように、ネットワークで複製するオブジェクトのサブセットを選択する。これは、必要に応じて、オブジェクトを追加したり、複製されたセットから削除することによって、動的に実現することができる。
【0090】
オブジェクトeを複製サブセットに追加すべきであるとシステムが判断した場合、サブセットが、図12に示すようにオブジェクトeを含むように拡張され、オブジェクトeがネットワークに送信される。オブジェクトeがサブセットに追加されると、eとサブセットの他のメンバ間のメッセージをネットワークに送信する必要がなくなる。しかし、図12に示すように、eとサブセットのメンバでないオブジェクト間のメッセージは、ネットワークに送信する必要がある。同じシステムを、コンピュータBにあるオブジェクトをコンピュータAに複製するのに使用することができる。
【0091】
ネットワークでソフトウェアを実行している場合、ネットワーク上のあるマシンで行われている変更と、ネットワーク上の他の全マシンに伝達されている変更との間に、遅延(または「レイテンシ」)が生ずる。ユーザとの即時の対話性を維持するために、現在わかっているネットワーク状態を越えて実行することが時として必要となる。しかし、後から、この即時応答を正しいネットワーク状態から訂正し、ネットワーク内の異なるマシン間でばらつきが生じないようにすることが重要である。本発明によれば、これは、2つの状態を保持することによって実現される。一方の状態は確定的ネットワーク状態であり、もう一方は、投機的な現在の状態である。確定的ネットワーク状態がフレームnであり、ユーザがフレームn+mでデータを入力している場合、投機的な現在の状態の計算は、フレームnからフレームn+mまでシステムに送られた全メッセージをキューに格納し、投機的な現在の状態を一時的記憶域にコピーして、キューに格納したメッセージを使用して、m個のフレームについて、一時的に格納された状態を実行することによって行われる。キューに格納したメッセージは、確定的ネットワーク状態が1フレーム先に移動するまで保持する必要がある。確定的ネットワーク状態によってメッセージが消費されると、メッセージを廃棄することができる。このシステムは、ネットワークレイテンシを処理するための汎用の投機的実行システムを提供する。ネットワークレイテンシを処理するための既存のシステムは、通常、システム内の各タイプのオブジェクトのために特別に記述した予測ソフトウェアを必要とする。このため、通常、プログラマは、ネットワークシステムに投機的予測を実装する方法を考察しなければならず、そうしなければ、ユーザの対話で多くのレイテンシが発生してしまう。これに対して、本願の発明では、ネットワークレイテンシを処理するためにプログラマが特別なことを行う必要がない。
【0092】
投機的な予測手法を実装するために、以下のコンポーネントが好ましい。
− 確定的ネットワーク状態のためのフレームカウンタ(確定的ネットワーク状態を1フレーム先に移動できる前に、確定的ネットワーク状態フレームのための全メッセージが、システム内の全マシンから受信されていることがわかっていなければならないため)
− 確定的ネットワーク状態以降に受信されたメッセージのキュー。これは、ローカルシステムから受信されたメッセージと、ネットワークから受信された任意のメッセージから構成される。
− 確定的ネットワーク状態を一時的記憶域にコピーするシステム。これが投機的な現在の状態となる。
− メッセージがなくなるまで一時的記憶域を実行する能力。
− オブジェクトを投機的に実行する能力。この結果、オブジェクトの値が入手できない場合にこの値を推測し、メッセージが入手できない場合にメッセージが送信されなかったと仮定する。
− ユーザへの表示のために、投機的な現在の状態を使用する能力。
これには、メモリにいくつかの異なるフレームを記憶するための記憶手段が必要となる。確定的ネットワーク状態は、常にメモリに保存しなければならない。
【0093】
本発明をいくつかの実施形態および実施例で説明し記載したが、本発明の原理から逸脱することなく、本発明を、さまざまに変更、実施、構成または適用可能なことは明らかであろう。本発明は、携帯可能な記憶媒体に記憶されるか、デジタル通信または他の伝送媒体によって送信されるか、またはコンピュータメモリに記憶されるソフトウェアプログラムおよびデータ構造にて実装することができる。このようなプログラムおよびデータ構造は、本発明を実施する方法を実行するため、およびここに記載した機能を有するマシンまたは装置の一部として動作させるために、コンピュータ上で実行することができる。

【特許請求の範囲】
【請求項1】
コンピュータプログラムのコードを更新するためのプロセスであって、
前記コンピュータプログラムのコード更新を実施するために、実行環境による前記コンピュータプログラムの実行中にコード更新手順を実行するステップを有し、
前記実行環境は、i)異なる実行フレームにおけるあるコンポーネントと別のコンポーネントの間の通信を許可し、ii)同一の実行フレームにおけるあるコンポーネントと別のコンポーネントの間の通信を阻止するように動作し、
前記コード更新手順は、隣接する実行フレーム間のフレーム遷移で行われるプロセス。
【請求項2】
前記コード更新手順によって、前記コンピュータプログラムのプログラムコンポーネントのコードが、第1のバージョンから第2のバージョンに更新される請求項1に記載のプロセス。
【請求項3】
前記プログラムコンポーネントの前記コードの前記第1のバージョンから前記第2のバージョンへの更新は、
前記プログラムコンポーネントのコードシーケンスの内容が修正される、
前記プログラムコンポーネントのコードシーケンスの実行順序が変更される、
前記プログラムコンポーネントの既存のコードシーケンスが削除される、または、
前記プログラムコンポーネントの新しいコードシーケンスが追加される、
のうちの1つ以上の効果を有する請求項2に記載のプロセス。
【請求項4】
前記コード更新手順によって、新しいプログラムコンポーネントのコードが導入される請求項1〜3のいずれか1項に記載のプロセス。
【請求項5】
前記新しいプログラムコンポーネントは監視コンポーネントを含む請求項4に記載のプロセス。
【請求項6】
前記実行環境は、サーバマシンのサーバ実行環境と、クライアントマシンの少なくとも1つのクライアント実行環境とに分散されており、
前記コンピュータプログラムの対応する表現は、前記サーバ実行環境と前記クライアント実行環境のそれぞれによって実行されており、
前記コード更新は、前記コンピュータプログラムの各表現を対象としており、
前記プロセスは、
前記サーバマシンにおいて、前記サーバ実行環境によって実行されている前記コンピュータプログラムの前記表現の前記コードを更新するために、前記コード更新手順を実行するステップと、
前記コード更新に関する情報を各クライアントマシンに送信するステップと、
各クライアントマシンにおいて、前記コード更新に関する前記情報の受信後に、前記クライアントマシンによって実行されている前記コンピュータプログラムの前記表現の前記コードを更新するために、前記コード更新手順を実行するステップと、
を更に有する請求項1〜5のいずれか1項に記載のプロセス。
【請求項7】
前記サーバマシンにおいて、前記コード更新に対する安全性チェックを実行するステップを更に有し、それにより、前記コード更新を実行しても安全であると判定された場合に、前記コード更新が前記クライアントマシンのみに送信される請求項6に記載のプロセス。
【請求項8】
前記サーバにおいて、現在実行されている前記コンピュータプログラムのバージョンに関して、前記コード更新が前記プログラムコードに対して行う変更を決定するステップを更に有し、前記コード更新に関する情報を各クライアントマシンに送信するステップは、前記クライアントマシンに前記変更を送信するステップを有する請求項6または7に記載のプロセス。
【請求項9】
前記実行環境は、異なる実行フレームにおけるコンポーネント間の通信のみを許可するように動作する請求項1〜8のいずれか1項に記載のプロセス。
【請求項10】
通信は、他のコンポーネントへのメッセージの送信、または他のコンポーネントからのデータの読み出し、の少なくとも一方を含む請求項1〜9のいずれか1項に記載のプロセス。
【請求項11】
通信は、予め決められた順序で処理される請求項1〜10のいずれか1項に記載のプロセス。
【請求項12】
更新すべきプログラムコンポーネントの実行中に発生するイールドポイントにおいて前記更新手順が実行される請求項1〜11のいずれか1項に記載のプロセス。
【請求項13】
コンピュータプログラムの1つ以上のコンポーネントを複数の連続する実行フレームで実行するように動作する実行環境を生成するように構成された実行環境生成手段を含むシステムであって、
前記実行環境は、i)異なる実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を許可し、ii)同一の実行フレームにおけるあるコンポーネントと別のコンポーネント間の通信を阻止するように更に動作し、
前記システムは、前記実行環境によって実行されているコンピュータプログラムのコード更新を実施するために、隣接する実行フレーム間のフレーム遷移においてコード更新手順を実行するように動作するコード更新手段を更に有するシステム。
【請求項14】
ネットワークを介して相互に対話する複数のマシンを有し、前記実行環境が前記複数のマシンに分散されている請求項13に記載のシステム。
【請求項15】
前記コード更新を生成するために入力プログラムテキストをコンパイルするように動作するコンパイラを更に有する請求項13または14に記載のシステム。
【請求項16】
前記コンパイラは、前記コンピュータプログラムの前記コード更新を実施するために前記コード更新手順を実行するように更に動作する請求項15に記載のシステム。
【請求項17】
1台以上のコンピュータで実行されると、前記コンピュータに、請求項1〜12のいずれか1項に記載のプロセスを実行させるコンピュータプログラムを格納するコンピュータ可読記憶媒体。
【請求項18】
1台以上のコンピュータで実行されると、前記コンピュータに請求項13または14に記載のシステムを作成させるコンピュータプログラムを格納するコンピュータ可読記憶媒体。
【請求項19】
キャリア媒体によって担持される請求項14、15または16のいずれか1項に記載のコンピュータプログラム。
【請求項20】
前記キャリア媒体は記録媒体である請求項19に記載のコンピュータプログラム。
【請求項21】
前記キャリア媒体は伝送媒体である請求項19に記載のコンピュータプログラム。

【図1】
image rotate

【図2】
image rotate

【図3A】
image rotate

【図3B】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate


【公開番号】特開2009−146404(P2009−146404A)
【公開日】平成21年7月2日(2009.7.2)
【国際特許分類】
【外国語出願】
【出願番号】特願2008−306971(P2008−306971)
【出願日】平成20年12月2日(2008.12.2)
【出願人】(507345538)アイティーアイ スコットランド リミテッド (34)
【Fターム(参考)】