【文献】
クライアント管理実用テクニック大全集:Part2 応用編 Windows Installerによるアプリケーション管理,Windows2000 World,日本,株式会社アイ・ディ・ジー・ジャパン,2001年12月 1日,第6巻,第12号(通巻67号),p.122−129
(58)【調査した分野】(Int.Cl.,DB名)
前記アプリケーションの実行中に前記ネイティブイメージをロードするステップをさらに含み、前記ネイティブイメージを前記ロードすることが共通言語ランタイムによって実行される、請求項1に記載の方法。
前記所与の疑似命令が、フィールドを識別するトークンを含み、前記ネイティブ言語命令が、実行されたときに前記フィールドを参照するための前記数値フィールドオフセットを含む、請求項6に記載の方法。
【発明を実施するための形態】
【0008】
[017] 本開示は、中間言語のコードからネイティブコードを生成することを通じて、マネージドアプリケーションをインストール、実行、および/または更新するためのツールおよび技術のさまざまな代表的な実施形態を提示する。たとえば、コンピューティングデバイスが、アプリケーション用にオンラインプロバイダによって生成されたMDILコードを受信する。コンピューティングデバイスは、アプリケーション用のネイティブイメージを生成することによって、アプリケーションをインストールする。ネイティブイメージの生成の一環として、コンピューティングデバイスは、MDILコードの一部分をコンピューティングデバイス上の1つまたは複数のライブラリとバインドする。コンピューティングデバイスは、ネイティブイメージを、実行用にアプリケーションをロードする際に使用するために格納する。この方法においては、アプリケーションのパフォーマンスは、(デバイスにとって適切なMDILコードを生成するための)アプリケーションの少なくとも一部の以前のオフラインコンパイルから恩恵を享受することができる。同時に、このアプローチは、アプリケーションによって使用されるライブラリおよび/またはアプリケーション用のMDILコードに変化がある場合のアプリケーションの更新を容易にすることができる。
【0009】
[018] 本明細書において記載されている技術およびツールのさまざまな特徴は、実施態様に応じて、組み合わせて、または個別に使用することができる。本明細書において記載されている技術およびツールのさまざまな特徴は、インジェスチョン、インストレーション、実行、アプリケーション更新、およびデバイス更新を含む処理のさまざまなステージに影響を与える。インジェスチョンという用語は、一般には、開発者がアプリケーションをオンラインプロバイダにアップロードするプロセスを指し、このプロセスは、そのアプリケーションを1つまたは複数のタイプのコンピューティングデバイス上での効率的な実行のために処理し、そのアプリケーションを検証し、そのアプリケーションをダウンロード用に利用可能にする。インストレーションという用語は、一般には、アプリケーションを、特定のコンピューティングデバイス上で動作するように適合させるプロセスを指し、このプロセスは、アプリケーションを、デバイス上での迅速でセキュアな実行にさらに適した形態に変換する(たとえば、ライブラリおよびその他のリソースへの参照を解決することによって、バインディング中にMDILコードをネイティブ命令に変換し、実行のためにロードすることができるネイティブイメージを格納し、アプリケーションを、信頼されているものとしてマークを付ける、といった具合である)。実行中に、アプリケーション用の信頼されているネイティブイメージを迅速にロードして実行することができる。アプリケーション更新という用語は、一般には、アプリケーションが更新されるプロセス(たとえば、アプリケーション用のMDILコード)を指し、このプロセスは、デバイス上でのアプリケーションの再インストレーションを含むことができる。コンピューティングデバイス更新という用語は、一般には、アプリケーションによって参照されるランタイムエンジン、ライブラリ、またはその他のリソースが更新された後に続くプロセスを指し、このプロセスは、典型的には、変化したライブラリまたはその他のリソースに依存するアプリケーションを再バインドすることを含む。
【0010】
MDILのコードからネイティブコードを生成することによってアプリケーションをインストールおよびロードするための例示的なシステム
[019]
図1は、例示的なオンラインプロバイダ/マーケットプレイスと、MDILコード120をバインドすることによってインストールされるアプリケーションのネイティブイメージ110をロードする例示的なコンピューティングデバイス100とを示す図である。
図1においては、アプリケーション用の仮コード130が、オンラインプロバイダ140によって受信される。たとえば、仮コード130は、ソースコード、またはMicrosoft中間言語(MSIL)などの中間言語のコードであるアプリケーション用のコードであることが可能である。135において、その仮コードは、コンパイラ150に提供され、コンパイラ150は、その仮コード130をアプリケーション用のMDILコード120へとコンパイルする。仮コード130は、アプリケーション用のコードの、MDILコード120よりも高いレベルの表現であることが可能である。たとえば、仮コード130は、マシンコードにさらに近いレベルであるMDILコード120よりも高いレベルである中間言語(IL)である。MDILコード120は、そのMDILコード120が、プロセッサ命令セットに基づくネイティブコードを含むようにマシン依存であることが可能である。プロセッサ命令セットは、ARMプロセッサ、x86プロセッサ、またはその他のプロセッサのための命令セットであることが可能である。MDILコード120は、バインディングを通じてネイティブコードを生成するために解決することができる、シンボリックリファレンスを伴う解決されていない疑似命令を含むこともできる。
【0011】
[020] アプリケーション用のMDILコード120が、コンピューティングデバイス100において受信される。アプリケーションのインストレーションの一環として、MDILコード120がバインダ160に提供され、バインダ160は、MDILコード120をデバイス上で1つまたは複数のライブラリ170にバインドする。1つまたは複数のライブラリ170は、クラス、タイプなどのためのコードライブラリおよび/またはフレームワークライブラリであることが可能である。コンピューティングデバイス100上でMDILコード120をバインドすることによって、バインダ160は、アプリケーションのネイティブイメージ110を生成する。ネイティブイメージ110は、アプリケーション用のネイティブコードを含み、デバイスに格納される。180において、ネイティブイメージは、アプリケーションを実行するためにロードされる。
【0012】
コンピューティングデバイス上にアプリケーションをインストールするためにMDILコードをバインドするための例示的な方法
[021]
図2は、コンピューティングデバイス上にアプリケーションをインストールするためにアプリケーションのMDILコードをバインドする例示的な方法200の流れ図である。さまざまな実施態様においては、
図2の示されている方法ブロックは、マージすること、サブブロックへと分割すること、または省略することが可能である。
【0013】
[022]
図2においては、コンピューティングデバイスが、210においてオンラインプロバイダからアプリケーション用のMDILコードを受信する。たとえば、コンピューティングデバイスは、アプリケーション用のコードを含む1つまたは複数のファイルを受信することができ、そのコードは、米国特許出願公開第2011/0258615号明細書において記載されているようなマシン依存中間言語の、または別のマシン依存中間言語のコードなどのマシン依存であるILである。MDILコードは、オンラインプロバイダからコンピューティングデバイスにおいて受信されるため、MDILコードは、オンラインプロバイダまたはクラウド内のほかのどこかによるコンパイルから生成することができる。たとえば、オンラインプロバイダは、アプリケーション用のMDILコードを生成するためにアプリケーション用の仮コードをコンパイルする。
【0014】
[023] いくつかの実施態様においては、アプリケーション用のインストレーションパッケージが受信され、そのインストレーションパッケージは、アプリケーション用のMDILコードを含む。アプリケーション用のインストレーションパッケージは、アプリケーション用のリソースファイルなど、アプリケーション用のその他の情報を含むことができる。アプリケーション用のMDILコードは、アプリケーションのインストレーションのために、およびアプリケーションのその後の更新のためにコンピューティングデバイス上に格納することができる。
【0015】
[024] 220において、アプリケーションは、アプリケーションのMDILコードをバインドすることを含む、アプリケーションのネイティブイメージを生成することによって、コンピューティングデバイス上にインストールされる。たとえば、バインダは、実行可能であるアプリケーション用のネイティブイメージを生成するためにコンピューティングデバイス上で利用可能な1つまたは複数のライブラリにMDILコードをバインドすることができる。アプリケーションは、.NETフレームワークの共通言語ランタイムなどのランタイムもしくは実行エンジン、またはその他のランタイムエンジンを使用して実行されるマネージドアプリケーションであることが可能である。ランタイムエンジンおよび/または実行エンジンは、アプリケーションが最終的に動作するソフトウェアレイヤであることが可能である。いくつかの実施態様においては、マネージドアプリケーションは、1つまたは複数の共有ライブラリと、1つまたは複数のマネージドコードランタイム環境とを含むフレームワークを使用して実行するアプリケーションである。たとえば、ライブラリは、アプリケーションどうしの間において共有されるベースクラスライブラリである。いくつかの実施態様においては、コンピューティングデバイス上のライブラリは、ネイティブコードおよび/またはマシンコードであるライブラリのイメージであることが可能であり、それは、マネージドアプリケーションによる使用のためにメモリ内にロードすることができ、そのマネージドアプリケーションもまた、メモリ内にロードされる。いくつかの実施態様においては、生成されるネイティブイメージは、そのネイティブイメージが、コンピューティングデバイス上でアプリケーションを実行するために使用されるランタイムエンジンまたは実行エンジンによって実行可能であるように、バインダによって生成することができる。たとえば、バインダは、バインディング中に、アプリケーション用のランタイムエンジンを使用した実行にとってそのバインディングが適切であるように、そのランタイムエンジンを使用および/または参照することができる。
【0016】
[025] いくつかの実施態様においては、バインダのバインディングは、MDILコードを解決し、アプリケーション用のネイティブイメージ内に含まれるアプリケーション用のネイティブコードを生成する。そのネイティブコードは、特定のプロセッサ上で実行可能である、かつプロセッサ命令セットからの命令を使用するマシンコードであることが可能である。プロセッサ命令セットは、ARMプロセッサ、x86プロセッサ、またはその他のプロセッサのための命令セットであることが可能である。いくつかの実施態様においては、アプリケーション用に受信されるファイルのセット内のそれぞれのMDILファイルに関してネイティブイメージを生成する際に、それぞれのMDILファイルと、そのファイルのMDILコードにバインドされることになる1つまたは複数のライブラリとが、バインダに提供される。たとえば、MDILファイルおよび/またはライブラリファイルへの1つまたは複数のファイルパスをバインダに提供することができる。バインダは、そのバインダに提供されたライブラリにそれぞれのMDILファイルをバインドして、アプリケーション用のネイティブイメージを生成する。そのネイティブイメージは、コンピューティングデバイスのプロセッサによって実行可能なマシンコードなどのネイティブコードを含むことができる(ネイティブイメージに加えて、アプリケーション用の少なくともいくつかのコードは、アプリケーションが起動される前の、またはアプリケーションが起動されるときのジャストインタイムコンパイルまたはその他のコンパイルのためにIL形式で保持することができる。これは、リソースが頻繁に変わる場合に、または、アプリケーションがインストールされて残っているMDILコードがデバイス上のライブラリにバインドされているときにタイプ値またはその他の参照を解決することができない場合に、役に立つことがある)。
【0017】
[026] いくつかの実施態様においては、アプリケーションは、パッケージマネージャによってデバイス上にインストールすることができる。たとえば、アプリケーションのインストレーション中に、アプリケーション用の受信されたインストレーションパッケージをパッケージマネージャによってアンパックすることができる。インストレーションパッケージ、および/または、そのインストレーションパッケージ内に含まれているファイルのうちの1つもしくは複数が圧縮されている場合には、パッケージマネージャは、そのようなファイルを解凍することができる。1つまたは複数のファイルが圧縮されていない場合には、パッケージマネージャは、そのようなファイルを解凍しない。パッケージマネージャは、バインドされることになるMDILファイルのうちのそれぞれを、それらのそれぞれのMDILファイルにバインドされることになるライブラリとともにバインダに提供することができる。いくつかの実施態様においては、パッケージマネージャは、MDILファイルおよび/または1つもしくは複数のライブラリへの参照をバインダに提供することによって、それらのMDILファイルおよび/または1つもしくは複数のライブラリを提供する。バインダは、それぞれのMDILファイルを、それらのそれぞれのMDILファイル用の提供されたライブラリにバインドして、アプリケーション用のネイティブイメージを生成する。そのネイティブイメージは、そのネイティブイメージが、アプリケーションを実行するためのコンピューティングデバイス上で利用可能なランタイムエンジンを使用して実行可能であるように、バインダによって生成することができる。
【0018】
[027] 230において、アプリケーションのネイティブイメージは、実行用にアプリケーションをロードする際に使用するためにコンピューティングデバイス上に格納される。たとえば、生成されたネイティブイメージは、アプリケーションを実行するためにロードされる(実行可能ではないMDILコードは、アプリケーションを実行するために使用されない)。いくつかの実施態様においては、ネイティブイメージは、実行用にロードされる前に、信頼されているものと判定される。その他の実施態様においては、コンピューティングデバイスは、ネイティブイメージが実行用にロードされる前に、そのネイティブイメージが信頼されているかどうかに関する判定をまったく行わない。
【0019】
アプリケーションのインストレーションおよび実行のために提供されたMDILコードからネイティブコードを生成するための例示的なシステム
[028]
図3は、例示的なオンラインプロバイダ/マーケットプレイスと、そのオンラインプロバイダ(またはその他のオンラインプロバイダ)によって提供および生成されるMDILなどの中間言語のコードから1つまたは複数のネイティブイメージを生成することによって1つまたは複数のマネージドアプリケーションをインストールすることができる例示的なコンピューティングデバイス350とを示す図である。
図3においては、オンラインプロバイダ305が、コンパイラ310を使用して、仮コード315を1つまたは複数のMDILファイル320へとコンパイルする。MDILファイル320は、MDILのコードを含むファイルである。1つまたは複数のMDILファイル320のセットは、アプリケーション用のインストレーションパッケージ325内にパッケージされる。MDILファイルのうちのそれぞれには、330において示されているように、信頼されているものとしてサインすることができる。リソースファイルまたはアプリケーションコンテンツなどのサポート情報を含む1つまたは複数のファイル335をインストレーションパッケージ325内に含めることができる。インストレーションパッケージ325は、340において示されているように、オンラインプロバイダ305によって格納され、ダウンロード用に提供される。インストレーションパッケージ325がオンラインプロバイダ305からダウンロードされる前に、345において示されているように、インストレーションパッケージ325そのものに、信頼されているものとしてサインすることができる。
【0020】
[029] したがって、インストレーションパッケージ325は、オンラインマーケットプレイスにおいてアプリケーションのカタログの一部として提供される。さまざまなタイプのコンピューティングデバイスのために、さまざまなバージョンのインストレーションパッケージ325を提供することができる。たとえば、(さまざまなタイプのプロセッサに適合された)さまざまなタイプのMDILコードが、さまざまなタイプのコンピューティングデバイスのためのさまざまなインストレーションパッケージ内に含まれる。さまざまなタイプのコンピューティングデバイスにとって利用可能なインストレーションパッケージは、下位互換性の目的で、MDILではないコード(たとえば、XAPファイルにおけるMSILコード)を伴うバージョンを含むこともできる。
【0021】
[030] コンピューティングデバイス350は、355において、インストレーションパッケージ325を含む1つまたは複数のインストレーションパッケージをオンラインプロバイダからダウンロードする。アプリケーションをインストールする一環として、コンピューティングデバイス350のパッケージマネージャ360は、1つまたは複数のMDILファイル320と、アプリケーション用のサポート情報を含む1つまたは複数のファイル335とをアンパックする。パッケージマネージャはまた、バインダ365を呼び出す。1つまたは複数のMDILファイル320のセットのそれぞれのMDILファイルに関して、パッケージマネージャ360は、MDILファイル322などのそれぞれのMDILファイルを、1つまたは複数のライブラリ370など、それぞれのMDILファイルとバインドされることになる1つまたは複数のライブラリとともに、バインダ365に提供する。バインダ365は、それぞれのMDILファイルを、それらのそれぞれのMDILファイル用に提供された1つまたは複数のライブラリにバインドして、ネイティブコードを生成する。MDILファイル用に提供されたライブラリ(1つまたは複数のライブラリ370など)は、コンピューティングデバイス350上にあるライブラリ375のセット内に含まれる。1つまたは複数のMDILファイル320をバインドすることから生成されたネイティブコードを使用して、バインダは、アプリケーション用のネイティブイメージ380を生成する。ネイティブイメージ380は、そのネイティブイメージ380が、アプリケーションを実行することができるコンピューティングデバイス上のランタイムエンジンを使用して実行可能であるように、バインダ365によって生成することができる。ネイティブイメージ380は、385において示されているように、デバイス上にアプリケーションをインストールすることの一環として格納される。コンピューティングデバイス350は、1つまたは複数のその他のアプリケーションをインストールして、それぞれのその他のアプリケーションに対応する生成されたネイティブイメージを格納することもできる。
【0022】
[031] 390において示されているように、ネイティブイメージ380には、信頼されているコードからバインダ365によって生成された信頼されているコードとしてサインすることができる。ネイティブイメージ380が格納される前に、および/またはアプリケーションを実行する際に使用するためにロードされる前に、ネイティブイメージ380にサインすることができる。395において、ネイティブイメージ380は、アプリケーションを実行するためにロードされる。ロードされると、ネイティブイメージのネイティブコードは、アプリケーションの機能を提供するためにコンピューティングデバイス305によって実行される。
【0023】
MDILのコードを使用したネイティブコード生成を通じてアプリケーションをインストールおよび更新するための例示的な方法
[032]
図4は、MDILのコードを使用したネイティブコード生成を通じてアプリケーションをインストールおよび更新するための例示的な方法400の流れ図である。
図4においては、410において示されているように、MDILコードを含むインストレーションパッケージが生成される。いくつかの実施態様においては、MDILコードを1つまたは複数のファイル内に含めることができる。いくつかの実施態様においては、仮コードをコンパイルして、MDILコードを生成することができる。
【0024】
[033] いくつかの実施態様においては、アプリケーション用のMDILコードは、プロセッサ命令セットに基づくネイティブコードを含むが、疑似命令を含むこともできる。たとえば、疑似命令は、MDILが生成されるときに解決することができないシンボリックリファレンスおよび/またはフィールドキーを含む。したがって、いくつかの実施態様においては、疑似命令は、フィールド、タイプなどへのシンボリックリファレンスを含むことができる。たとえば、シンボリックリファレンスは、フィールドのオフセットまたはタイプのサイズを特に示すことなく使用されるフィールドまたはタイプを識別するトークンであることが可能である。いくつかの実施態様においては、シンボリックリファレンスは、そのシンボリックリファレンスのために生成されるネイティブコードを特定するためにバインダによって解釈することができるトークンであることが可能である。たとえば、オブジェクトのフィールドを参照するフィールドトークンなどのトークンに関しては、特定のコンピューティングデバイス上のバインダは、そのコンピューティングデバイスのための実行可能な命令を生成する際に、(1)オブジェクトを、そのオブジェクトがライブラリを通じてそのコンピューティングデバイス上で利用可能であるようにレイアウトし、(2)そのオブジェクトのそのフィールドに関する適切なオフセットを特定することができる。したがって、いくつかの実施態様においては、MDILコード内のオブジェクトに関するフィールドオフセットは、(対応するネイティブコード内のなど)数値オフセットとしてハードコーディングされる代わりに、シンボリックであることが可能である。
【0025】
[034] 疑似命令は、その疑似命令がコンピューティングデバイス上の適切なライブラリにバインドされるときに特定および/または解決されることになる実施の詳細を抽象化することができる。いくつかの実施態様においては、MDILコードは、プロセッサによって実行可能であるネイティブ命令を生成するためにバインダによって変換することができるシンボリックリファレンスを含む疑似命令を含む。たとえば、MDILコードは、.NETフレームワークの共通言語ランタイム(CLR)などのランタイムエンジンなどによって管理されるオブジェクトのフィールドにアクセスするための機械命令へとバインダによって変換することができる疑似命令を含むことができる。いくつかの実施態様においては、レジスタが既に割り当てられているが、オフセットが1つまたは複数のライブラリおよび/またはクラスに関して含まれていないようになり、MDILコードの疑似命令は、ネイティブ言語のマシンコードに類似し得る。たとえば、疑似命令から変換されたものとしてネイティブ命令内に含まれるフィールドオフセットは、バインダによって特定することができ、利用可能なライブラリのバージョンに、および/またはコンピューティングデバイスに依存することが可能である。いくつかの実施態様においては、MDILコードは、ジェネリックタイプまたはジェネリックメソッドのインスタンス化またはインスタンスをルックアップするための機械命令へとバインダによって変換することができる疑似命令を含むことができる。
【0026】
[035]
図4を参照すると、420において、コンピューティングデバイスが、アプリケーション用のMDILコードを受信する。たとえば、コンピューティングデバイスは、アプリケーション用のMDILコードを含むMDILファイルを含むアプリケーション用のインストレーションパッケージを受信することができる。いくつかの実施態様においては、インストレーションパッケージは、アプリケーション用のネイティブイメージを生成するためにバインドされることになるアプリケーションのMDILファイルのリストと、それぞれのMDILファイルにバインドされることになる1つまたは複数のライブラリのセットのリストとを含むバインディングリストを含むことができる。いくつかの実施態様においては、アプリケーションのMDILコードにバインドされることになるライブラリのうちの1つまたは複数は、そのアプリケーションのソースコードにおいて宣言されているおよび/または含まれているライブラリである。アプリケーションのMDILコードにバインドされることになる1つまたは複数のその他のライブラリは、そのアプリケーションのソースコードにおいて宣言されていないおよび/または含まれていないライブラリであることが可能である。
【0027】
[036] 430において、アプリケーションは、そのアプリケーション用のネイティブイメージを生成することによって、コンピューティングデバイス上にインストールされる。いくつかの実施態様においては、アプリケーションは、パッケージマネージャによってインストールすることができる。たとえば、パッケージマネージャは、コンピューティングデバイス上にアプリケーションをインストールするためにインストレーションパッケージのファイルを使用する前に、そのインストレーションパッケージが信頼されているものとしてサインされていることを判定することができ、インストレーションパッケージが信頼されているものとしてサインされていない場合には、パッケージマネージャは、コンピューティングデバイス上にアプリケーションをインストールするためにそのインストレーションパッケージを使用しない。パッケージマネージャは、バインドされることになるMDILファイルのうちのそれぞれを、それらのそれぞれのMDILファイルにバインドされることになるライブラリとともにバインダに提供することができる。いくつかの実施態様においては、インストレーションパッケージ全体が信頼されているものとしてサインされているかどうかを判定することの代わりに、またはそれに加えて、MDILファイルは、アプリケーション用のネイティブイメージを生成するために使用される前に信頼されているものとしてサインされていることを判定することが可能であり、信頼されているものとしてサインされていないと判定されるMDILファイルは、アプリケーション用のネイティブイメージを生成するために使用されない。いくつかの実施態様においては、パッケージマネージャは、バインドされることになるMDILファイル、およびアプリケーション用のそれぞれのMDILファイルのコードにバインドされることになるそれぞれのライブラリを自動的に特定および識別するためのバインディングリストを提供されて使用することができる。バインディングリストは、プログラミング言語、スクリプト言語、またはマークアップ言語などのマシン可読フォーマットであることが可能である。たとえば、バインディングリストは、拡張マークアップ言語(XML)を使用して編成されている情報を含むファイル内に含めることができる。
【0028】
[037] いくつかの実施態様においては、パッケージマネージャは、MDILファイルおよび/または1つもしくは複数のライブラリへの参照をバインダに提供することによって、それらのMDILファイルおよび/または1つもしくは複数のライブラリを提供する。バインダは、それぞれのMDILファイルを、それらのそれぞれのMDILファイル用の提供されたライブラリにバインドして、アプリケーション用のネイティブイメージを生成する。高いレベルでは、バインダは、MDIL命令内を読み進み、IL命令をネイティブ命令に変換し、既にネイティブ形式である命令を通り過ぎる。たとえば、バインダは、MDILコードをコンピューティングデバイス上の1つまたは複数のライブラリにバインドして、実行可能であるアプリケーション用のネイティブイメージを生成することができる。ネイティブイメージは、そのネイティブイメージが、アプリケーションを実行するためのものである、バインダにとって利用可能である、コンピューティングデバイス上のランタイムエンジンを使用して実行可能であるように、バインダによって生成することができる。ランタイムエンジンは、コンピューティングデバイス上でアプリケーションを最終的に実行することができるソフトウェアレイヤであることが可能である。いくつかの実施態様においては、バインダは、スクリプトからの情報、ユーザ入力、および/またはその他の情報を使用して実行することができる。コードをバインドすることのいくつかの実施態様においては、MDILコードは、バインダに提供される。バインダは、疑似命令を解決して、対応するネイティブ命令を生成する。たとえば、疑似命令内のシンボリックリファレンス(たとえば、フィールドトークン)から、バインダは、タイプレイアウトに基づいてフィールドに関する数値オフセットを特定して指定することによって、ネイティブコードを生成することができる。いくつかの実施態様においては、MDIL疑似命令は、疑似命令とは長さが異なることが可能であるネイティブ命令を作成するために使用することができる。あるいは、ネイティブ命令は、疑似命令とは長さが異ならないことが可能である。いくつかの実施態様においては、アプリケーション用のMDILコードの少なくともいくらかは、そのアプリケーションのネイティブイメージ内に含まれているマシンコードに近いことが可能であるが、MDILコードその他の部分は、MDILコードの一部分が、1つまたは複数のバージョンで利用できることが可能であるライブラリにバインドされることを可能にするあるレベルの抽象化を提供することができる。バインディングを通じて、MDILコードは、ライブラリの特定のバージョンを使用して実行する実行可能コードを生成するために使用することができる。たとえば、MDILコードをライブラリの第1のセットにバインドすることにより、アプリケーション用の実行可能コードを生成することができる。または、MDILコードをライブラリのうちの1つまたは複数が別のバージョンのものであるセットライブラリにバインドすることによっても、アプリケーション用の実行可能コードを生成することができる。それらの1つまたは複数のライブラリのバージョンのセットは、ライブラリの重複するバージョンを有することができる。
【0029】
[038] いくつかの実施態様においては、MDILコードをバインドすることは、さらなるコンパイルを伴わずにプロセッサによって直接実行することができるコードを生成する。たとえば、MDILコードをライブラリにバインドすることは、MDILコードの命令からネイティブ命令を生成することを含む。いくつかの実施態様においては、MDILコードは、プロセッサによって実行可能であるネイティブ命令を生成するためにバインダによって変換および/またはバインドされるシンボリックリファレンスを含む疑似命令を含む。たとえば、バインダは、疑似命令を、コンピューティングデバイス上のランタイムエンジンによって管理することができるオブジェクトのフィールドにアクセスするためのネイティブコード命令へと変換することができる。いくつかの実施態様においては、レジスタが割り当てられているが、MDILコードにおいては、オフセットが1つまたは複数のライブラリおよび/またはクラスに関して含まれていないようになり、MDILコードの一部分は、生成されたネイティブコードに類似し得る。いくつかの実施態様においては、バインダは、疑似命令を、ジェネリックタイプまたはジェネリックメソッドのインスタンス化またはインスタンスをルックアップするためのネイティブコード命令へと変換することができる。
【0030】
[039] いくつかの実施態様においては、MDILコードシンボリック命令および生成された対応するネイティブ命令は、仮想メソッドスロット割り当ておよび/またはオブジェクトフィールドレイアウトに関して整合している。たとえば、MDILコードおよび実行可能なネイティブコードは、オブジェクトフィールドレイアウトに関して整合していることが可能であり、それによって、フィールドトークンを含むオブジェクトにアクセスするためのMDILコードの一部分を使用して、数値フィールドオフセットを用いてネイティブ命令(たとえば、機械命令)を生成することができる。いくつかの実施態様においては、バインダは、1つまたは複数の実行可能な機械命令を生成するためにシンボリックリファレンスから数値オフセットを生成することができる。たとえば、MDILコード内のシンボリックリファレンスは、バインダによって特定のフィールドリファレンスへと変換され、それによって、その特定のフィールドリファレンスは、数値サイズおよび/またはオフセットを含む。
【0031】
[040] MDILコードをバインドすることのいくつかの実施態様においては、バインダは、シンボリックリファレンスを解釈することができ、そのシンボリックリファレンスは、そのシンボリックリファレンスのために生成されるネイティブコードを特定するためのトークンを含む。たとえば、オブジェクトのフィールドを参照するフィールドトークンに関しては、バインダは、コンピューティングデバイスのための実行可能な命令を生成するために、オブジェクトを、そのオブジェクトがコンピューティングデバイス上で利用可能であることが可能であるようにレイアウトし、そのオブジェクトのそのフィールドに関する適切なオフセットを特定することができる。MDILコードをバインドすることのいくつかの実施態様においては、MDILコードをバインドすることができるバインダは、リンカーよりも複雑である。たとえば、MDILコードをバインドする際には、バインダは、結果として生じるネイティブコード内の1つまたは複数のジャンプを、それらのジャンプがそれらの意図されているターゲットに達するように調整することができる。
【0032】
[041] ネイティブイメージ内のネイティブコードに加えて、アプリケーション用の少なくともいくつかのコードをIL形式で保持することができる。IL形式のコードは、アプリケーションが起動される前の、またはアプリケーションが起動されるときのジャストインタイムコンパイルまたはその他のコンパイル中にさらに処理される。これは、ランタイムエンジン、ライブラリ、またはその他のリソースが頻繁に変わる場合に、役に立つことがある。または、これは、残っているMDILコードがコンピューティングデバイス上のライブラリにバインドされているバインディングプロセス中にタイプ値または参照を解決することができない場合に、役に立つことがある。
【0033】
[042] 440において、ネイティブイメージは、実行用にアプリケーションをロードする際に使用するために格納される。たとえば、ユーザがコンピューティングデバイス上でアプリケーションを起動したときに、そのアプリケーションのネイティブイメージが、.NETフレームワークのCLRなどの実行エンジンもしくはランタイムまたはその他のランタイムエンジンによってロードされる。いくつかの実施態様においては、コンピューティングデバイスは、アプリケーションを実行するためにジャストインタイムのコンパイルを使用してコンピューティングデバイス上でコンパイルすることができるアプリケーション用のMSILコードを含むことができるが、そのMSILコードを使用してアプリケーションを実行する代わりに、アプリケーション用のネイティブイメージがロードされて、アプリケーションを稼働させるために実行される。いくつかの実施態様においては、ネイティブイメージがロードされるときに、アプリケーションのコードによって使用される1つまたは複数のライブラリイメージまたはアセンブリが、そのネイティブイメージ内に含まれているものとしてロードされる。たとえば、ネイティブイメージは、コンピューティングデバイスのランタイムエンジンを使用して実行用にロードすることができる。アプリケーションに関するネイティブイメージは、格納される前に、そのアプリケーションが信頼されているということを示すためにバインダによってサインされ得る。
【0034】
[043] 450において、コンピューティングデバイスは、少なくともそのコンピューティングデバイス上のライブラリのセットを更新することによって、更新される。たとえば、コンピューティングデバイスのライブラリのセット内のライブラリのうちの1つまたは複数を更新、置換、または変更することができる。これは、ライブラリのセットの以前のバージョンにバインドされていたアプリケーションのオペレーションを妨げることがある。したがって、1つまたは複数のライブラリが更新、置換、または変更された後に、コンピューティングデバイス上のアプリケーションのうちの1つまたは複数を更新することができ、それによって、それぞれのアプリケーション用の更新されたネイティブイメージを生成することができる。アプリケーション用の更新されたネイティブイメージは、アプリケーション用のMDILコード(インストレーションの後でさえ、コンピューティングデバイス上にMDIL形式で格納されている)を、更新された1つまたは複数のライブラリのセットのうちの少なくとも1つにバインドすることによって、生成することができる。コンピューティングデバイス上のライブラリが更新された後にアプリケーション用のMDILコードをそれらのライブラリのうちの1つまたは複数に再バインドすることは、ネイティブイメージが、それらの1つまたは複数のライブラリを、コンピューティングデバイスを更新した後および/またはそのデバイスのライブラリを更新した後にそのデバイス上で利用可能なものとして適切に参照することを可能にすることができる。同時に、アプリケーション用のコードの完全な再コンパイルは、ライブラリが変わるたびに必要とされない。なぜなら、アプリケーション用のMDILコードは、再利用することができるためである。変更されたライブラリが、デバイス上のアプリケーションのうちの多くによって使用される場合には、それぞれのアプリケーション用の以前に格納されたMDILコードを使用して再バインドすることは、それぞれのアプリケーション用のネイティブイメージを更新するプロセスを大幅に簡略化することができる。
【0035】
[044] たとえば、7つのアプリケーションがそれぞれ、変更されたライブラリに対する依存性を有していると考えてみる。7つのアプリケーションのそれぞれに関して、(たとえば、オンラインプロバイダによる)クラウド内のオフラインコンパイルは、ジャストインタイムコンパイルまたは更新する目的でのデバイス上でのコンパイルよりも精緻なおよび/または時間のかかるコンパイルを使用して、そのアプリケーション用の効率的なMDILコードを生成することができる。時間がかかることになり、効率の悪いネイティブイメージにつながる可能性がある、ライブラリが変わった場合に7つのアプリケーションのそれぞれを再コンパイルするのではなく、それぞれのアプリケーションを、コンピューティングデバイス上のライブラリに再バインドする。これは、コンパイル最適化に関する「重労働」が、クラウドですでに行われているので、はるかに速い。
【0036】
[045] いくつかの実施態様においては、コンピューティングデバイスの更新は、その更新が、コンピューティングデバイスのランタイムエンジンを更新することを含むように行われる。たとえば、1つまたは複数のインストールされたアプリケーションを、それらのアプリケーション用のネイティブイメージを使用して実行する、コンピューティングデバイスのランタイムエンジンを更新、置換、または変更することができる。ランタイムエンジンは、更新されたアプリケーションを最終的に実行するソフトウェアレイヤであることが可能であり、したがって、ランタイムエンジンが変更された場合には、更新されたアプリケーション用の更新されたネイティブイメージを、バインダによって、そのバインダにとっておよびコンピューティングデバイス上で利用可能であるものとして更新されたランタイムエンジンを使用して実行可能であるように生成することができる。いくつかの実施態様においては、コンピューティングデバイスのランタイムエンジンおよびライブラリの両方が、デバイス更新時に変更され、また、アプリケーションを更新することができ、それによって、そのアプリケーションは、更新されたランタイムエンジンおよび更新されたライブラリとともに適切に実行および/または稼働することができる。
【0037】
ダウンロード用に提供することができるアプリケーション用のインストレーションパッケージを生成するための例示的な方法
[046]
図5は、ダウンロード用に提供することができるアプリケーション用のインストレーションパッケージを生成する例示的な方法500である。さまざまな実施態様においては、
図5の示されている方法ブロックは、マージすること、サブブロックへと分割すること、または省略することが可能である。
図5においては、アプリケーション用の仮コードが受信される。たとえば、アプリケーションの開発者は、そのアプリケーション用のコードを仮の言語および/または状態で送信することができ、そのアプリケーション用の仮コードを、オンラインマーケットプレイスなどのオンラインプロバイダによって受信することができる。いくつかの実施態様においては、アプリケーション用の仮コードは、アプリケーション用のソースコードである。たとえば、ソースコードは、C++、C♯、Visual Basic(登録商標)、J♯、J++、またはその他の類似のプログラミング言語などの1つまたは複数のプログラミング言語で書かれたコードであることが可能である。いくつかの実施態様においては、アプリケーション用の仮コードは、ILなどの中間表現である。たとえば、アプリケーション用のソースコードは、コンパイラおよび/またはジェネレータによってILの中間表現へとコンパイルすることができる。いくつかの実施態様においては、ILは、Microsoft中間言語(MSIL)であることが可能である。いくつかの実施態様においては、ILは、マシン依存であるネイティブ命令を含まない。しかしながら、ILのコードは、マシン依存であるネイティブ命令を含むMDILのコードへとコンパイルすることができる。
【0038】
[047] いくつかの実施態様においては、アプリケーションに関して、ならびにアプリケーション用の仮コードに関して、その他の情報が受信される。たとえば、アプリケーションが実行されるときにアプリケーションによって使用されるアプリケーション用のリソースファイルを受信することができる。アプリケーション用のリソースファイルは、音声情報、音楽情報、グラフィックス情報、ビデオ情報、その他のメディア情報、データベース情報、テキスト情報などを含む1つまたは複数のファイルであることが可能である。いくつかの実施態様においては、仮コードは、ZIPファイルまたはXAPファイルなどの1つまたは複数の圧縮されたファイル内に含めてパッケージおよび/または受信することができる。あるいは、仮コードは、1つまたは複数の圧縮されたファイル内に含めてパッケージおよび/または受信されない。いくつかの実施態様においては、アプリケーション用のMDILコードを伴う1つまたは複数のファイルがオンラインプロバイダによって受信されるが、開発者から受信されたMDILファイルは、オンラインプロバイダによって生成されなかった信頼されていないファイルとして破棄することができる。あるいは、オンラインプロバイダは、そのオンラインプロバイダによって受信されたいかなるMDILファイルも破棄しない。いくつかの実施態様においては、仮コードは、1つまたは複数のアセンブリ内に含めて受信することができる。たとえば、仮コード(アセンブリ内に含まれているMSILのコードなど)は、バイナリレベルでのコードへとコンパイルすることができる。MSILコードを含むアセンブリは、MSILアセンブリであることが可能である。いくつかの実施態様においては、MSILアセンブリは、1つまたは複数のファイルを含むことができる。
【0039】
[048] 520において、アプリケーションの仮コードをコンパイルして、マシン依存である中間言語であるコードであるMDILコードを生成する。一般的なルールとして、ILファイル内の決定または参照は、コンパイルプロセス中に解決されるが、ライブラリ、外部ソース、外部タイプなどへの決定または参照は、解決されないままである。したがってMDILファイルは、(a)アセンブリ命令、ネイティブコード、またはその他のデバイス依存命令と、(b)後で解決されることになる疑似コード命令またはその他のデバイス独立命令との混合物である。したがって、仮コードからコンパイルされるMDILコードは、仮コードの言語よりも低いレベルの言語である中間言語であることが可能である。たとえば、仮コードは、より高いレベルの(マシンコードからさらに離れた)中間言語であり、MDILコードは、マシンコードにさらに近いより低いレベルである。たとえそうでも、MDILコードは、典型的には、バインドせずに直接実行することはできない。なぜなら、MDILコードは、ネイティブコードではないシンボリックリファレンスを含むためである。その代わりに、MDILコードは、バインダによって、実行可能なマシンコードへと変換することができる。いくつかの実施態様においては、アプリケーション用の仮コードは、直接実行することはできないが、ジャストインタイムコンパイラによってコンパイルされたときに実行可能コードへとコンパイルすることができる。たとえば、MSILのアプリケーション用のコードは、MSILコードからアプリケーションを実行するためにジャストインタイムでコンパイルすることができる。いくつかの実施態様においては、MSILのアプリケーション用のコードは、アプリケーション用のMDILコードを生成するためにコンパイラに提供することができる。典型的には、MSILコードは、ネイティブ命令を含まず、アプリケーション用のネイティブコードを生成するためにバインダによって解決および/またはバインドされることになるMDILコード内に含まれる疑似命令も含まない。
【0040】
[049] MDILコードは、1つまたは複数のMDILファイル内に含めることができる。いくつかの実施態様においては、MDILファイルは、そのMDILファイルの名前および/またはファイル拡張子内に「.mdil」が含まれるように、名前および/またはファイル拡張子を有することができる。その他の実施態様においては、MDILファイルは、そのMDILファイルの名前および/またはファイル拡張子内に「.mdil」が含まれないような別の命名規則を有することができる。
【0041】
[050] いくつかの実施態様においては、疑似命令に加えて、仮コードがコンパイルされる場合には、コンパイラは、MDILコード用の1つまたは複数のアセンブリを生成する。たとえば、アセンブリ内に含まれているMDILコードは、バイナリレベルであるコードへとコンパイルすることができる。MDILコードを含むアセンブリは、MDILアセンブリであることが可能である。いくつかの実施態様においては、MDILアセンブリは、1つまたは複数のファイルを含むことができる。
【0042】
[051] (アプリケーションが実行されることになる)ターゲットコンピューティングデバイスにおいてアプリケーションコードが受信される前に仮コードをアプリケーション用のMDILコードへとコンパイルすることは、さまざまな利点を提供することができる。たとえば、ターゲットコンピューティングデバイス上にアプリケーションをインストールするのにかかる時間からコンパイル時間を取り除くことができる。ターゲットデバイス上へのアプリケーションのインストレーションからコンパイルを取り除くことにより、ターゲットデバイス上にアプリケーションをインストールするのにかかる時間にコンパイル時間を加えることなく、クラウド内で行われるコードのコンパイル時間を最適化できる。とりわけ、これは、ライブラリが変更された場合、および/またはランタイムエンジンが変更された場合は常に、ライブラリに依存する複数のアプリケーションに関するターゲットコンピューティングデバイス上での時間のかかる再コンパイルを回避する上で役立つことができる。
【0043】
[052] いくつかの実施態様においては、仮コードのコンパイルは、アプリケーション用のネイティブコードを含んでいてMDILコードを含んでいないアプリケーション用の1つまたは複数のネイティブコードファイルを生成することができる。
【0044】
[053] いくつかの実施態様においては、アプリケーション用に受信されたそれぞれのMSILアセンブリファイルに関して、対応するMDILファイルがコンパイラによって生成される。第1のプロセッサ用の(第1のタイプのターゲットコンピューティングデバイス用の)命令セットに依存するMDILコードを生成するために、仮コードをコンパイルすることができ、第2のプロセッサ用の(第2のタイプのターゲットコンピューティングデバイス用の)命令セットに依存する別のMDILコードを生成することができる。たとえば、アプリケーション用の仮コードをコンパイルすることは、第1のプロセッサを有するデバイス上で実行するためにバインドすることができるMDILコードを生成すること、および異なる第2のプロセッサを伴う別のデバイス上で実行するためにバインドすることができるそのアプリケーション用の異なるMDILコードを生成することが可能である。たとえば、第1のプロセッサは、ARMプロセッサであることが可能であり、第2のプロセッサは、x86プロセッサであることが可能である。
【0045】
[054] 530において、アプリケーションのMDILコードが、信頼されているものとしてサインされる。たとえば、仮コードから生成されたMDILコードファイルに、発行者キーを用いてサインして、それらのサインされているファイルが、信頼されているコードを含んでいるということを示すことができる。いくつかの実施態様においては、仮コードをコンパイルすることによって生成されたネイティブコードに、信頼されているものとしてサインすることができる。たとえば、コンパイラによって生成されるネイティブコードファイルに、発行者キーを用いてサインして、それらのサインされているファイルが、信頼されているコードを含んでいるということを示すことができる。
【0046】
[055] 540において、MDILコードを含むインストレーションパッケージが生成される。たとえば、MDILコードは、アプリケーションをインストールするためにダウンロードすることができる1つまたは複数のファイルなどのコンテナ内にパッケージすることができる。一実施態様においては、1つまたは複数のMDILコードファイル内のMDILコードは、ZIPファイルまたはXAPファイルなどの1つまたは複数の圧縮されたファイル内にパッケージされる。圧縮されたインストレーションパッケージは、オンラインプロバイダからアプリケーション用にダウンロードされることになるデータの量を低減することができる。あるいは、インストレーションパッケージは、圧縮された形式ではない。(さまざまなタイプのプロセッサに適合された)さまざまなタイプのMDILコードを、さまざまなタイプのコンピューティングデバイスのためのさまざまなインストレーションパッケージ内に含めることができる。さまざまなタイプのコンピューティングデバイスにとって利用可能なインストレーションパッケージは、下位互換性の目的で、MDILではないコード(たとえば、XAPファイルにおけるMSILコード)を伴うバージョンを含むこともできる。
【0047】
[056] いくつかの実施態様においては、インストレーションパッケージは、アプリケーション用のリソースファイルなど、アプリケーション用のその他の情報を含むことができる。たとえば、アプリケーションが実行されるときにアプリケーションによって使用することができるアプリケーション用のリソースファイルを受信することができる。アプリケーション用のリソースファイルは、音声情報、音楽情報、グラフィックス情報、ビデオ情報、その他のメディア情報、データベース情報、テキスト情報などを含む1つまたは複数のファイルであることが可能である。インストレーションパッケージは、そのインストレーションパッケージ内に含まれているファイルのリストを含むこともできる。ファイルのリストは、インストレーションパッケージ内に含まれているファイルに関する情報を含むことができる。たとえば、インストレーションパッケージは、拡張マークアップ言語(XML)を使用して編成されている情報を含むファイルを含むことができる。XMLファイルは、インストレーションパッケージ内に含まれているファイルのリストを含むことができる。リストアップされているファイルのうちのそれぞれに関して、XMLファイルは、そのリストアップされているファイルに関連付けられている情報を含むことができる。たとえば、XMLファイルは、インストレーションパッケージ内に含まれているMDILコードファイルのうちのそれぞれをリストアップし、それらのMDILコードファイルのうちのそれぞれはバインドすることが可能であるということを示すことができる。XMLファイルは、それぞれのリストアップされているMDILコードファイルのコードにバインドされることになる1つまたは複数のライブラリを示すこともできる。
【0048】
[057] いくつかの実施態様においては、生成されたインストレーションパッケージそのものが、信頼されているものとしてサインされる。たとえば、インストレーションパッケージに、発行者キーを用いてサインして、そのインストレーションパッケージが、信頼されているコードおよび/またはその他の情報を含んでいるということを示すことができる。いくつかの実施態様においては、インストレーションパッケージを暗号化することができる。
【0049】
[058] 550において、インストレーションパッケージが、ダウンロード用に提供される。たとえば、オンラインプロバイダ、および/またはオンラインプロバイダのパートナーは、ダウンロード用にインストレーションパッケージを格納することができる。オンラインプロバイダは、1つまたは複数のアプリケーションを1つまたは複数のコンピューティングデバイスへのインストレーション用にダウンロードすることができる元になるオンラインマーケットプレイスであることが可能である。アプリケーションは、オンラインマーケットプレイスからダウンロードするために利用可能であるアプリケーションのカタログ内に含めることができる。たとえば、アプリケーションは、インターネットおよび/またはクラウドを使用してコンピューティングデバイスによってダウンロードすることができる。アプリケーションを、そのアプリケーション用のインストレーションパッケージがダウンロードされるようにダウンロードすることができる。いくつかの実施態様においては、アプリケーションは、そのアプリケーションが購入されて、コンピューティングデバイスにダウンロードされることが承認された後に、コンピューティングデバイスにダウンロードすることができる。いくつかの実施態様においては、アプリケーションは、購入されることなくダウンロードすることが可能である。たとえば、アプリケーションは、無料で提供されてダウンロードすることが可能である。
【0050】
インストールされたアプリケーション用の更新されたネイティブイメージを生成するための例示的なシステム
[059]
図6は、1つまたは複数のインストールされたアプリケーション用の1つまたは複数の更新されたネイティブイメージ605を生成することができるコンピューティングデバイス600の図である。
図6においては、コンピューティングデバイスは、そのコンピューティングデバイス上の1つまたは複数のインストールされたアプリケーション用の1つまたは複数の生成されたネイティブイメージ610を含む。コンピューティングデバイス600は、更新されたライブラリ620を含み、更新されたライブラリ620は、1つまたは複数のネイティブイメージ610を生成するためにアプリケーションのそれぞれのMDILコードにバインドされた後に更新された、1つまたは複数のライブラリを含む。1つまたは複数のネイティブイメージ610にバインドされたライブラリのうちの少なくとも1つが更新されたため、コンピューティングデバイス600は、自分にインストールされたアプリケーションを、それらのインストールされたアプリケーション用の1つまたは複数の更新されたネイティブイメージ605を生成することによって更新する。コンピューティングデバイスはまた、更新されたランタイムエンジン670を含む。
【0051】
[060] インストールされたアプリケーション用の1つまたは複数の更新されたネイティブイメージ605を生成する際に、バインダ625は、1つまたは複数のインストールされたアプリケーションのそれぞれのための更新されたネイティブイメージを生成する。
図6において示されているように、変更および/または更新された少なくとも1つのライブラリにバインドされたネイティブイメージを有するそれぞれのインストールされたアプリケーション用に、パッケージマネージャ630は、更新されたネイティブイメージ635など、更新されているアプリケーション用の更新されたネイティブイメージを生成するために再バインドするためのそれぞれのアプリケーションのMDILファイルをバインダ625に提供する。更新されたネイティブイメージは、それらのネイティブイメージが、更新されたランタイムエンジン670を使用して実行可能であるように、バインダ625によって生成することができる。
【0052】
[061] 更新されたネイティブイメージ635を生成するために、更新されているアプリケーション用のそれぞれのMDILファイルに関して、バインダ625は、MDILファイル640などのそのアプリケーションのそれぞれのMDILファイルと、そのMDILファイルにバインドされることになる1つまたは複数のライブラリ645などの1つまたは複数のライブラリとを提供される。MDILファイルのコードにバインドするために提供される1つまたは複数のライブラリは、更新されたライブラリ620のセット内に含まれている、更新されている少なくとも1つのライブラリを含むことができる。いくつかの実施態様においては、更新されているアプリケーションのMDILファイルのコードにバインドされている1つまたは複数のライブラリは、更新されていない。
【0053】
[062] 更新されたネイティブイメージ635など、アプリケーション用の更新されたネイティブイメージは、生成されると、コンピューティングデバイス上のインストールされたアプリケーション用の1つまたは複数の更新されたネイティブイメージ605のうちの少なくとも1つとして格納される。更新されたネイティブイメージには、その更新されたネイティブイメージがアプリケーションを実行するために使用される前に、650において示されているように、信頼されているコードとしてサインすることもできる。655において、コンピューティングデバイスは、アプリケーション用の以前に生成されたネイティブイメージの代わりに、アプリケーションを実行するためのアプリケーション用の生成された更新されたネイティブイメージをロードする。
【0054】
[063] デバイス上のライブラリに対する更新を取り扱うことに加えて、デバイスは、アプリケーションが変わった(たとえば、アプリケーションのMDILコードが変わった)場合にアプリケーションを更新することができる。このケースにおいては、デバイスは、MDILコードの新たな部分をデバイス上の(変わっていない)1つまたは複数のライブラリとバインドすることを含めて、アプリケーション用の更新されたネイティブイメージを生成することによって、アプリケーションを更新する。アプリケーション用の更新されたネイティブイメージは、それらのネイティブイメージが、更新されたランタイムエンジンを使用して実行可能であるように、バインダによって生成することができる。
【0055】
[064] 660において示されているように、更新されたネイティブイメージの生成および/またはコンピューティングデバイス600の更新中に、アプリケーションおよび/またはコンピューティングデバイス600の更新が成功したと確認されるまで、以前に生成されたネイティブイメージを一時的に格納することができる。コンピューティングデバイスに対する、および/またはアプリケーションに対する更新が失敗した場合には、以前に生成されたネイティブイメージを一時ストレージから復元して、アプリケーションを実行するためにコンピューティングデバイスによってロードされているネイティブイメージとして再び使用することができる。
【0056】
MDILのコードを使用したネイティブコード生成を通じてアプリケーションを更新するための例示的な方法
[065]
図7は、MDILのコードからアプリケーション用のネイティブイメージを生成することによってアプリケーションを更新するための例示的な方法700である。さまざまな実施態様においては、
図7の示されている方法ブロックは、マージすること、サブブロックへと分割すること、または省略することが可能である。
図7においては、710において示されているように、1つまたは複数のライブラリのセットが、コンピューティングデバイス上で更新される。たとえば、コンピューティングデバイス上の1つまたは複数のライブラリの一部またはすべてが、変更、修正、またはその他の形で更新される。いくつかの実施態様においては、コンピューティングデバイス更新の一環として、1つまたは複数のライブラリのセットが更新され、デバイスのランタイムエンジンが更新される。いくつかの実施態様においては、コンピューティングデバイス上の1つまたは複数のアプリケーションに関して、(インストレーション中にそれぞれのアプリケーション用のネイティブイメージを生成するために)それぞれのアプリケーション用のMDILコードにバインドされた1つまたは複数のライブラリのうちのライブラリの少なくとも1つが、変更、修正、またはその他の形で更新される。いくつかの実施態様においては、ライブラリは、そのライブラリにバインドされているアプリケーション用のネイティブイメージのコードが、そのライブラリに関する少なくとも1つのオフセットにもはや適切に対応しなくなるように更新および/または更新される。たとえば、オブジェクトの少なくとも1つのフィールドに関するオフセットが、ライブラリ内で変わっている、といった具合である。オペレーティングシステム更新の一環として、コンピューティングデバイス上のライブラリのセットを更新することができる。または、フレームワークに対する更新および/または実行エンジン更新の一環として、コンピューティングデバイス上のライブラリを更新することができる。たとえば、コンピューティングデバイスは、.NETフレームワークなど、マネージドアプリケーションを実行するためのフレームワークを使用することができ、そのフレームワークの一部であるライブラリが、変更および/もしくは更新され、ならびに/またはそのフレームワークの一部であるランタイムエンジンが、変更および/もしくは更新される。.NETフレームワークにおいては、ベースクラスライブラリを、異なるおよび/またはより新たなバージョンのフレームワークライブラリに変更または更新することができる。いくつかのケースにおいては、コンピューティングデバイス上のすべてのライブラリが更新および/または変更されるとは限らない。その他のケースにおいては、コンピューティングデバイス上のすべてのライブラリが更新および/または変更される。
【0057】
[066] 720において、コンピューティングデバイスは、アプリケーション用の更新されたネイティブイメージを生成する。たとえば、アプリケーション用のMDILコードからネイティブイメージを生成することによってコンピューティングデバイス上にインストールされたアプリケーションを、コンピューティングデバイス上で1つまたは複数のライブラリのうちの少なくとも1つが更新された後に、そのアプリケーション用のMDILコードをそれらの1つまたは複数のライブラリにバインドすることによって、そのアプリケーション用に新たなネイティブイメージ(たとえば、更新されたネイティブイメージ)が生成されるように更新することができる。更新されたネイティブイメージの生成は、アプリケーションが最初にインストールされたときのネイティブイメージの生成と同様であることが可能である。たとえば、インストレーションプロセスに関して上述したようなコンピューティングデバイスの更新されたライブラリのうちの少なくとも1つを使用して、更新されたネイティブイメージをアプリケーション用に生成することができる。したがって、更新されたネイティブイメージの生成は、アプリケーション用の第1のネイティブイメージがアプリケーション用に既に生成されて、第1のネイティブイメージの生成中にバインドされたライブラリのうちの1つまたは複数がコンピューティングデバイス上で更新および/または変更された後に、生じる。いくつかの実施態様においては、ランタイムエンジンが、コンピューティングデバイスのライブラリとともに更新された場合には、更新されているアプリケーションのMDILコードのバインディングは、生成されたネイティブイメージが、コンピューティングデバイス上で利用可能であるものとして、更新されたランタイムエンジンおよび更新されたライブラリを使用して実行可能であるように行うことができる。
【0058】
[067] または、アプリケーション用のMDILコードは更新されているがライブラリおよび/またはランタイムエンジンは変わっていない場合に、更新されたネイティブイメージを生成することができる。たとえば、コンピューティングデバイスは、アプリケーション更新の一環として、アプリケーション用の新たなMDILコードを受信する。上述の方法200を使用してなど、本明細書において記載されているように、アプリケーション用の受信された新たなMDILコードをインストールすることができる。たとえば、コンピューティングデバイスは、新たなMDILコードの一部分をコンピューティングデバイス上の(変わっていない)1つまたは複数のライブラリとバインドすることを含めて、アプリケーション用の更新されたネイティブイメージを生成することによって、アプリケーションを更新する。バインダによってアプリケーション用に生成されたネイティブコードは、そのネイティブコードが、アプリケーションを実行するためのデバイス上で利用可能なランタイムエンジンを使用して実行可能であるように生成することができる。
【0059】
[068] いくつかの実施態様においては、更新されているアプリケーションに関して、そのアプリケーション用にコンピューティングデバイス上に格納されているそのアプリケーション用のMDILコードを、そのデバイスの1つまたは複数のライブラリにバインドすることができる。たとえば、バインダは、アプリケーション用に更新されている実行可能なネイティブイメージを生成するために、MDILコードを、コンピューティングデバイス上で利用可能な1つまたは複数のライブラリにバインドすることができる。このバインディングは、MDILコードを解決し、アプリケーション用の更新されたネイティブイメージ内に含まれるアプリケーション用のネイティブコードを生成する。いくつかの実施態様においては、更新されたネイティブイメージを生成する際に、アプリケーション用のMDILファイルのセット内のそれぞれのMDILファイルに関して、それぞれのMDILファイルと、そのファイルのMDILコードにバインドされることになる1つまたは複数のライブラリとが、バインダに提供される。バインダは、それぞれのMDILファイルを、そのバインダに提供されたライブラリにバインドして、アプリケーション用の更新されたネイティブイメージを生成する。更新されたネイティブイメージは、コンピューティングデバイスのプロセッサによって実行可能であるマシンコードなどのネイティブコードを含むことができ、更新されたネイティブイメージは、典型的には、MDILコードにおけるようにバインドされていない疑似命令を含まない。いくつかの実施態様においては、生成された更新されたネイティブイメージに、信頼されているコードとしてサインすることができる。
【0060】
[069] いくつかの実施態様においては、更新されたネイティブイメージは、アプリケーションを実行するためにロードされるネイティブイメージとして、アプリケーション用の以前に生成されたネイティブイメージに取って代わる。更新されたネイティブイメージは、アプリケーションを実行するためにロードされる。なぜなら、更新されたネイティブイメージは、コンピューティングデバイスの更新されたライブラリのうちの少なくとも1つを使用して実行可能であるネイティブコードを含むためである。以前に生成されたネイティブイメージは、不安定である、および/または信頼できない場合があり、それによって、以前に生成されたネイティブイメージは、適切にまたは予想どおりに機能しない。なぜなら、以前に生成されたネイティブイメージは、コンピューティングデバイス上で利用可能なライブラリのうちの1つのさらに以前のバージョンを不適切に参照することがあるためである。
【0061】
[070] いくつかの実施態様においては、更新されたネイティブイメージが生成されているときに、以前に生成されたネイティブイメージは、アプリケーションおよび/またはコンピューティングデバイスに対する更新が成功したと確認されるまで、一時的に格納および/またはバックアップされる。たとえば、コンピューティングデバイスのライブラリを更新するコンピューティングデバイスに対する更新は、アプリケーション用のネイティブイメージの再生成および/または更新をトリガすることができる。コンピューティングデバイスに対する更新またはアプリケーション用のネイティブイメージの更新が失敗した場合には、その失敗した更新をロールバックすることができ、格納されているそのアプリケーションの以前に生成されたネイティブイメージを、実行される際のアプリケーションのネイティブイメージとして使用することができる。いくつかの実施態様においては、アプリケーションデータも保存される。たとえば、アプリケーションのユーザは、アプリケーションが更新される前に、およびアプリケーションが更新された後に、ユーザデータおよび/またはアプリケーションデータを生成することができ、それらのユーザデータおよび/またはアプリケーションデータは、保存することが可能であり、それによって、更新されたネイティブイメージを生成しても、ユーザデータおよび/またはアプリケーションデータは、アプリケーションの以前のバージョンから変更されない。
【0062】
[071] 730において、コンピューティングデバイスは、デバイス上にインストールされた1つまたは複数のその他のアプリケーション用の更新されたネイティブイメージを生成する。たとえば、更新されたライブラリのうちの1つまたは複数にMDILコードをバインドすることによって生成されたネイティブイメージを有するコンピューティングデバイス上にインストールされたそれぞれのさらなるアプリケーションに関して、それらのそれぞれのアプリケーション用の更新されたネイティブイメージが、更新されたものとして1つまたは複数のライブラリにMDILコードをバインドすることによって生成される。730において示されている点線は、方法700のさまざまな実施態様においてはブロック730を方法から省略すること、または方法内に含めることが可能であるということを示している。いくつかの実施態様においては、デバイスの1つまたは複数のライブラリが(フレームワーク更新におけるように)更新された後に、そのデバイスのアプリケーションを自動的に更新することができ、それらのアプリケーション用の更新されたネイティブイメージを生成することができ、それによって、それらのアプリケーションは、更新されたライブラリを使用して適切に実行される。インストールされたアプリケーションが、更新および/または変更された共有ライブラリを使用していない場合には、そのアプリケーションを更新する必要はなく、そのアプリケーション用に更新されたネイティブイメージを生成する必要はない。なぜなら、そのアプリケーション用の以前に生成されたネイティブイメージは、デバイス上で利用可能であるものとしてライブラリとともに適切に機能することができるためである。いくつかの実施態様においては、ランタイムエンジンが、コンピューティングデバイスのライブラリとともに更新された場合には、アプリケーション用の更新されたネイティブイメージは、そのアプリケーションが、コンピューティングデバイス上で利用可能であるものとして、更新されたランタイムエンジンおよび更新されたライブラリを使用してコンピューティングデバイス上で実行可能であるように、生成され得る。
【0063】
[072] 740において、更新されたネイティブイメージは、コンピューティングデバイスにおいてアプリケーションを実行するためにアプリケーションをロードする際に使用するために格納される。たとえば、更新されたネイティブイメージは、その更新されたネイティブイメージの生成の前に生成されたアプリケーションのネイティブイメージの代わりにロードされる。更新されたネイティブイメージは、アプリケーションを実行するためにロードされる。なぜなら、その更新されたネイティブイメージは、自分が使用するライブラリを適切に参照することができるためである。アプリケーション用の既にダウンロードされたMDILコードを再バインドすることによって、更新されたネイティブイメージを生成することにより、アプリケーションを実行するためにネイティブイメージを使用するコンピューティングデバイスは、アプリケーションの更新されたバージョンをダウンロードする必要なく、アプリケーション用の新たにダウンロードされた情報からアプリケーションを再インストールすることなく、およびアプリケーションを再コンパイルすることなく、更新することができる。
【0064】
例示的なモバイルデバイス
[073]
図8は、全体に802で示されている、さまざまな任意選択のハードウェアコンポーネントおよびソフトウェアコンポーネントを含む例示的なモバイルデバイス800を示すシステム図である。一般に、このモバイルデバイス内のコンポーネント802は、別のコンポーネントと通信することができるが、例示を簡単にするために、すべての接続が示されているわけではない。このモバイルデバイスは、さまざまなコンピューティングデバイス(たとえば、携帯電話、スマートフォン、タブレットコンピュータ、ハンドヘルドコンピュータ、携帯情報端末(PDA)など)のうちの任意のものであることが可能であり、セルラネットワークまたは衛星ネットワークなどの1つまたは複数のモバイル通信ネットワーク804とのワイヤレス双方向通信を可能にすることができる。
【0065】
[074] 示されているモバイルデバイス800は、信号コーディング、データ処理、入力/出力処理、電力制御、および/またはその他の機能などのタスクを実行するためのコントローラまたはプロセッサ810(たとえば、信号プロセッサ、マイクロプロセッサ、ASIC、またはその他の制御および処理論理回路)を含むことができる。オペレーティングシステム812は、コンポーネント802の割り当ておよび使用を制御すること、ならびに、1つもしくは複数のアプリケーションプログラム814、および/または、アプリケーション用のデバイス上のILコードからネイティブコードを生成するための本明細書において記載されている技術のうちの1つもしくは複数を実施することができるものなどの1つもしくは複数のソフトウェアプログラム815のためのサポートを行うことが可能である。それらのアプリケーションプログラムは、一般的なモバイルコンピューティングアプリケーションおよびソフトウェア(たとえば、Eメールアプリケーション、カレンダ、コンタクトマネージャ、ウェブブラウザ、メッセージングアプリケーション、ランタイムエンジン)、またはその他の任意のコンピューティングアプリケーションを含むことができる。アプリケーションプログラム814用のコードおよび/またはその他の情報を取得および更新するために、アプリケーションストア、オンラインマーケットプレイス、またはオンラインプロバイダにアクセスするための機能813を使用することもできる。
【0066】
[075] 示されているモバイルデバイス800は、メモリ820を含むことができる。メモリ820は、非取外し式メモリ822および/または取外し式メモリ824を含むことができる。非取外し式メモリ822は、RAM、ROM、フラッシュメモリ、ハードディスク、またはその他のよく知られているメモリストレージ技術を含むことができる。取外し式メモリ824は、フラッシュメモリもしくはGSM通信システムにおいてよく知られている加入者識別モジュール(SIM)カード、または「スマートカード」など、その他のよく知られているメモリストレージ技術を含むことができる。メモリ820は、オペレーティングシステム812ならびにアプリケーション814および815を実行するためのデータおよび/またはコードを格納するために使用することができる。例示的なデータとしては、1つまたは複数の有線ネットワークまたはワイヤレスネットワークを介して1つもしくは複数のネットワークサーバもしくはその他のデバイスへ送信される、および/または1つもしくは複数のネットワークサーバもしくはその他のデバイスから受信されるウェブページ、テキスト、イメージ、音声ファイル、ビデオデータ、またはその他のデータセットを含むことができる。メモリ820は、国際移動体加入者識別番号(IMSI)などの加入者識別子、および国際移動体装置識別番号(IMEI)などの機器識別子を格納するために使用することができる。そのような識別子は、ユーザおよび機器を識別するためにネットワークサーバへ送信することができる。
【0067】
[076] モバイルデバイス800は、タッチスクリーン832、マイクロフォン834、カメラ836、物理キーボード838、および/またはトラックボール840などの1つまたは複数の入力デバイス830、ならびにスピーカ852およびディスプレイ854などの1つまたは複数の出力デバイス850をサポートすることができる。その他の可能な出力デバイス(図示せず)としては、圧電式またはその他の触覚出力デバイスを含むことができる。いくつかのデバイスは、複数の入力/出力機能を提供することができる。たとえば、タッチスクリーン832およびディスプレイ854は、単一の入力/出力デバイスにおいて結合することができる。入力デバイス830は、ナチュラルユーザインターフェース(NUI)を含むことができる。NUIは、ユーザが、マウス、キーボード、リモコンなどの入力デバイスによって課される人工的な制約から解放されて「自然」にデバイスと対話することを可能にする任意のインターフェース技術である。NUIの方法の例としては、話声認識、タッチおよびスタイラス認識、スクリーン上およびスクリーン付近の両方でのジェスチャ認識、エアジェスチャ、ヘッドトラッキングおよびアイトラッキング、音声および話声、ビジョン、タッチ、ジェスチャ、ならびにマシンインテリジェンスに依存する方法が含まれる。NUIのその他の例としては、加速度計/ジャイロスコープを使用するモーションジェスチャ検知、顔認識、3Dディスプレイ、ヘッドトラッキング、アイトラッキング、および視線トラッキング、没入型拡張現実および仮想現実システムが含まれ、それらはすべて、より自然なインターフェース、ならびに、電界感知電極(EEGおよび関連した方法)を使用して脳の活動を感知するための技術を提供する。したがって、特定の一例においては、オペレーティングシステム812またはアプリケーション814は、ユーザが音声コマンドを介してデバイス800を操作することを可能にする音声ユーザインターフェースの一部としての話声認識ソフトウェアを含むことができる。さらに、デバイス800は、ゲーミングアプリケーションまたはその他のアプリケーションに入力を提供するためにジェスチャを検知して解釈することなど、ユーザの空間ジェスチャを介したユーザ対話を可能にする入力デバイスおよびソフトウェアを含むことができる。
【0068】
[077] ワイヤレスモデム860は、当技術分野においてよく理解されているように、アンテナ(図示せず)に結合することができ、プロセッサ810と外部デバイスとの間における双方向通信をサポートすることができる。モデム860は、一般的に示されており、モバイル通信ネットワーク804および/またはその他の無線ベースのモデム(たとえば、ブルートゥース864またはWi-Fi 862)と通信するためのセルラモデムを含むことができる。ワイヤレスモデム860は、典型的には、単一のセルラネットワーク内における、セルラネットワークどうしの間における、またはモバイルデバイスと公衆交換電話網(PSTN)との間におけるデータ通信および音声通信のために、GSMネットワークなどの1つまたは複数のセルラネットワークと通信するように構成されている。
【0069】
[078] モバイルデバイスは、少なくとも1つの入力/出力ポート880、電源882、グローバルポジショニングシステム(GPS)受信機などの衛星ナビゲーションシステム受信機884、加速度計886、ならびに/または、USBポート、IEEE 1394(ファイヤワイヤ)ポート、および/もしくはRS−232ポートであることが可能である物理コネクタ890をさらに含むことができる。示されているコンポーネント802は、必須のもの、またはすべてを含むものではない。なぜなら、任意のコンポーネントを削除することができ、その他のコンポーネントを付加することができるためである。
【0070】
例示的な実施環境
[079]
図9は、説明されている実施形態、技術、および技術を実施することができる適切な実施環境900の一般化された例を示している。
【0071】
[080] 例示的な環境900においては、さまざまなタイプのサービス(たとえば、コンピューティングサービス)が、クラウド910によって提供される。たとえば、クラウド910は、コンピューティングデバイスの集合を含むことができ、それらのコンピューティングデバイスは、中央に配置すること、または分散することが可能であり、インターネットなどのネットワークを介して接続されているさまざまなタイプのユーザおよびデバイスにクラウドベースのサービスを提供する。実施環境900は、コンピューティングタスクを達成するために、さまざまな方法で使用することができる。たとえば、いくつかのタスク(たとえば、ユーザ入力を処理すること、およびユーザインターフェースを提示すること)は、ローカルコンピューティングデバイス(たとえば、接続されているデバイス930、940、950)上で実行することができ、その一方で、その他のタスク(たとえば、その後の処理において使用されることになるデータの格納)は、クラウド910において実行することができる。
【0072】
[081] 例示的な環境900においては、クラウド910は、さまざまなスクリーン機能を伴う接続されているデバイス930、940、950のためのサービスを提供する。接続されているデバイス930は、コンピュータスクリーン935(たとえば、中規模スクリーン)を伴うデバイスに相当する。たとえば、接続されているデバイス930は、デスクトップコンピュータ、ラップトップ、ノートブック、ネットブックなどのパーソナルコンピュータであることが可能である。接続されているデバイス940は、モバイルデバイススクリーン945(たとえば、小規模スクリーン)を伴うデバイスに相当する。たとえば、接続されているデバイス940は、モバイル電話、スマートフォン、携帯情報端末、タブレットコンピュータなどであることが可能である。接続されているデバイス950は、大型スクリーン955を伴うデバイスに相当する。たとえば、接続されているデバイス950は、テレビジョンスクリーン(たとえば、スマートテレビジョン)、またはテレビジョンに接続されている別のデバイス(たとえば、セットトップボックス、もしくはゲーミングコンソール)などであることが可能である。接続されているデバイス930、940、および950のうちの1つまたは複数は、タッチスクリーン機能を含むことができる。タッチスクリーンは、さまざまな方法で入力を受け入れることができる。たとえば、容量性タッチスクリーンは、表面を横切って流れている電流をオブジェクト(たとえば、指先またはスタイラス)が歪めたまたは遮ったときにタッチ入力を検知する。別の例として、タッチスクリーンは、光センサを使用して、それらの光センサからのビームが遮られたときにタッチ入力を検知する。いくつかのタッチスクリーンによって入力が検知される上で、スクリーンの表面との物理的な接触は必要ではない。スクリーン機能を伴わないデバイスを、例示的な環境900において使用することもできる。たとえば、クラウド910は、ディスプレイを伴わない1つまたは複数のコンピュータ(たとえば、サーバコンピュータ)のためのサービスを提供することができる。
【0073】
[082] サービスは、サービスプロバイダ920を通じて、またはオンラインサービスのその他のプロバイダ(図示せず)を通じて、クラウド910によって提供することができる。たとえば、クラウドサービスは、特定の接続されているデバイス(たとえば、接続されているデバイス930、940、950)のスクリーンサイズ、ディスプレイ機能、および/またはタッチスクリーン機能に合わせてカスタマイズすることができる。
【0074】
[083] 例示的な環境900においては、クラウド910は、本明細書において説明されている技術およびソリューションを、サービスプロバイダ920および1つまたは複数のオンラインプロバイダ925を少なくとも部分的に使用して、さまざまな接続されているデバイス930、940、950に提供する。たとえば、サービスプロバイダ920は、さまざまなクラウドベースのサービスのための集中型のソリューションを提供することができる。サービスプロバイダ920は、ユーザおよび/またはデバイスに関する(たとえば、接続されているデバイス930、940、950、および/またはそれらのそれぞれのユーザに関する)サービスサブスクリプションを管理することができる。クラウド910は、本明細書において論じられているような1つまたは複数のアプリケーション用の1つまたは複数の1つのインストレーションパッケージをダウンロード、送信、または受信するためのリソースを提供することができる。たとえば、アプリケーション用の中間言語コードは、オンラインプロバイダ925のうちの少なくとも1つによってクラウド910においてコンパイルすることができる。965において示されているように、クラウド910からダウンロードされたILコードから、接続されているデバイス930によってアプリケーション用にネイティブイメージが生成される。
【0075】
例示的なコンピューティング環境
[084]
図10は、説明されているイノベーションを実施することができる適切なコンピューティング環境1000の一般化された例を示している。コンピューティング環境1000は、使用または機能の範囲に関して何らかの限定を提示することを意図されているものではない。なぜなら、これらのイノベーションは、多様な汎用または専用のコンピューティングシステムにおいて実施することができるためである。たとえば、コンピューティング環境1000は、さまざまなコンピューティングデバイス(たとえば、デスクトップコンピュータ、ラップトップコンピュータ、サーバコンピュータ、タブレットコンピュータ、メディアプレーヤ、ゲーミングシステム、モバイルデバイスなど)のうちの任意のものであることが可能である。
【0076】
[085]
図10を参照すると、コンピューティング環境1000は、1つまたは複数の処理ユニット1010、1015、およびメモリ1020、1025を含む。
図10においては、この基本的な構成1030は、破線内に含まれている。処理ユニット1010、1015は、コンピュータ実行可能命令を実行する。処理ユニットは、汎用中央処理装置(CPU)、特定用途向け集積回路(ASIC)内のプロセッサ、またはその他の任意のタイプのプロセッサであることが可能である。マルチプロセッシングシステムにおいては、処理能力を高めるために、複数の処理ユニットが、コンピュータ実行可能命令を実行する。たとえば、
図10は、中央処理装置1010ならびにグラフィックスプロセッシングユニットまたはコプロセッシングユニット1015を示している。有形のメモリ1020、1025は、処理ユニットによってアクセス可能な、揮発性メモリ(たとえば、レジスタ、キャッシュ、RAM)、不揮発性メモリ(たとえば、ROM、EEPROM、フラッシュメモリなど)、またはそれら2つの何らかの組合せであることが可能である。メモリ1020、1025は、処理ユニットによる実行に適したコンピュータ実行可能命令の形態の、本明細書において説明されている1つまたは複数のイノベーションを実施するソフトウェア1080を格納する。
【0077】
[086] コンピューティングシステムは、さらなる特徴を有することができる。たとえば、コンピューティング環境1000は、ストレージ1040、1つまたは複数の入力デバイス1050、1つまたは複数の出力デバイス1060、および1つまたは複数の通信接続1070を含む。バス、コントローラ、またはネットワークなどの相互接続メカニズム(図示せず)が、コンピューティング環境1000のコンポーネントどうしを相互接続する。典型的には、オペレーティングシステムソフトウェア(図示せず)が、コンピューティング環境1000において実行されるその他のソフトウェアのためのオペレーティング環境を提供し、コンピューティング環境1000のコンポーネントどうしのアクティビティーをコーディネートする。
【0078】
[087] 有形のストレージ1040は、取り外し可能または非取外し式とすることができ、磁気ディスク、磁気テープもしくはカセット、CD−ROM、DVD、または、情報を非一時的な方法で格納するために使用することが可能な、およびコンピューティング環境1000内でアクセスすることが可能なその他の任意のメディアを含む。ストレージ1040は、1つまたは複数のアプリケーション用のILコードからネイティブコードを生成することなど、本明細書において説明されている1つまたは複数のイノベーションを実施するソフトウェア1080のための命令を格納する。
【0079】
[088] 入力デバイス1050は、キーボード、マウス、ペン、もしくはトラックボールなどのタッチ入力デバイス、音声入力デバイス、スキャニングデバイス、または、コンピューティング環境1000に入力を提供する別のデバイスであることが可能である。ビデオエンコーディングに関しては、入力デバイス1050は、カメラ、ビデオカード、TVチューナカード、または、アナログ形式もしくはデジタル形式のビデオ入力を受け入れる類似のデバイス、または、ビデオサンプルをコンピューティング環境1000内へ読み込むCD−ROMもしくはCD−RWであることが可能である。出力デバイス1060は、ディスプレイ、プリンタ、スピーカ、CDライタ、または、コンピューティング環境1000からの出力を提供する別のデバイスであることが可能である。
【0080】
[089] 通信接続1070は、通信メディアを介した別のコンピューティングエンティティへの通信を可能にする。通信メディアは、コンピュータ実行可能命令、オーディオもしくはビデオ入力もしくは出力、またはその他のデータなどの情報を、変調されたデータ信号で搬送する。変調されたデータ信号とは、その信号の特性のうちの1つまたは複数が、その信号内で情報を符号化するように設定または変更されている信号である。限定ではなく、例として、通信メディアは、電気キャリア、光キャリア、RFキャリア、またはその他のキャリアを使用することができる。
【0081】
[090] 開示されている方法のうちのいくつかのオペレーションは、好都合な提示のために特定の連続した順序で説明されているが、この様式の説明は、以降で示されている特定の言葉によって特定の順序が必要とされない限り、並べ替えを含むということを理解されたい。たとえば、連続して説明されているオペレーションどうしは、いくつかのケースにおいては、並べ替えること、または同時に実行することが可能である。その上、説明を簡潔にするために、添付の図は、開示されている方法をその他の方法と組み合わせて使用することができるさまざまなやり方を示していない場合がある。
【0082】
[091] 開示されている方法のうちのいずれも、1つまたは複数のコンピュータ可読ストレージメディア(たとえば、1つもしくは複数の光メディアディスク、揮発性メモリコンポーネント(DRAMもしくはSRAM等)、または不揮発性メモリコンポーネント(フラッシュメモリもしくはハードドライブ等)などの非一時的コンピュータ可読メディア)上に格納されている、コンピュータ(たとえばスマートフォン、または、コンピューティングハードウェアを含むその他のモバイルデバイスなど、任意の市販のコンピュータ)上で実行されるコンピュータ実行可能命令として実装することができる。容易に理解できるはずだが、コンピュータ可読ストレージメディアという用語は、変調されたデータ信号などの通信接続を含まない。開示されている技術を実施するためのコンピュータ実行可能命令のうちのいずれも、ならびに開示されている実施形態の実施中に作成および使用されるいかなるデータも、1つまたは複数のコンピュータ可読メディア(たとえば、伝搬される信号を除く非一時的コンピュータ可読メディア)上に格納することができる。コンピュータ実行可能命令は、たとえば、専用ソフトウェアアプリケーション、またはウェブブラウザを介してアクセスもしくはダウンロードされるソフトウェアアプリケーション、またはその他のソフトウェアアプリケーション(リモートコンピューティングアプリケーションなど)の一部であることが可能である。そのようなソフトウェアは、たとえば、単一のローカルコンピュータ(たとえば、任意の適切な市販のコンピュータ)上で、または、1つもしくは複数のネットワークコンピュータを使用してネットワーク環境において(たとえば、インターネット、ワイドエリアネットワーク、ローカルエリアネットワーク、クライアントサーバネットワーク(クラウドコンピューティングネットワークなど)、もしくはその他のそのようなネットワークを介して)実行することができる。
【0083】
[092] 明確にするために、ソフトウェアベースの実装形態の特定の選択された態様のみが説明されている。当技術分野においてよく知られているその他の詳細は、省略されている。たとえば、開示されている技術は、いかなる特定のコンピュータ言語またはプログラムにも限定されるものではないということを理解されたい。たとえば、開示されている技術は、C++、C♯、J++、Java、Perl、JavaScript、Adobe Flash、またはその他の任意の適切なプログラミング言語で書かれたソフトウェアによって実装することができる。同様に、開示されている技術は、いかなる特定のコンピュータまたは特定のタイプのハードウェアにも限定されるものではない。適切なコンピュータおよびハードウェアの特定の詳細は、よく知られており、本開示において詳細に説明する必要はない。
【0084】
[093] 本明細書において説明されているいかなる機能も、少なくとも部分的には、ソフトウェアの代わりに、1つまたは複数のハードウェアロジックコンポーネントによって実行することができるということもよく理解できるはずである。限定ではなく、例として、使用することができるハードウェアロジックコンポーネントの例示的なタイプとしては、フィールドプログラマブルゲートアレイ(FPGA)、プログラム固有集積回路(ASIC)、プログラム固有標準製品(ASSP)、システムオンアチップシステム(SOC)、結合プログラム可能論理回路(CPLD)などが含まれる。
【0085】
[094] さらに、(たとえば、開示されている方法のうちの任意の方法をコンピュータに実行させるためのコンピュータ実行可能命令を含む)ソフトウェアベースの実施形態のうちのいずれも、適切な通信手段を通じてアップロードすること、ダウンロードすること、またはリモートからアクセスすることが可能である。そのような適切な通信手段は、たとえば、インターネット、ワールドワイドウェブ、イントラネット、ソフトウェアアプリケーション、ケーブル(光ファイバケーブルを含む)、磁気通信、電磁通信(RF通信、マイクロ波通信、および赤外線通信を含む)、電子通信、またはその他のそのような通信手段を含む。
【0086】
[095] 開示されている方法、装置、およびシステムは、いかなる形であれ限定的なものと解釈されるべきではない。それどころか、本開示は、単独での、および相互のさまざまな組合せおよび下位組合せでの、さまざまな開示されている実施形態のすべての自明ではない新規な特徴および態様を対象としている。開示されている方法、装置、およびシステムは、いかなる特定の態様もしくは特徴またはそれらの組合せにも限定されるものではなく、開示されている実施形態は、いかなる1つもしくは複数の特定の利点が存在することも、またはいかなる1つもしくは複数の特定の問題が解決されることも必要とするものではない。開示されている本発明の原理を適用することができる多くの可能な実施形態を考慮すれば、例示されている実施形態は、本発明の好ましい例にすぎず、本発明の範囲を限定するものと解釈されるべきではないということが認識されるはずである。むしろ、本発明の範囲は、添付の特許請求の範囲によって画定されている。したがって我々は、これらの特許請求の範囲およびそれらの均等物の範疇内に収まるすべてを我々の発明として特許請求している。