(57)【特許請求の範囲】
【請求項１】
ランタイムで生成したコードをキャッシュするシステムであって、
コンピュータ上でマネージドコード環境において実行して、エンティティを第１のキャッシュ又は第２のキャッシュにキャッシュするコンポーネントを備え、
前記キャッシュされたエンティティはランタイムで生成したコードを含み、該ランタイムで生成したコードは、動的コードを生成するエンティティによってランタイムで生成され、
前記動的コードを生成するエンティティはグローバルステートを混乱させず、
前記キャッシュされたエンティティは、該キャッシュされたエンティティの次の実行において、少なくとも１つのコード生成の段階を回避するよう、前記第１のキャッシュまたは前記第２のキャッシュから取り出され、
回避された前記少なくとも１つのコード生成の段階は、中間バイトコードの生成またはネイティブバイナリコードの生成を含み、
前記コンポーネントは、前記動的コードを生成するエンティティがグローバルステートを混乱させるかどうかを判定し、前記動的コードを生成するエンティティがグローバルステートを混乱させないと判定することに応答して、エンティティを前記第１のキャッシュ又は前記第２のキャッシュにキャッシュするよう動作する
ことを特徴とするシステム。
【請求項２】
前記第１のキャッシュは、前記ランタイムで生成したコードを表している中間バイトコードを格納するキャッシュを含み、
回避された前記少なくとも１つのコード生成の段階は、前記ランタイムで生成したコードについての中間バイトコードを生成することを含む
ことを特徴とする請求項１に記載のシステム。
【請求項３】
前記第２のキャッシュは、ネイティブバイナリコードを格納するキャッシュを含み、
回避された前記少なくとも１つのコード生成の段階は、前記ランタイムで生成したコードについてのネイティブバイナリコードを生成することを含む
ことを特徴とする請求項１に記載のシステム。
【請求項４】
前記第１のキャッシュはソースアセンブリのキャッシュであり、
回避された前記少なくとも１つのコード生成の段階は、前記ランタイムで生成したコードについての中間バイトコードの生成または前記ランタイムで生成したコードについてのネイティブバイナリコードの生成を含む
ことを特徴とする請求項１に記載のシステム。
【請求項５】
前記ランタイムで生成したコードの前記中間バイトコードは、前記動的コードを生成するエンティティと関連付けられた名前と、前記動的コードを生成するエンティティへ渡される少なくとも１つの引数と、前記動的コードを生成するエンティティのためのバージョンのインジケータとを含む識別子により検索されることを特徴とする請求項１に記載のシステム。
【請求項６】
ランタイムで生成したコードをキャッシュする方法であって、
ランタイムでコードを生成するエンティティが純粋関数であるかどうかを判定するステップと、
前記ランタイムでコードを生成するエンティティが純粋関数であると判定することに応答して、前記ランタイムでコードを生成するエンティティにより生成された、ランタイムで生成したコードを含むエンティティの識別子を計算するステップであって、前記ランタイムで生成したコードを含むエンティティは、リフレクションエミットの機構により生成された中間バイトコードを含み、前記計算された識別子は、前記ランタイムで生成したコードの実行コンテクストに特有の特性を備え、前記実行コンテクストに特有の特性により、前記ランタイムでコードを生成するエンティティのバージョンが識別されるステップと、
ランタイムで生成したコードを含む前記エンティティの最初の実行時に、前記計算された識別子がキーとなっている当該エンティティを第１のキャッシュに格納するステップと、
前記格納されたエンティティの２番目の実行に応答して、前記格納されたエンティティを戻すステップであって、前記格納されたエンティティの前記中間バイトコードの生成は、当該格納されたエンティティの前記２番目の実行について回避されるステップと、
を含むことを特徴とする方法。
【請求項７】
前記格納されたエンティティについての前記中間バイトコードから前記ランタイムで生成したコードのネイティブバイナリコードを生成するステップをさらに備えることを特徴とする請求項６に記載の方法。
【請求項８】
前記生成したネイティブバイナリコードを、第２のキャッシュであるネイティブバイナリコードのキャッシュにキャッシュするステップをさらに備えることを特徴とする請求項７に記載の方法。
【請求項９】
前記第１のキャッシュは前記格納されたエンティティを含むソースアセンブリであることを特徴とする請求項６に記載の方法。
【請求項１０】
前記計算された識別子は、純粋関数の前記ランタイムでコードを生成するエンティティと関連付けられた名前と、純粋関数の前記ランタイムでコードを生成するエンティティへ渡される少なくとも１つの引数と、純粋関数の前記ランタイムでコードを生成するエンティティのバージョンのインジケータとを含む識別子を含むことを特徴とする請求項６に記載の方法。
【請求項１１】
ランタイムで生成したコードをキャッシュする方法をマネージドコード環境に実行させるためのコンピュータ実行可能命令を記憶したコンピュータ可読記憶媒体であって、前記方法が、
ランタイムでコードを生成するエンティティがグローバルステートを混乱させるかどうかを判定するステップと、
前記ランタイムでコードを生成するエンティティがグローバルステートを混乱させないと判定することに応答して、第１のキャッシュ又は第２のキャッシュにエンティティをキャッシュするステップと
を有し、
前記エンティティは、グローバルステートを混乱させない前記ランタイムでコードを生成するエンティティによって生成された、ランタイムで生成したコードを含み、
前記キャッシュされたエンティティは、前記キャッシュされたエンティティのその後の実行において少なくとも１つのコード生成の段階を回避することによって取り出される
ことを特徴とするコンピュータ可読記憶媒体。
【請求項１２】
前記方法が、
前記キャッシュされたエンティティのその後の実行の間に、前記ランタイムで生成したコードの中間バイトコードの生成を回避するステップ
を更に有することを特徴とする請求項１１に記載のコンピュータ可読記憶媒体。
【請求項１３】
前記方法が、
前記キャッシュされたエンティティのその後の実行の間に、前記ランタイムで生成したコードの中間バイトコードからのネイティブバイナリコードの生成を回避するステップ
を更に有することを特徴とする請求項１１に記載のコンピュータ可読記憶媒体。
【請求項１４】
前記方法が、
前記キャッシュされたエンティティのソースアセンブリに前記ネイティブバイナリコードまたは前記中間バイトコードをキャッシュするステップ
を更に有することを特徴とする請求項１３に記載のコンピュータ可読記憶媒体。
【請求項１５】
前記方法が、
前記キャッシュされたエンティティの実行に特有の性質を用いて、前記キャッシュされたエンティティに特別な識別子を提供するステップと、
前記第１のキャッシュまたは前記第２のキャッシュから、前記特別な識別子がキーになっている前記キャッシュされたエンティティを取り出すステップと
を更に有することを特徴とする請求項１１に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【背景技術】
【０００１】
従来、コンパイラのソフトウェアはネイティブコード、すなわち、コードを実行するマシンに特有であるバイナリ（二進）コードを作成する。従来のコンパイラによって作成された（アンマネージメントの）ネイティブコードは、一般的にオペレーティングシステムがそのコードをランさせるために必要なすべてを含んでいるが、それ以外にほとんど含んでいない。その一方、仮想計算機の環境では、ソースコードは、どのようなマシンにも特定されない中間バイトコード（ｉｎｔｅｒｍｅｄｉａｔｅ  ｂｙｔｅ  ｃｏｄｅ）の表現にコンパイルされる。付け加えると、マネージドコードのコンパイラにより生産されたものは、一般的に、バイナリコードよりもかなり多くの情報を含んでいる。追加された情報はバイナリコードの特徴を説明しており、メタデータと呼ばれることもある。これは、他のデータを説明するためのデータの用語の総称であるが、この場合、その表現されたデータは、そのバイナリコードである。中間バイトコードやメタデータを含んだコンテナは、マネージドアセンブリと呼ばれることもある。これらのコンテナは、また、ＪＡＶＡ（登録商標）アーカイブまたはＪＡＶＡモジュールのクラスファイルとしてあらわされる。「アセンブリ」または「マネージドアセンブリ」という言葉は、本明細書ではそのようなバイトコードやメタデータのコンテナをあらわしている。
【０００２】
アンマネージドの環境においては、ランタイムにおいて、予め用意されているネイティブの命令がメモリにロードされ、実行される。マネージメントの環境では、ランタイムにおいて、実行直前に、マネージドアセンブリをネイティブバイナリの命令にコンパイル、すなわち変換することができる。つまり、マネージメントアセンブリをメモリにロードし、ジャストインタイム（ＪＩＴ）又はオンザフライのコンパイラにより、その後実行されるマシン又はランタイムに特有の命令へコンパイルすることができる。マネージド環境下でのコンパイル／変換段階は実行に影響する付加的な処理を含む可能性があるが、他方で、JIT／オンザフライのコンパイルはアンマネージメント環境下では活用できない環境特有の最適化ができる可能性がある。たとえば、JIT／オンザフライのコンパイルが、実行しているコードが全面的な信頼によりランしていることを認識している場合には、アンマネージメント環境下では飛ばすことのできなかったいくつかの信頼できる高価なセキュリティーチェックを飛ばすことができる。
【０００３】
マネージドの環境においては、実行直前にマネージドアセンブリをコンパイルする代わりに、ソースコードまたは中間バイトコードを最適化コンパイラによりネイティブバイナリコードにコンパイルしたり、ホストシステムで実行される前に記録（キャッシュへの格納）したりすることができる。例えば、ＮＧＥＮのようなネイティブイメージジェネレータは、アセンブリの実行の要求が受け取られる前に中間バイトコードをバイナリのネイティブマシン命令へ変換することにより、その環境のためのネイティブバイナリイメージを作成する可能性がある。こうして、ランタイムにおいて、２度目のコンパイラ／変換段階無しで、予め用意した実行コードがロードされ、実行される。つまり従来のネイティブコードの環境の段階と同様に実行される。たとえキャッシュへの格納がランタイムにおけるJIT／オンザフライのコンパイル／変換を削除することにより、アセンブリをより早く実行することを目的としていても、上述の最適化のようなJIT／オンザフライのコンパイラ／変換により作られた環境特有の最適化はあらかじめアセンブリをキャッシュに格納するときに行うことは不可能であるため、パフォーマンスは改善されないであろう。
【０００４】
上記のとおり、ほとんどのネイティブ言語はソースコードの内部構造について記録していない。その一方で、マネージドの環境において生成された中間バイトコードと一緒に含まれたメタデータのために、現在有するオブジェクトを活用でき、新しいオブジェクトを生成し、存在するオブジェクトから引き継いだりするコードは、ランタイムにおいて、すぐに生じる。ランタイムにおいて生成したコードは、ランタイムにおいて生成した長期ストレージ媒体（例えば、ハードディスク）からのコードをロードすることなしに動的コードを作成もしくはロードすることに使用される特別な機能を必要とするだろう。そのような機能は、以下の文章においてリフレクションエミット（Ｒｅｆｌｅｃｔｉｏｎ  Ｅｍｉｔ）と呼ぶ。ランタイムにおいて生成したコードは、ダイナミックジェネレーティッドコードと呼ばれているが、一般的に各プロセスインスタンスの間に中間バイトコードにコンパイルされ、また、その後、JIT／オンザフライのコンパイルにより処理される。これは、重要となりうるすべての加工費である。
【発明の概要】
【０００５】
マネージドアセンブリのようなエンティティ、又はメソッド又は関数のようなマネージドアセンブリ一部が、ランタイムにおいて追加のコードを生成した場合、そのメソッド又は関数が純粋な場合、追加のランタイムに生成したコードは、キャッシュに格納されるため、以降のエンティティの実行において、キャッシュに格納されたランタイムに生成したコードを、その識別子をルックアップしキャッシュから識別されたコードを検索することによりキャッシュから検索することができ、一または複数のコード生成段階を回避することができる。その上、コンパイラはキャッシュコードを事前コンパイルすることができ、および／又は、特別なデータとしてソースアセンブリのメタデータに加えることができる。したがって、ランタイムに生成したコードをキャッシュに格納し、プログラムのインスタンスを超えて再利用することができる。ランタイムにおいて、一以上のランタイムに生成したコードのキャッシュは検査され、そのキャッシュの中に識別されたエンティティが含まれている場合には、それはロードされ使用され、中間コード生成段階、コンパイル・変換段階又は中間コード生成段階とコンパイル・変換段階の両方が除外される。
【０００６】
本「発明の概要」は、以下「発明を実施するための形態」でさらに述べる概念を選択して簡略化した形式で紹介するために提供するものである。本「発明の概要」は、請求の主題の重要な特徴または主要な特徴を特定することを意図しておらず、請求の主題の範囲を決定する際の援助として使用されることも意図していない。
【図面の簡単な説明】
【０００７】
【図１】本明細書に開示された主題の態様に従って、ランタイムにおいて生成したコードをキャッシュに格納するシステムの一例のブロック図である。
【図２ａ】当技術分野で周知のような動的プログラムを実行するための方法である。
【図２ｂ】本明細書に開示された主題の態様に関連する、ランタイムにおいて生成したコードをキャッシュに格納するための方法の一例である。
【図２ｃ】本明細書に開示された主題の態様に関連する、ランタイムにおいて生成したコードをキャッシュに格納するための方法の他の一例である。
【図３】本明細書に開示された主題の態様が実現されるコンピューティング環境の一例を示すブロック図である。
【図４】本明細書に開示された態様に関する統合された開発環境の一例のブロック図である。
【発明を実施するための形態】
【０００８】
リフレクションエミットはランタイムにおいて追加されたプログラムの命令を動的に生成し、起動するための機構である。すなわち、ランタイムにおいて適用できるデータ、サービス、および特別な操作に基づいて、プログラムの基本設計概念それ自体をランタイムにおいて決定することができる。例えば、特別なプログラムが数学的操作を実行し、ユーザーが特定のサイズのマトリックスに基づいて計算することを望んでいると仮定する。ひとつの方法としては、どのサイズのマトリックスにおいても計算を実行できる包括な関数を書くことである。このような関数は静的している。直接に操作するアルゴリズムが目的とする問題を解決するためである。このようなプログラムは、あらゆるサイズのマトリックスをも操作するという必要条件があるため、非効率であると思われる。他の方法としては、その問題の動的な解決方法はその問題を解決するための特別なアルゴリズムの生成を含んでいる。このような解法は、さまざまな入力変数が与えられた静的関数Ａが新しい動的関数Ｂを生成させるためにこれらの変数のいくつかを使用することを含み、その後、他の入力変数を通り越してその動的関数となるであろう。この、カスタマイズされた動的関数は特別な入力のみに働くと思われるが、それはこのような制限された入力の一式を与えられた最高のパフォーマンスを可能にする方法で書き込まれるだろう。例えば、静的関数Ａは、16×16のマトリックスを互いに乗じるという要求を受け取る。静止した関数Ａは16×16のマトリックスを互いに乗じることしかできない新しい動的関数Ｂを生成させる。その後、静的関数Ａは、動的関数Ｂへ現実の互いのマトリックスを乗じるタスクを委任する。
【０００９】
リフレクションエミットのような機構を使うことにより、ランタイムにおいて（動的な）プログラムにより付加されるものはプログラム命令となる。すなわち、例を続けてあげると、リフレクションエミットのような機構を使うことにより、最適化は、16×16のマトリックスのためのプログラムのこの特別な実行の最適化するために、ランタイムにおいてプログラムによる（動的な）包括的なプログラム命令となるであろう。リフレクションエミットのような機構によりなされた動的な変更は性能を良くし、互換性を増やしたり、他の有用な利点をもたらしたりする。オブジェクト指向環境の状況の中では、リフレクションエミットは新しいタイプの生成や新しいタイプの方法を可能にし、新しい方法を実行できるアルゴリズムを明確にできる。マネージドコードの環境の中では、リフレクションエミットを通して中間バイトコードが生成される。周知の現存するシステムでは、ランタイムにおいて生成した中間バイトコードはプログラムの作動中いつでもネイティブマシンの命令にコンパイル／変換されなければならない。
【００１０】
本明細書において開示された主題の態様にしたがって、最初に動的プログラムが実行されると、中間バイトコードが生成され、実行コンテクスト固有の識別子が与えられ、キャッシュに格納される。次に、プログラムがランされるとき、中間コードは再び生成されなくとも良いであろう。例えば、仮に動的関数（言い換えればランタイムにおいて中間バイトコードを生じさせる関数）が存在するとする。さらに、その関数が関数の実行中に変化する、又は変化しない２つの変数を受け取るとする。受け取った変数の値によって、異なるバイトコードが生成される。本明細書において開示された主題の態様にしたがって、変数の値と関数を生成させる動的コードの名前とに基づいた識別子は生成され、関数の実行により作成された中間バイトコードと関連付けられるであろう。識別されたバイトコードは、中間バイトコードのキャッシュかアセンブリの一部のメタデータかどちらかのキャッシュに格納される。そのため、次に同じ変数の値により関数が実行されるとき、中間バイトコードを再生する必要性が除外され、格納されたバイトコードがキャッシュから検索でき、直接メモリにロードできる。同様に、動的関数の識別子は動的関数を生成した関数により与えられた変数に基づいている。キャッシュに格納された動的関数の識別子は動的関数を生成させるために利用されるアルゴリズムに基づいている。動的関数の識別子は動的コードを生成させる関数の特別なバージョンを識別するであろう。
【００１１】
その上、中間バイトコードがネイティブコードに変換された場合には、ネイティブコードは、ネイティブコードのキャッシュかソースアセンブリのメタデータの一部のどちらかに格納されることができる。次にプログラムが実行されたとき、中間バイトコードの生成も、バイトコードのネイティブバイナリコードへの変換も、どちらも実行される必要はない。ネイティブバイナリコードはロードされることができ、ネイティブコードのキャッシュから直接実行される。キャッシュに格納されたネイティブバイナリコードは前段落において説明されたように識別される。
【００１２】
ランタイムにおいて生成したコードのキャッシュへの格納
図１は、本明細書に開示された主題の態様に従って、ランタイムにおいて生成したコードをキャッシュに格納するシステム１００を示している。システム１００は、一又は複数の下記の事項を含んでいる。ランタイムで生成したコードをキャッシュに格納し、および／又は中間バイトコードのキャッシュ１０９および／又は再生可能な（マシンコードの）実行ファイルのキャッシュ１１８および／又はソースアセンブリキャッシュ１２２のようなランタイムにおいて生成したコードのキャッシュのルックアップ操作を行い、識別されたコードをリクエスタに戻す一以上のコンポーネント１２０と、コンパイラ１０５と、ＪＩＴ又はオンザフライコンパイラ１１０と、中間バイトコードのキャッシュ１０９および／又は再生可能な（マシンコードの）実行ファイルのキャッシュ１１８および／又はソースアセンブリキャッシュ１２２のような一以上のキャッシュを含む。ＪＩＴ又はオンザフライコンパイラは、実行可能だが再利用不可能なネイティブコードをメモリ中に生成させる。入力変数１１３のような入力変数はプログラムが実行しているときに与えられる。
【００１３】
また、システム１００は、ＮＧＥＮ１１２のようなネイティブジェネレーターを含む。ネイティブジェネレーターはネイティブバイナリ（マシン言語）の再生可能なマシンコード実行ファイル１１６を生成させ、記録する。再生可能なマシンコード実行ファイル１１６は再生可能な(マシンコード)実行ファイルのキャッシュ１１８に記録される。中間バイトコードは中間バイトコードのキャッシュメモリ１０９に記録される。ネイティブバイナリ又は中間バイトコードはソースアッセンブリのキャッシュ１２２に記録される。中間バイトコードのキャッシュ１０９と、再利用可能な（マシンコード）実行ファイルのキャッシュ１１８および／又はソースアセンブリのキャッシュ１２２はマシン全体又はシステム全体にわたるキャッシュとなる。システム１００の全部又は一部は、図３との関係において以下に記述されるコンピュータのような一以上のコンピュータ上に存在する。それに関して、システム１００又はその一部は、図３との関係において記述され、また下に記述されたコンピュータのような一以上のコンピュータ上に存在している、図４との関係で下に記述され例証されたコンピュータのような統合開発環境（ＩＤＥ）６００の一部を、包含している。あるいは、それに関して、システム１００又はその一部は、独立型システム又はプラグインとして提供される。
【００１４】
コンパイラ１０５は．ＮＥＴの言語で書かれたソースコードを中間バイトコード（例えば共通の中間言語、ＣＩＬ）にコンパイルする．ＮＥＴコンパイラを包含する。．ＮＥＴ言語は、Ｖｉｓｕａｌ ｂａｓｉｃ、Ｖｉｓｕａｌ Ｊ＃、 Ｃ＋＋、Ｃ＃、Ｊ＃、Ｊａｖａ Ｓｃｒｉｐｔ、ＡＰＬ、ＣＯＢＯＬ、Ｐａｓｃａｌ、Ｅｉｆｆｅｌ、Ｈａｓｋｅｌｌ、ＭＬ、Ｏｖｅｒｏｎ、Ｐｅｒｌ、Ｐｙｔｈｏｎ、Ｓｃｈｅｍｅ、Ｓｍａｌｌｔａｌｋ又は他の．ＮＥＴ言語を含むが、それに限定されない。コンパイラ１０２はＪＡＶＡにおいて書かれたソースコードをＪＡＶＡバイトコードにコンパイルするＪＡＶＡコンパイラを包含する。
【００１５】
コンパイラ１０５は、ソースコード１０４を１以上のマネージドアセンブリ１０８等にコンパイルする。ソースコード１０４は動的プログラムコード、すなわち、ランタイムにおいて実行されたときに追加コードを生成するコード、例えば、ランタイムで生成した中間バイトコード１１１を含んでいる。マネージメントアセンブリは中間バイトコード１０６とメタデータ１０７を含んでいる。メタデータ１０７は、アセンブリのようなエンティティ又はアセンブリの関数やメソッドのようなアセンブリの一部がランタイムにおいてコードを生成するかどうか、又はそれがキャッシュへの格納に適しているかを識別する特別な性質に関する情報を含む。一般にキャッシュへの格納に適しているプログラムはグローバルステートを混乱させない。そのようなエンティティは「純粋」又は「純粋関数」と呼ばれる。例えば、純粋関数はグローバルステート（ｇｌｏｂａｌ  ｓｔａｔｅ）を混乱させない。メタデータは生成した関数、動的コードの生成器へ渡される変数データ又は他の場所に組み込まれる。ソースアセンブリはソースアセンブリのキャッシュ１２２のようなソースアセンブリのキャッシュ（ライブラリ）において、維持される。
【００１６】
当技術分野において知られるように、何らかのアセンブリが実行されるとき、その実行されたアセンブリはメモリにロードされる。事前コンパイルされた実行ファイル（例えば、ＮＧＥＮ１１２のようなネイティブイメージジェネレータにより作成された実行ファイル）が利用できる場合、ネイティブバイナリをロードし、実行することは可能である。事前コンパイルされた実行ファイルが利用できない場合、ＪＴＩ又はオンザフライコンパイラ１１０は、メモリ中で、マネージドアセンブリ１０８を再使用できないネイティブバイナリ１１４に変換する。周知のシステムにおいて、プログラムそれ自身がネイティブバイナリの様式に事前コンパイルされたとしても、ランタイムでプログラムにより生成されるコードは、プログラムが実行されるときはいつでも、再コンパイルされなければならない。追加のプログラムコードを生成するレフレクションエミットのような機能は呼び出される(例を挙げると、レフレクションエミットは、アセンブリのメタデータに記録された追加の情報を使用して、ランタイム中に生成した中間バイトコード１１１のような中間バイトコードを生成させる。)。ランタイム中に生成した中間バイトコード１１１が生成し、ＪＩＴ又はオンザフライコンパイラは、ランタイムで生成した中間バイトコードを再使用できない実行可能なネイティブバイナリ１１４（マシンコード）に変換する。
【００１７】
対照的に、本明細書で開示された主題の態様に関して、ランタイム時に生成したコードを、ある状況においては、キャッシュすることができる（例として、中間バイトコードのキャッシュ１０９および／又は再利用可能な（マシンコード）実行ファイルのキャッシュ１２２において）。例えば、プログラムは、ランタイム時において追加コードを生成させる純粋の関数を含んでいると仮定する。純粋の関数は、本明細書では、グローバルステートを混乱させない関数のことを言う。関数Ａは２つの変数、変数ａと変数ｂとをとると仮定する。変数ａ＝値１とともに関数Ａが呼び出され、また変数ｂ＝値２についても同様である。それゆえ、その変数の特別な値のメソッド又はそのメソッドの変数（実行に特有の特性）生成し、生成した中間コードのキャッシュするランタイムコードのための特別な個性を生成することにより、その関数の次の呼び出しにおける中間言語の生成を省略できる。
【００１８】
それゆえ、最初にその関数は実行されるときに、中間言語を生成し、識別しキャッシュすることができる。２回目に、変数ａの値１と変数２の値２を使用することによりその関数は実行されるときに、中間コードはそれがキャッシュされていることにより、生成する必要がなくなる。中間コードは関数名により確認され、代わりに識別子に適合した変数値はキャッシュメモリから取り出される。さらに、ネイティブコードが中間コードから生成される場合（例として、ＮＧＥＮのようなバイナリネイティブイメージジェネレータを通して）マシンコードはマシンコードキャッシュから取り出され、中間コードの生成の必要および中間バイトコードからネイティブマシンコードの生成の必要性は除かれる。
【００１９】
よくある状況はテストされる可能性があり、一般に生成した中間バイトコードが生成し、そして／又はネイティブバイナリが生成し、事前にキャッシュすることができる。本明細書において開示された主題のいくつかの態様に関連して、中間バイトコードおよび／又はネイティブバイナリイメージがアセンブリにおける追加のメタデータとして含まれるため、最初にアセンブリがユーザーのマシンにおいて実行され、マシンすべてにわたる中間バイトコードのキャッシュおよび／又はネイティブバイナリのマシンコードのキャッシュが空であるときにおいても、アセンブリ自体の中に中間バイトコードおよび／又はネイティブバイナリを見つけることができる。本明細書において開示された主題のいくつかの態様に関連して、動的なコードが生成した関数で更新されたアセンブリは、アセンブリが破棄されるか又は未使用となる可能性があるため新しいバージョン番号および／又は以前のキャッシュの（更新されていないものかオリジナルの）情報を受け取る可能性がある。
【００２０】
図２ａは、当技術分野では周知のとおりランタイムで生成したコードのための方法を示している。２０２において動的プログラム（ランタイムで生成したコードを生成するプログラム）を包含しているソースコードは、図１に関して上に表記したようなコンパイラによりコンパイルされる。コンパイラの出力は、中間バイトコード及び中間バイトコードの生成と関連付けられたメタデータを包含しているアセンブリとなる。２０４において、アセンブリ実行の要求を受け取ることができる。２０６において、アセンブリをメモリにロードすることができる。２０８において、識別子のキーに基づく検索は、事前コンパイルされたネイティブバイナリの実行ファイルが利用できるか決定する。２１０において、ルックアップの処理はネイティブバイナリの実行ファイルが利用可能であり、ロードできネイティブバイナリの実行ファイルが実行できることを決定できる。２０８においてルックアップは事前コンパイルされたネイティブバイナリの実行ファイルが利用できないことを決定できる。
【００２１】
この決定に応答して、２１２ではＪＩＴ又はオンザフライコンパイラは中間バイトコードをネイティブバイナリにコンパイル又は変換し、そのバイナリをロードし実行する。２１４においては、事前コンパイルされようとＪＩＴコンパイルされようと、動的プログラムは実行する。２１６において、動的プログラムは、リフレクションエミットのような機能を呼び出すことにより実行されるため、追加のプログラムを生成する。このランタイムにおいて生成したコードは中間バイトコードとしてレフレクションエミットを呼び出すことにより生成する。そのランタイムで生成したコードが実行される前に、ＪＩＴ又はオンザフライコンパイラによりネイティブバイナリコードにコンパイルされなければならない。ランタイムで生成するコードの事前コンパイルは不可能であり、ランタイムで生成したコードについてのネイティブバイナリの実行ファイルを作成することはできない。
【００２２】
図２ｂは、この明細書に開示された主題の態様に関連する、ランタイム生成コードをキャッシュする方法の一例である。３０２において、動的プログラム又は動的メソッド又は関数のようなプログラムの一部のようなプログラムエンティティの生成の要求が受け取られる。その結果をキャッシュするのに適しているメソッドや関数は、グローバルステートを混乱させないものである。突然にグローバルステートを変更しないメソッドや関数は「純粋」（又は「純粋」関数）と呼ばれている。本明細書に開示された主題の態様に関して、そのようなメソッドや関数に対するインジケータは特別な性質である。３０４において、識別子は特定のアルゴリズムやスキーマにより計算され生成する。
【００２３】
例えば、関数Ａが２つの変数、変数ａおよび変数ｂを取ると仮定する。関数Ａが変数ａ＝値１および変数ｂ＝値２にともなって呼び出されたときに、変数ａ≠値１および変数ｂ≠値２で呼び出されたときに生成した中間コードと異なる中間コードが生成される。２番目に関数Ａが変数ａ＝値１および変数ｂ＝値２で呼び出されたときに生成した中間コードは、関数Ａが呼び出しの間に変化しなければ最初に関数Ａが変数ａ＝値１および変数ｂ＝値２で呼び出されたときと同じである。古いキャッシュが使えず自動的にフラッシュすることを確実にするために、ランタイムコードが生成した関数Ａの特定の性質が関数Ａの名前（例えば、“［Ｎａｍｅｓｐａｃｅ：：］ＯｂｊｅｃｔＮａｍｅ：：Ａ”）を生成し、特定の変数値（値１又は値２）に加えて関数Ａを有するアセンブリのストロング名（ｓｔｒｏｎｇ  ｎａｍｅ）を含んでいる。これは、この識別子におけるこの特定の変数値の使用は間違った中間コードの使用を防止し、関数Ａを有するアセンブリのストロング名の使用はアセンブリの間違ったバージョンの中間コードが使われないことを確実にするために用いられる（例えば、アセンブリ１は故意に旧関数Ａを呼び出すこととなり、アセンブリ２は故意に更新した関数Ａを呼び出すこととなる）。
【００２４】
３０６で、中間バイトコードのキャッシュのようなキャッシュは識別されたプログラムエンティティについて検査される。３０８で、計算された識別子が最初のキャッシュ（例えば、中間バイトコードのキャッシュ）において発見された場合、２番目のキャッシュは３３０において詳しく調べられる。２番目のキャッシュはネイティブバイナリコードのキャッシュである。３３２で、識別されたプログラムが２番目のキャッシュにおいて発見された場合、ネイティブコードは、それが中間バイトコードキャッシュのプログラムと同じバージョンかどうかを決定するために中間バイトコードキャッシュのルックアップの結果に対して検証され、３４６において、コードが最新であれば（例えば３４４で識別されたプログラムのエンティティのための中間バイトコードと同じバージョン）、ネイティブコードのバイナリはロードされ実行される。３３２で、識別されたプログラムエンティティが２番目の（ネイティブコードの）キャッシュ内で検出されなかった場合、３３４でネイティブコードは（ＪＩＴコンパイラ又はオンザフライコンパイラ、又は後のキャッシュのためのＮＧＥＮが実行されることによって）生成し、３３６においてロードされ実行され、ＮＧＥＮが実行されれば、３３８でキャッシュされる。
【００２５】
３０８で、中間バイトコードのプログラムが最初のキャッシュにおいて発見されない場合、３４０で中間コードが生成し（例えば、リフレクションエミットの起動により）、３４２でキャッシュに格納される。３４０での中間コード生成の後、２番目のキャッシュは３３０においてプログラムエンティティについて調べられる。２番目のキャッシュはネイティブバイナリコードのキャッシュとなる。３３２で識別されたプログラムエンティティが２番目のキャッシュにおいて発見された場合、ネイティブコードは３４４又は３４６の中間コードのキャッシュと同じバージョンかどうかの決定するための中間バイトコードのキャッシュのルックアップの結果に対して検証され、ネイティブコードが最新である場合（たとえば、識別されたプログラムエンティティのための中間バイトコードと同じバージョンに）、ネイティブコードのバイナリはロードされ実行される。３３２で、識別されたプログラムエンティティが２番目の（ネイティブコードの）キャッシュにおいて発見されない場合、ネイティブコードは（ＪＩＴコンパイラ又はオンザフライコンパイラ又は後のキャッシュの格納のためにＮＧＥＮが実行されることにより）３３４で生成し、３３６でロードされ実行され、ＮＧＥＮが実行されれば３３８でキャッシュされる。ネイティブバイナリコードのキャッシュはアセンブリ自体の中に存在するか、又はマシン全体にわたるキャッシュとなることができることが理解できるであろう。同様に、最初のキャッシュが中間バイトコードのキャッシュ又はソースアセンブリのキャッシュであろうことが理解できる。
【００２６】
本明細書に開示する主題の他の態様に関連して図２ｃを参照すると、３０６において、ネイティブバイナリコードのキャッシュのような最初のキャッシュは、識別されたプログラムエンティティについて検査される。３０８で、計算された識別子が最初のキャッシュ（例えば、ネイティブ２進コードのキャッシュメモリ）において検出された場合、３２４でネイティブバイナリコードのキャッシュから取り出され、ロードされ実行される。計算された識別子が最初のキャッシュ（例えば、ネイティブバイナリコードのキャッシュ）において検出されない場合、３１０で識別されたエンティティについてのルックアップを２番目のキャッシュ（例えば、中間バイトコードのキャッシュ）において行うことができる。３１２で、識別されたエンティティの中間コードが中間バイトコードのキャッシュにおいて発見された場合、中間バイトコードを読み出すことができ、３１４でネイティブコードに変換／コンパイルすることができる。任意にネイティブコードはキャッシュに格納することができる。３１６でネイティブコードをロードし、実行することができる。識別されたエンティティについての中間バイトコードが中間バイトコードのキャッシュから発見されない場合、中間バイトコードは（例えば、リフレクションエミットの起動により）生成することができ、３１８で生成した中間バイトコードを、３２０でキャッシュし、３２２でロードし実行することができる。ネイティブバイナリコードのキャッシュはアセンブリ自体の中に存在させる、又はマシン全体に渡るキャッシュとすることができることを認識されたい。同様に、最初のキャッシュが中間バイトコードのキャッシュ又はソースアセンブリのキャッシュとなり、逆もまた同様であると認識されたい。
【００２７】
適切なコンピューティング環境の例
本明細書で開示された主題の様々な態様の状況を提供するために、図３とそれに続く詳解は様々な実施例が実行に移されるだろう適切なコンピューティング環境５１０の短い全体的な説明を提供することが意図される。本明細書に開示された主題は、プログラムモジュールのようなコンピュータの実行の命令の全体的な状況において説明され、一以上のコンピュータ又は他のコンピューティングデバイスによって実行されるが、当業者は本明細書に開示された主題の一部が他のプログラムモジュールとの組み合わせおよび／又はハードウェアとソフトウェアとの組み合わせにおいても実現することができることが認識できるであろう。一般的にプログラムモジュールは、特有なタスクを行ったり特有なデータタイプを実現したりする、ルーチン、プログラム、オブジェクト、物理的な中間性生物、データ構造などを含む。典型的には、プログラムモジュールの機能性は様々な実施例の要求に結合し又は分配される。コンピューティング環境５１０は適切な操作環境の一例に過ぎず、本明細書に開示された主題の使用又は機能の範囲に限定されることを意図するものではない。
【００２８】
図３を引用して、コンピュータ５１２の形態の汎用コンピューティングデバイスが説明される。コンピュータ５１２は処理ユニット５１４、システムメモリ５１６、システムバス５１８を含んでいる。処理ユニット５１４は様々な処理に利用できる。デュアルマイクロプロセッサや他のマルチプロセッサのアーキテクチャもまた処理ユニット５１４として使用できる。システムメモリ５１６は揮発性メモリ５２０と不揮発性メモリ５２２を含んでいる。不揮発性メモリ５２２はＲＯＭ（Ｒｅａｄ  ｏｎｌｙ  ｍｅｍｏｒｙ）、ＰＲＯＭ（ｐｒｏｇｒａｍａｂｌｅ  ＲＯＭ）、ＥＰＲＯＭ（ｅｌｅｃｔｒｉｃａｌｌｙ  ｐｒｏｇｒａｍａｂｌｅ  ＲＯＭ）、又はフラッシュメモリを含んでいる。不揮発性メモリ５２０は外部のキャッシュメモリとして作動するＲＡＭ（ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍｅｍｏｒｙ）を含んでいる。システムバス５１８はシステムメモリ５１６を含むシステムの物理要素を処理ユニット５１４に結合させる。システムバス５１８はメモリバス、メモリコントローラ、周辺機器バス、外部バス又はローカルバス等を含むいくつかのタイプとすることができ、多様な使用可能なバスアーキテクチャの使用ができる。
【００２９】
コンピュータ５１２は通常の揮発性又は不揮発性の媒体、取り外し可能又は不可能なメディアのようなコンピュータ可読のさまざまなメディアを含んでいる。コンピュータ記録媒体はコンピュータ可読の命令、データ構造、プログラムモジュールおよび他のデータのような情報の記録のためのどの方法又は技術によっても実現できる。コンピュータ記録媒体は、ＲＡＭ、ＲＯＭ、ＥＰＲＯＭ、フラッシュメモリその他のメモリ技術、ＣＤＲＯＭ、ＤＶＤ（ｄｉｇｉｔａｌ  ｖｅｒｓａｔｉｌｅ  ｄｉｓｋｓ）や他の光ディスク記録、時期カセット、磁気テープ、磁気ディスク又は他の磁気記録装置、又は他の目的とする情報の記録に使用でき、コンピュータ５１２にアクセスできる媒体を含むが、それに限定されない。
【００３０】
図３がユーザーとコンピュータリソースとの間で作動することのできるソフトウェアを説明していることは認識できるであろう。このソフトウェアはディスクストレージ５２４に記録することができ、コンピュータ５１２のリソースを管理し配置することのできる操作システム５２８を含んでいる。ディスクストレージ５２４はインターフェース５２６のような取り外し不可能なメモリのインターフェースを通してシステムバス５１８と接続されたハードディスクドライブとなる。システムアプリケーション５３０は、システムメモリ５１６又はディスクストレージ５２４双方に記録されたプログラムモジュール５３２およびプログラムデータ５３４を通してオペレーティングシステム５２８による資源の管理の利益を享受できる。コンピュータはさまざまなオペレーティングシステムの組み合わせにより実現できることが認識できるであろう。
【００３１】
ユーザーはインプットデバイス５３６を通してコマンドや情報をコンピュータ５１２に入力できる。インプットデバイス５３６は、マウス、トラックボール、タッチペン、タッチパッド、キーボード、マイクロホンおよび同類のもののようなポインティングデバイスが含まれるがそれに限定されない。これらおよび他のインプットデバイスは処理ユニット５１４とシステムバス５１８を通してインターフェースポート５３８を用いて接続する。アウトプットアダプター５４２はアウトプットデバイス５４０とシステムバス５１８の間の接続を提供するビデオカードやサウンドカードを含むがそれに限定されない。他のデバイスおよび／又はリモートコンピュータ５４４のようなシステム又はデバイスはインプットおよびアウトプットの機能を提供するであろう。
【００３２】
コンピュータ５１２はネットワーク環境において、リモートコンピュータ５４４のような１以上のリモートコンピュータとの理論接続を使用して動作できる。リモートコンピュータ５４４はパーソナルコンピュータ、サーバー、ルーター、ネットワークＰＣ、ピアデバイス又は他の一般的なネットワークノードとすることができ、上述のコンピュータ５１２と関係する多くの又はすべての要素を一般的に含むが、図３にはメモリストレージ５４６のみが記されている。リモートコンピュータ５４４は通信接続５５０を介して理論的に接続することができる。ネットワークインターフェース５４８はＬＡＮやＷＡＮのような通信ネットワークを含んでいるが、また、他のネットワークも含む可能性がある。通信接続５５０はネットワークインターフェース５４８とシステムバス５１８の接続に使用するハードウェア／ソフトウェアのことを言う。接続５５０はコンピュータ５１２の内部又は外部にでき、モデム（電話、ケーブル、ＤＳＬおよび無線）やＩＳＤＮアダプター、イーサーネットカード等の内部および外部の技術を含んでいる。
【００３３】
示されたネットワークの接続はほんの一例であり、コンピュータ間の通信リンクの構成の他の方法が使用できることは認識できるであろう。当業者は、コンピュータ５１２や他のクライアントデバイスをコンピュータネットワークの一部として配置することができることが認識できる。これに関して、本明細書に開示された主題は多くのメモリやストレージユニットを有するコンピュータシステム、又は多くのストレージユニット又はボリュームに生成したアプリケーションやプロセスに関係するであろう。本明細書に開示された主題の態様はネットワーク環境において敷かれたサーバーコンピュータとクライアントコンピュータを有する環境に適用するであろう。本明細書に開示された主題の態様は、また、プログラミング言語の機能、つまり通訳又は実行機能を有している、単独型コンピューティングデバイスに適用するであろう。
【００３４】
図４は、統合開発環境（ＩＤＥ）６００および共通言語ランタイム環境６０２を示している。ＩＤＥ６００はユーザー（例えば、ディベロッパー、プログラマー、デザイナー）に、コンピュータシステムにおける設計、コード化、コンパイル、テスト、ラン、編集、プログラムのデバッグおよびビルド、プログラム、ウエブサイト、ウエブアプリケーションおよび他のウエブサービスのセッティングを許可する。ソフトウェアのプログラムはソースコード（コンポーネント６１０）を含むが、そのソースコードは一以上のソースコード言語（例えば、Ｖｉｓｕａｌ  Ｂａｓｉｃ、Ｖｉｓｕａｌ  Ｊ＃、Ｃ＋＋、Ｃ＃、Ｊａｖａ  Ｓｃｒｉｐｔ、ＡＰＬ、ＣＯＢＯＬ、Ｐａｓｃａｌ、Ｅｉｆｆｅｌ、Ｈａｓｋｅｌｌ、ＭＬ、Ｏｂｅｒｏｎ、Ｐｅｒｌ、Ｐｙｔｈｏｎ、Ｓｃｈｅｍｅ、Ｓｍａｌｌｔａｌｋ等）をにおいて作成される。ＩＤＥ６００はネイティブコードの開発環境を提供するか、バーチャルマシン上で実行するマネージドコードの開発を提供するか、又はその組み合わせを提供する。ＩＤＥ６００は．ＮＥＴフレームワークで使用するマネージドコード開発環境を提供する。中間言語コンポーネント６５０は言語特有のソースコンパイラ６２０を使用してソースコードコンポーネント６１０とネイティブコードコンポーネント６１１から作成され、ネイティブコードコンポーネント６１１（例えば、マシンの実行可能命令）は中間言語コンパイラ６６０（例えば、ＪＩＴコンパイラ）を使用して、アプリケーションが実行されるときに中間言語コンポーネント６５０から作成される。すなわち、中間言語アプリケーションが実行されたとき、中間言語アプリケーションは、それが実行されているプラットホームのための適切なマシン言語が実行されているときにコンパイルされ、それによっていくつかのプラットホーム中に移植できるコードを作ることができる。あるいは、他の実施例において、プログラムはそれが意図するプラットホームにふさわしいネイティブコードのマシン言語（表示していない）にコンパイルされる。
【００３５】
ユーザーは、ＩＤＥ６００の中のユーザーインターフェース６４０とソースコードエディタ６５１を介して特別なソース言語と結びついたソフトウェアプログラミングの技術および特別な理論上および構文上の法則を知ることにより、ソースコードコンポーネントを作成および／又は編集できる。その後、ソースコンパイラ６２０を介してソースコードコンポーネント６１０をコンパイルすることができ、それにしたがって、プログラムの中間言語表現は、アセンブリ６３０のように創造される。アセンブリ６３０は中間言語コンポーネント６５０とメタデータ６４２を含んでいる。アプリケーションの設計は開発前に有効にできるであろう。
【００３６】
本明細書において説明された様々な技術はソフトウェア又はハードウェアとの結合により、また必要な場合には双方の結合により、実現されるであろう。それゆえ、本明細書において説明された方法および機器又はある実施例又はそれに関する一部は、フロッピーディスク、ＣＤ−ＲＯＭ、ハードデバイス、又は他のマシンで読み取り可能な記録媒体のような実際の媒体において具体化されたプログラムコードの形式（すなわち命令）をとり、そこで、プログラムのコードがコンピュータのようなマシンに読み込まれ、実行されたとき、そのマシンは、本明細書において開示された主題の態様を実現する装置となる。プログラム制御可能なコンピュータでのプログラムコードの実行について言えば、コンピューティングデバイスは概してプロセッサ、プロセッサで読み取り可能な記録媒体（揮発性および不揮発性のメモリ、および／又は記録要素を含んでいる）、少なくともひとつのインプットデバイス、そして少なくともひとつのアウトプットデバイスを含んでいる。一以上のプログラムは領域特化型のプログラムモデルの態様の創造又は実現を利用できる。たとえば、１以上のプログラムは、データ処理用のＡＰＩ又は同種のものの使用を通して、高水準のプログラミング言語又はオブジェクト指向のプログラミング言語において実装され、コンピュータシステムを用いて通信する。しかしながら、そのプログラムは、必要に応じてアセンブリ又はマシン言語中でコンパイルされるであろう。どんな場合でも、その言語はコンパイル又は変換され、ハードウェアの実現と結びつくであろう。
【００３７】
本明細書に開示された主題が図との関係で説明される一方で、変更されたものであっても、異なる方法で同様の機能を実行できるであろう。
【図１】
0005518085.tif 000002
【図２ａ】
0005518085.tif 000003
【図２ｂ】
0005518085.tif 000004
【図２ｃ】
0005518085.tif 000005
【図３】
0005518085.tif 000006
【図４】
0005518085.tif 000007