(57)【要約】      （修正有）【課題】コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築する際、実行可能なコンポーネント・コードが不必要に再生成および再コンパイルされないようにする。【解決手段】ソースコードをコンパイルするリクエストを受信したとき、各ソースコード・コンポーネントに対して署名を抽出するステップ３０６と、ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスに対応して格納されている署名を検索するステップ３０８と、抽出された署名を格納されている署名と比較するステップ３１０と、抽出された署名が格納されている署名と一致しない場合、ソースコード・コンポーネントを実行可能なコードにコンパイルするステップ３１２と、抽出された署名が格納されている署名と一致する場合、ソースコード・コンポーネントに対して実行可能なコードをリポジトリから獲得するステップ３１４とを含む。【選択図】図３
2010267264.tif 000002
【特許請求の範囲】
【請求項１】
コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築する方法であって、
コンピュータシステムで仕事を遂行するコンパイラが、前記コンポーネント・ベース・アプリケーションに対するソースコードをコンパイルするようにとのリクエストを受信するステップを含み、前記リクエストが前記ソースコードを特定し、前記ソースコードが複数のソースコード・コンポーネントからなり、前記複数のソースコード・コンポーネントの各々が前記アプリケーションの異なるコンポーネントを実装し、
さらに、前記コンパイラが前記複数のソースコード・コンポーネントの各ソースコード・コンポーネントに対して一連のステップを実行するステップを含み、該一連のステップが
前記ソースコード・コンポーネントに対して抽出された署名を抽出するステップと、
前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスに対応して格納されている署名を検索するステップと、
前記抽出された署名を前記格納されている署名と比較するステップと、
前記ソースコード・コンポーネントを、前記格納されている署名と一致しない前記抽出された署名に対応する前記実行可能なコードにコンパイルするステップと、
前記抽出された署名が前記格納されている署名と一致する場合、前記ソースコード・コンポーネントの前記実行可能なコードをリポジトリから獲得するステップと、
を含む方法。
【請求項２】
前記抽出された署名は前記ソースコードに関連したメタデータから抽出され、前記格納されている署名は、前バージョンのソースコードに関連したメタデータから以前に抽出されたものであり、該前バージョンのソースコードからは、前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスが生成されたものである、請求項１に記載の方法。
【請求項３】
前記ソースコードに関連した前記メタデータが前記ソースコードの１つ以上の設定パラメータを取り込み、前記前バージョンのソースコードに関連した前記メタデータが、前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスの１つ以上の設定パラメータを取り込む、請求項２記載の方法。
【請求項４】
前記抽出した署名は拡張マークアップ言語文書であり、前記ソースコードの前記１つ以上の設定パラメータを取り込み、前記格納されている署名も拡張マークアップ言語文書であり、前記前バージョンのソースコードの前記１つ以上の設定パラメータを取り込む、請求項３記載の方法。
【請求項５】
前記ソースコードに関連した前記メタデータ中、コンパイル時に評価可能な１つ以上の定数式が実行時にロードされるプレース・ホルダによって置き換えられる、請求項３記載の方法。
【請求項６】
前記リポジトリにおいて、前記格納されている署名が、前記ソースコード・コンポーネントに対する前記現在利用可能な実行可能コードのインスタンスに関連している、請求項１記載の方法。
【請求項７】
前記リポジトリは、コードと、前記複数のソースコード・コンポーネントにおける各ソースコード・コンポーネントの署名とを保持する、請求項６記載の方法。
【請求項８】
前記ソースコード・コンポーネントが入力データに対して演算を行う演算子である、請求項１記載の方法。
【請求項９】
前記ソースコード・コンポーネントが入力データに対して演算を行う１つ以上の演算子を受け入れるコンテナである、請求項１記載の方法。
【請求項１０】
コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築する実行可能プログラムを含むコンピュータ可読の記憶媒体であって、該プログラムは
コンピュータシステムで仕事を遂行するコンパイラが、前記コンポーネント・ベース・アプリケーションに対するソースコードをコンパイルするようにとのリクエストを受信するステップを含み、前記リクエストが前記ソースコードを特定し、前記ソースコードが複数のソースコード・コンポーネントからなり、前記複数のソースコード・コンポーネントの各々が前記アプリケーションの異なるコンポーネントを実装し、
さらに、前記コンパイラが前記複数のソースコード・コンポーネントの各ソースコード・コンポーネントに対して一連のステップを実行するステップを含み、該一連のステップが
前記ソースコード・コンポーネントに対して抽出された署名を抽出するステップと、
前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスに対応して格納されている署名を検索するステップと、
前記抽出された署名を前記格納されている署名と比較するステップと、
前記ソースコード・コンポーネントを、前記格納されている署名と一致しない前記抽出された署名に対応する前記実行可能なコードにコンパイルするステップと、
前記抽出された署名が前記格納されている署名と一致する場合、前記ソースコード・コンポーネントの前記実行可能なコードをリポジトリから獲得するステップと、
を含むコンピュータ可読の記憶媒体。
【請求項１１】
前記抽出された署名は前記ソースコードに関連したメタデータから抽出され、前記格納されている署名は、前バージョンのソースコードに関連したメタデータから以前に抽出されたものであり、該前バージョンのソースコードからは、前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスが生成されたものである、請求項１０記載のコンピュータ可読の記憶媒体。
【請求項１２】
前記ソースコードに関連した前記メタデータが前記ソースコードの１つ以上の設定パラメータを取り込み、前記前バージョンのソースコードに関連した前記メタデータが、前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスの１つ以上の設定パラメータを取り込む、請求項１１記載のコンピュータ可読の記憶媒体。
【請求項１３】
前記抽出した署名は拡張マークアップ言語文書であり、前記ソースコードの前記１つ以上の設定パラメータを取り込み、前記格納されている署名も拡張マークアップ言語文書であり、前記前バージョンのソースコードの前記１つ以上の設定パラメータを取り込む、請求項１２記載のコンピュータ可読の記憶媒体。
【請求項１４】
前記ソースコードに関連した前記メタデータ中、コンパイル時に評価可能な１つ以上の定数式が、実行時にロードされるプレース・ホルダによって置き換えられる、請求項１２記載のコンピュータ可読の記憶媒体。
【請求項１５】
前記リポジトリにおいて、前記格納されている署名が、前記ソースコード・コンポーネントに対する前記現在利用可能な実行可能コードのインスタンスに関連している、請求項１０記載のコンピュータ可読の記憶媒体。
【請求項１６】
前記リポジトリは、コードと、前記複数のソースコード・コンポーネントにおける各ソースコード・コンポーネントの署名とを保持する、請求項１５記載のコンピュータ可読の記憶媒体。
【請求項１７】
前記ソースコード・コンポーネントが入力データに対して演算を行う演算子である、請求項１０記載のコンピュータ可読の記憶媒体。
【請求項１８】
前記ソースコード・コンポーネントが入力データに対して演算を行う１つ以上の演算子を受け入れるコンテナである、請求項１０記載のコンピュータ可読の記憶媒体。
【請求項１９】
コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築するコンパイラであって、
前記コンポーネント・ベース・アプリケーションに対するソースコードをコンパイルするようにとのリクエストを受信する入力を含み、前記リクエストが前記ソースコードを特定し、前記ソースコードが複数のソースコード・コンポーネントからなり、前記複数のソースコード・コンポーネントの各々が前記アプリケーションの異なるコンポーネントを実装し、
さらに、前記入力に連結され、前記複数のソースコード・コンポーネントの各ソースコード・コンポーネントに対して一連のステップを実行する複数の要素を含み、前記複数の要素が
前記ソースコード・コンポーネントに対して抽出された署名を抽出する署名比較部と、
前記ソースコード・コンポーネントに対して既に生成された実行可能なコードのインスタンスに対応して格納された署名を格納する署名データベースと、
前記署名が前記格納されている署名と一致しない場合、前記ソースコード・コンポーネントを前記実行可能なコードにコンパイルし、前記ソースコード・コンポーネントの前記実行可能なコードをリポジトリから獲得するコード生成部と、
を含むコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
政府機関の財政的支援への言及
本発明は、米国国防省による契約Ｈ９８２３０−０７−Ｃ−０３８３の下で、政府の助成を受けて完成されたものである。政府は、本発明に対して一定の権利を有する。
【０００２】
本発明は、概してコンポーネント・ベース・コード生成に関し、より詳細には、コンポーネント・ベース・アプリケーションを構築するための逐次添加法（incremental method）に関する。 
【背景技術】
【０００３】
コンポーネント・ベース・アプリケーションは、相互接続した複数の機能コンポーネント、すなわち演算子を使用し構築されるアプリケーションである。この文脈で、コンポーネントは小さなコード片であり、データ変換、フィルタリング、注記、分類、逆多重化、分流などの汎用演算を実行する。２つのコンポーネントは、潜在的に無限量のデータを有するストリームを通じて交信可能である。コンポーネントは、ある規定シーケンスに従うよう、既に定義されている方法でこのデータに対して作動し、出力を生じる。
【０００４】
一般的に、これらコンポーネントの各々は、コード生成およびコードコンパイルを伴う二段階プロセスにしたがって構築される。コード生成ステップでは、アプリケーションの宣言的記述から実行可能なコードが生成される。具体的に、特定クラスのコンポーネントを考えると、コード生成は、そのクラスに対応するコード・ジェネレータの呼び出しを伴い、そのコンポーネントにとって適切な設定パラメータをコード・ジェネレータに提供する。コード・ジェネレータは、そのコンポーネント向け汎用プログラミング言語（例えば、ＣまたはＣ＋＋プログラミング言語)で特殊コードを生成する。コードコンパイルステップでは、その特殊コードが、対象プラットホーム(例えば、インテルX86命令セット・アーキテクチャベースのコンピュータ)で実行可能なオブジェクト・コードにコンパイルされる。生成またはコンパイルステップ、あるいは両ステップを編成するために、通常汎用ビルドツールが使用される。そのようなビルドツールの例として、「ｍａｋｅ」、「ｇｎｕｍａｋｅ」、「ｎｍａｋｅ」、「ＪＡＭ」および「ａｎｔ」ツールがある。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ある場合には、コンポーネント・ベース・アプリケーションの宣言的記述を含むファイルが変わるかもしれない。その結果、アプリケーションと関連するコンポーネントの一部も変わる可能性があり、それらコンポーネントの再生成が必要となる。従来のビルドツールは、コードが変わったかどうかを判定するのにタイム・スタンプデータを当てにし、コンポーネント全てのコードを再生成すると共に、再生成されたコードを全面的にコンパイルし直す。このように、タイム・スタンプがオブジェクト・コードのものより新しいという理由だけで、事実上変更されていない（例えば、データ処理方法が変更されていない）コンポーネントに対してまでもコードが再生成され、コンパイルし直される。
【課題を解決するための手段】
【０００６】
コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築する方法の一実施形態は、コンポーネント・ベース・アプリケーションに対するソースコードをコンパイルするようにとのリクエストを受信するステップを含み、そのリクエストがソースコードを特定し、ソースコードが複数のソースコード・コンポーネントからなり、ソースコード・コンポーネントの各々がアプリケーションの異なるコンポーネントを実装し、さらに、各ソースコード・コンポーネントに対して一連のステップを実行するステップを含み、前記一連のステップは、ソースコード・コンポーネントに対して署名を抽出するステップと、ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスに対応して格納されている署名を検索するステップと、抽出された署名を格納されている署名と比較するステップと、抽出された署名が格納されている署名と一致しない場合、ソースコード・コンポーネントを実行可能なコードにコンパイルするステップと、抽出された署名が格納されている署名と一致する場合、ソースコード・コンポーネントに対して実行可能なコードをリポジトリから獲得するステップとを含む。
【０００７】
すなわち、上記された本発明の特徴が詳細に理解され得るように、実施形態を参照して発明のより詳細な説明がなされ、その一部が添付図面に示される。しかしながら、添付図面は本発明の典型的な実施形態のみを図解するものであり、発明の範囲を制限するものと見なすべきではない。なぜならば、本発明はその他同等に有効な実施形態を含む余地があるためである。
【図面の簡単な説明】
【０００８】
【図１】本発明による利益を享受する第１の典型的なコンポーネント・ベース・アプリケーションを示すブロック図である。
【図２】本発明に係わるコンパイラの一実施形態を示すブロック図である。
【図３】本発明に係わり、コンポーネント・ベース・アプリケーションのコードを生成する方法の一実施形態を示すフローチャートである。
【図４】本発明による利益を享受する第２の典型的なコンポーネント・ベース・アプリケーションを示すブロック図である。
【図５】汎用計算装置を用いて実現されるコード生成方法のハイレベルなブロック図である。
【発明を実施するための形態】
【０００９】
一実施形態において、本発明は、コンポーネント・ベース・アプリケーションを逐次構築する方法および装置である。本発明の実施形態は、メタデータを用いた署名手法を用い、実行可能なコンポーネント・コードが不必要に再生成および再コンパイルされないようにする。特に、メタデータは、アプリケーションの各コンポーネントを定義する構成を記述するために用いられる。各コンポーネントのメタデータから署名が算出され、コード・リポジトリでそのコンポーネントに対して生成された実行可能なコードに関連してその署名が保持される。コード生成時には、コード・リポジトリが検索され、新しいコードが生成されるコンポーネントに対応して格納されたコードがある場合には、その格納されたコードに対応する署名が検索される。格納されたコードの署名が、新しいコードのために算出された署名と異なる場合、そのコンポーネントのコードは、新しいコードにしたがって再生成される。一方、署名に違いがないなら、そのコンポーネントのコードが再生成されることはない。
【００１０】
図１は、本発明による利益を享受する第１の典型的なコンポーネント・ベース・アプリケーション１００を示すブロック図である。特に、この典型的なコンポーネント・ベース・アプリケーション１００は、ストリーム処理アプリケーションである。しかしながら、本発明は、実質的にいかなるタイプのコンポーネントー・ベース開発の枠組みでも用いることができ、ストリーム処理アプリケーションに限定されることはない。
【００１１】
アプリケーション１００は、ストリームによって互いに接続される複数のコンポーネント、すなわち「演算子」１０２１−１０２ｎ（以下、集合的に演算子１０２と称する）からなる。演算子１０２は、入力ストリーミング・データ１０４に対して演算を行い、その演算結果を（可能なかぎりは、同様にストリーム形式で）データベース１０６に出力するように構成される。
【００１２】
一実施形態において、演算子１０２の各々は、以下に示す複数の候補タイプの一つである。すなわち、Source（例えば、演算子１０２１で外部データ・ソースからデータを読み込むのに使用される）、Functor（例えば、演算子１０２２、１０２３、１０２６および１０２７で、フィルタリング等、ストリーミング・データに対する基本的なデータ変換を実行するために使用される)、Aggregate（例えば、演算子１０２４で、ストリーミング・データを論理的にグループ化し要約するために使用される）、Join（例えば、演算子１０２５で、２つのストリームを関連付けるために使用される）、Sink（例えば、演算子１０２ｎで、データを外在化するために使用される）のいずれかであるが、それらに限定されるわけではない。演算子１０２の各々は、それぞれ個別な方法で構成できる。すなわち、各演算子１０２は、個別のタイプで構成可能なコンポーネントである。そのため、各演算子１０２は、ストリーム処理アプリケーション１００の文脈中で「演算子インスタンス」とも称される。
【００１３】
例えば、典型的なアプリケーション１００は、ライブの株式市況フィードなど、金融データストリームを処理するように構成されているかもしれない。そのようなアプリケーションでは、Source演算子１０２１が、入力データストリーム１０４からの入力を読み取り、この入力を第１および第２のFunctor演算子１０２２および１０２３に渡す。第１のFunctor演算子１０２２は取引を通し、入力データストリームから出来高価格を算出し、一方第２のFunctor演算子１０２３は入力データストリームから株価を渡す。そして、取引および出来高価格が第１のFunctor演算子１０２２からAggregate演算子１０２４に渡され、Aggregate演算子１０２４が入力データストリームの中の各株価ティッカあるいはシンボルの移動平均を算出する。そして、Aggregate演算子１０２４は、その移動平均を第３のFunctor演算子１０２６に渡し、第３のFunctor演算子１０２６が入力データストリーム中の株式の出来高加重平均価格（ＶＷＡＰ）を算出する。Joint演算子１０２５は、株価を第２のFunctor演算子１０２３から受け取り、出来高加重平均価格を第３のFunctor演算子１０２６から受け取り、バーゲン指標を算出する。そして、Joint演算子１０２５はそのバーゲン指標を第４のFunctor演算子１０２７に渡し、第４のFunctor演算子１０２７は、ゼロ値バーゲン指標でメッセージの量を減らしてそのデータをSink演算子１０２ｎに渡す。Sink演算子１０２ｎは結果をデータベース１０６に書き込む。
【００１４】
上述したように、典型的なアプリケーション１００のようなストリーム処理アプリケーションをコンパイルすることは、そのアプリケーションの論理的記述から実行可能なコードを生成することを伴う。特定種類の演算子インスタンスを考えると、コード生成は、対応するコード・ジェネレータの呼び出しと、そのコード・ジェネレータへの適切な設定パラメータの提供を伴う。コード・ジェネレータは、汎用プログラミング言語（例えば、ＣやＣ＋＋プログラミング言語）でその演算子インスタンスの特殊コードを生成する。そして、生成されたコードは、対象プラットホームで実行可能なオブジェクト・コードにコンパイルされる。一般に、「ｍａｋｅ」ツールなど汎用ビルドツールを用いてコンパイルが実行される。
【００１５】
例えば、高水準プログラミング言語で表された以下に示す２つの典型的なFunctor演算子インスタンスを考える。ここでは、２つのFunctor演算子を用い、ＴｒａｄｅＱｕｏｔｅと呼ばれるプライマル・ストリームから入来するデータを処理することにより新しいストリーム（ＴｒａｄｅＦｉｌｔｅｒおよびＱｕｏｔｅＦｉｌｔｅｒ）を生成する。これらの例は、以下に示すように、ＳＰＡＤＥプログラミング言語で記述されている。詳細は、Ｇｅｄｉｋ他、「SPADE: The System SDeclarative Stream Processing Engine」、SIGMOD Conference2008、1123-1134に記載されている。
【数１】
2010267264.tif 000003
【数２】
2010267264.tif 000004
例１および例２は、対応するFunctor演算子インスタンスの宣言的記述を高水準プログラミング言語に翻訳したものを表す。
【００１６】
例１および例２における２つのFunctor演算子インスタンスは、違った方法で明確に設定される。具体的には、各演算子インスタンスが生成しているストリームのスキーマは異なる（つまり、ＱｕｏｔｅＦｉｌｔｅｒのスキーマ対ＴｒａｄｅＦｉｌｔｅｒのスキーマ）。また、フィルタリング条件（ｔｔｙｐｅ＝”Ｔｒａｄｅ”＆  ｖｏｌｕｍｅ＞０．０  ｖｅｒｓｕｓ  ｔｔｙｐｅ＝”Ｑｕｏｔｅ”  ＆  ａｓｋｐｒｉｃｅ＞０．０）など、パラメータの一部が異なる（つまり、結果としてそれぞれが生じたストリーム・メッセージが異なり、例１では、入力タプルの属性値に基づきｍｙｖｗａｐと称する新しいメッセージ属性が算出される）。また、属性割り当ても異なる。すなわち、Functor演算子インスタンスに関連したコード・ジェネレータがこれら２つのFunctor演算子インスタンスに対して異なるコードを生成することを意味する。
【００１７】
図２は、本発明に係わるコンパイラ２００の一実施形態を示すブロック図である。図２の文脈では、以下詳述するように、「コンパイラ」と称する構成要素がコード生成とコンパイルの両方を実行する。コンパイラ２００は、例えば、図１に示すコンポーネント・ベース・アプリケーションなどのコンポーネント・ベース・アプリケーションのコンポーネントまたは演算子インスタンスのコードを生成するように実装される。図示するように、コンパイラ２００は予定された演算子インスタンス（例えば、ストリーム処理アプリケーションの文脈におけるストリーム・スキーマやフィルタリング述部など）の設定パラメータ２０２を受け取り、その予定された演算子インスタンスに対応するオブジェクト・コードを出力する。コンパイラ２００の構成は、ハードウェアであっても、ソフトウェアであっても、あるいはそれらの組み合わせであってもよい。コンパイラ２００は、署名コンパレータ、署名データベース、コード・ジェネレータなど、複数の要素からなる。コンパイラ２００の一実施例が、本発明によって構成されるSPADEプログラミング言語コンパイラである。
【００１８】
図示するように、コンパイラ２００は、署名比較エンジン２０６、リポジトリすなわち署名データベース２０８、複数のコード生成部２１０１−２１０ｎ（以下、まとめて「コード生成部２１０」とする）、バックエンド２１２からなる。コンパイラ２００が、コンポーネント・ベース・プログラムの予定された演算子インスタンスに対する設定パラメータ２０２を受けると、設定パラメータ２０２が署名比較処理部２０６に渡される。図３で詳述されるように、署名比較処理部２０６は、設定パラメータ２０２から予定された演算子インスタンスの署名を抽出する。そして、署名比較エンジン２０６は、抽出した署名と既に生成され格納されている演算子インスタンスの署名とを比較する。格納されている署名は署名データベース２０８から検索される。
【００１９】
署名比較に基づき、予定された演算子インスタンス（Source, Functor, Aggregate, Join, Sinkなど）に対して実行可能なコードを生成すべきと判断した場合、署名比較処理部２０６は、予定された演算子インスタンスで表された演算子タイプに対応するコード・ジェネレータ２１０に設定パラメータ２０２を渡す。コード・ジェネレータ２１０は、その演算子インスタンスに対し汎用プログラミング言語で特殊コードを生成し、その特殊コードをバックエンド・コンパイラ（ＣまたはＣ＋＋プログラミング言語コンパイラ）２１２に渡す。バックエンド・コンパイラ２１２は特殊コードを対象機２０４で実行可能なオブジェクト・コードにコンパイルし、そのオブジェクト・コードを対象機２０４に提供する。
【００２０】
図３は、本発明に係わり、コンポーネント・ベース・アプリケーションのコードを生成するメソッド３００の一実施形態を示すフローチャートである。例えば、図２に示すコンパイラ２００の署名比較処理部２０６によってメソッド３００が実施される。また、例えば、コンポーネント・ベース・アプリケーションが変更されコンパイラが再起動される時にメソッド３００が実施される。
【００２１】
メソッド３００はステップ３０２で初期化され、ステップ３０４に進む。ステップ３０４で、メソッド３００は、コンポーネント・ベース・アプリケーションのコードを再生成するよう指示を受ける。このように、アプリケーション中で予定されたバージョンの少なくとも１つの演算子インスタンスに対してコードを生成するよう指示される。ここでは、その演算子インスタンスが現行バージョンのアプリケーションに存在している。
【００２２】
ステップ３０６で、メソッド３００は、予定されたバージョンの演算子インスタンスの署名を抽出する。一実施形態において、その署名は拡張マークアップ言語（XML）文書であり、その予定されたバージョンの演算子インスタンスの設定パラメータを取り込む。この例では、その署名が設定パラメータを表し、ある演算子の修正可能な諸相を特定の設定にするために用いられる。このように、その署名により、異なるコードの生成を引き起こすすべての関連演算子パラメータが取り込まれる。例えば、データストリーム処理アプリケーションの文脈では、演算子インスタンスの署名が、ストリーム・スキーマ、フィルタリング述部、あるいは、JoinおよびGroup-by設定などを含むかもしれない。一実施形態において、演算子インスタンスの署名は、その演算子インスタンスに関連したメタデータから抽出される。例えば、メソッド３００は、その演算子インスタンスのソースコードから設定パラメータを抽出し、署名であるメタデータのXMLベースあるいは文字列ベースの表現を生成してもよい。一実施形態において、メタデータ中でコンパイル時間を評価可能な定数式が、実行時にロードされるプレース・ホルダ（例えば、修正された設定パラメータ）によって置き換えられる。このメタデータによって、演算子インスタンスに関連したすべての設定パラメータが取り込まれる。
【００２３】
ステップ３０８では、メソッド３００がコード・リポジトリから現行バージョンの演算子インスタンスに関連する署名を検索する。一実施形態において、コード・リポジトリは、演算子インスタンスに対して生成されたコードと共に、アプリケーションに関連した各演算子インスタンスの署名を保持している。
【００２４】
ステップ３１０では、メソッド３００が、予定された演算子インスタンスと現行演算子インスタンスの署名を比較し、一致するかを判定する。上述したように、演算子インスタンスの署名は、その演算子インスタンスに関連したすべての設定パラメータを取り込むメタデータから抽出される。これらの設定パラメータを考えると、その演算子タイプに関連したコード生成部は、その演算子インスタンスに適したコードを作成することができる。このように、２つの演算子インスタンスのメタデータが同じならば、（署名に加えて）それら演算子インスタンスに対して生成されたコードも同じである。しかしながら、２つの演算子インスタンスのメタデータが異なるなら、（署名に加えて）それら演算子インスタンスに対して生成されたコードも異なる。一実施形態において、それら署名は徹底的に比較され、一致を見い出すためには、個別ビットに至るまで一致していなければならない。
【００２５】
ステップ３１０で、予定された演算子インスタンスと現行演算子インスタンスの署名は一致しないとメソッド３００が結論付けるなら、メソッド３００はステップ３１２に進み、演算子インスタンスに対するコードを再生成する（すなわち、予定されたバージョンの演算子インスタンスに従ってコードを生成する）。そして、ステップ３１６で終了する前に、メソッド３００は再生成されたコードとその署名を（例えば、図２の署名データベース２０８に）記憶する。
【００２６】
その代わりに、ステップ３１０で、予定された演算子インスタンスと現行演算子インスタンスの署名は一致するとメソッド３００が結論付けるなら、メソッド３００はステップ３１４に進み、ステップ３１６で終了する前に、その演算子インスタンスに対するコードを再生成する必要がないと判断する（つまり、予定されたバージョンの演算子インスタンスは、現行バージョンの演算子インスタンスと同じである）。
【００２７】
それにより、メソッド３００は、旧バージョンのアプリケーションから変化のない演算子インスタンスに対するコードを不必要に再生成しないようにする。同じ演算子インスタンスは同じコードを共有すべきである。例えば、例１および例２に記載したプログラム断片の３１個のインスタンスを作成する以下の高水準コードを考える。
【数３】
2010267264.tif 000005
【００２８】
メソッド３００によれば、例３の６２（つまり、３１×２）個の演算子インスタンスのコードを再生成しないようにし、その代わり、（同一グループのコンポーネントが３１日の各日に再利用されるので）２つの演算子インスタンスに対するコードのみを再生成することは有利である。
【００２９】
メソッド３００には１つの注目すべき例外があり、それは、ある演算子タイプのコード生成部が変化した場合である（例えば、新バージョンの高水準言語コンパイラが利用できるため）。そのような場合は、新バージョンの演算子インスタンスと現行バージョンの演算子インスタンスの署名が一致しても、演算子インスタンスのコードは再生成されなければならない。コード生成部における変化はファイル・タイム・スタンプを用いて検出され得る。例えば、コード生成部が最後に生成されたコードよりも最近の時点で修正された場合、ビルドツールは、演算子インスタンスの署名を確認せずにコードを再生成することができる。
【００３０】
また、署名を用いたメソッド３００の手法は、コンポーネント・ベース・アプリケーションが反復演算子のインスタンスを含む場合、不必要なコードの再生成と再コンパイルを避けるためにも利用可能である。上述したように、署名は各演算子インスタンスに対して生成され、対応するコード生成部は、それぞれ独自の署名各々に対して一度呼び出される。このように、同一署名を共有する演算子インスタンスは同一演算子クラスのインスタンスとなり、同一コードを共有する。演算子インスタンスのコードを共有することにより、不必要なコード生成を回避し、コンパイル時間を著しく短縮できる。
【００３１】
しかしながら、演算子インスタンス間でコードを共有することは、時として制限が強すぎる場合がある。なぜならば、演算子インスタンス間の類似性を最大限に活用することができないためである。例えば、以下のコード抜粋を考える。ここでは、多数のSource演算子の構成のわずかな変化が、ファイルからのデータをストリームとして流されるメッセージに変換するために用いられ、過度にコードが生成されることになる。
【数４】
2010267264.tif 000006
【００３２】
具体的には、各演算子インスタンスに対して、異なるプログラミング言語（例えばＣまたはＣ＋＋プログラミング言語）実装の演算子インスタンス・コードが生成される。例えば、例４のコード抜粋を参照すると、各Source演算子は、従来技術に基づく実装では生成されたコードに埋め込まれる別のURIによって指定されたファイルからデータを読み出し、演算子の異なるインスタンス化に向け生成されたコードをわずかに変えることが認められる。
【００３３】
このように、コンパイル時に既知の定数に依存するパラメータ構成だけが異なる反復演算子インスタンスをアプリケーションが含む場合、本発明の実施形態は、不必要なコード再生成をさらに回避しようとする。実行時に演算子インスタンスが初期化される際、パラメータ構成のコンパイル時定数は、演算子インスタンスによってロードされるべき引数に変換され得る。例えば、追加ロジックを生成されたコードに含めることにより、例４のファイル名をその演算子インスタンスの引数に変換し、演算子インスタンスの引数からファイル名を抽出することができる。このような方法で、例４のすべてのSource演算子インスタンスがコードを共有することができるが、演算子処理ロジック自体に変化がないので、実行時に異なる引数を与えることもできる。
【００３４】
一実施形態において、このコード共有手法は、（定数ではなく）変数パラメータが異なる演算子インスタンスに適合する限り、部分的に一定の演算子パラメータに適用される。一実施形態において、演算子インスタンスのメタデータの一部であっても、コンパイル時定数は（上述の）演算子インスタンスの署名から除外される。なぜならば、それらコンパイル時定数は、図３に示す署名比較時に再コンパイルを引き起こしてしまうからである。
【００３５】
複数の演算子インスタンスが、互いにそっくりそのままのコピーである場合も、演算子インスタンス接続における違いが、生成されるコードにおける変化となるかもしれない。例えば、接続情報が演算子インスタンス構成の一部になるかもしれない。例えば、以下の高水準コードを考える。
【数５】
2010267264.tif 000007
【００３６】
例５では、第２のFunctor演算子インスタンスがその入力ポートに接続された２つのストリーム（すなわち、ＱｕｏｔｅｓＡおよびＱｕｏｔｅｓＢ）を有し、第１のFunctor演算子インスタンスがその入力ポートに接続された１つのストリーム（すなわち、ＱｕｏｔｅｓＡ）しか有していないこと以外、これら２つのFunctor演算子インスタンスは同じである。同様に、２つのFunctor演算子インスタンスによって生成される出力ストリームが数の異なる下流演算子に接続される場合もあるかもしれない。
【００３７】
このように、相互接続パターンのみが異なる反復演算子インスタンスをアプリケーションが含む場合、本発明の実施形態は、不必要なコード再生成をさらに回避しようとする。一実施形態において、このことは、演算子コードをコンテナ・コードから分離することによって達成される。コンテナは複数の演算子を受け入れることができ、演算子間の接続を確立する責任がある。演算子インスタンスと同様、コンテナ・インスタンスも自動的に生成される。演算子グラフからコンテナ・グラフへのマッピングには柔軟性がある。
【００３８】
また、演算子インスタンスと同様、不必要なコード再生成および再コンパイルを回避するために、署名をコンテナ・インスタンスから抽出することもできる。このように、アプリケーションで複数の演算子を受け入れるコンテナの異なるインスタンスを用い、コードの再生成および再コンパイルを最小限にとどめることができる。なお、コンテナ・コードは、通常演算子コードほど複雑ではない。
【００３９】
例えば、図４は、本発明による利益を享受する第２の典型的なコンポーネント・ベース・アプリケーション４００を示すブロック図である。図示するように、アプリケーション４００は、ストリームによって互いに接続される複数のコンポーネント、すなわち「演算子」４０２１−４０２ｎ（以下、集合的に演算子４０２と称する）からなる。これらの演算子インスタンス４０２は、コンテナ・インスタンス４０４、４０６、および４０８１から４０８ｍ（以下、集合的にコンテナ・インスタンス４０８と称する）によって受け入れられる。コンテナ・インスタンス４０４、４０６および４０８の各々は、少なくとも１つの演算子インスタンス４０２を受け入れる。
【００４０】
一実施形態において、すべての演算子インスタンス４０２は同じ方法で構成され、そのためコードを共有する。さらに、図示するように、内部接続に関しては同一であるｍ個のコンテナ・インスタンス４０８があり、それによって演算子インスタンス４０２が受け入れられる。典型的なアプリケーション４００の文脈では、コンテナ・インスタンス４０８の１つに対してだけコードを生成すればよく、このコードはｍ個のコンテナ・インスタンス４０８すべてに対して共有され得る。
【００４１】
同様に接続された同一演算子インスタンスからなる反復コンテナ・インスタンスをアプリケーションが含む場合、本発明の実施形態は、不必要なコード再生成をさらに回避しようとする。一実施形態において、このことは、既に説明した解決策に類似した方法で達成される。具体的に、署名はコンテナ・インスタンスの各々に対して抽出され、あるコンテナ・インスタンスに対する署名は、そのコンテナ・インスタンスが受け入れる演算子インスタンスの署名と共に、そのコンテナ・インスタンスの相互接続トポロジを取り込む。このような方法で、同一構成を有するコンテナ・インスタンスはコードを共有できる。
【００４２】
図５は、汎用演算装置５００を用いて実現されるコード生成方法のハイレベルなブロック図である。一実施形態において、汎用演算装置５００は、プロセッサ５０２、メモリ５０４、コード生成モジュール５０５、および入出力（Ｉ／Ｏ）装置５０６を備える。入出力装置は、ディスプレイ、キーボード、マウス、スタイラス、無線ネットワークアクセスカードなどである。一実施形態において、少なくとも１つの入出力装置が記憶装置（例えば、ディスク・ドライブ、光ディスク・ドライブ、あるいはフレキシブル・ディスク・ドライブ）である。なお、コード生成モジュール５０５は、物理的装置、あるいは通信チャネルを介してプロセッサに連結されるサブシステムとして実現され得る。
【００４３】
その代わりに、コード生成モジュール５０５は、１つ以上のソフトウェア・アプリケーションによって表現され得る（あるいは、特定用途向け集積回路（ASIC）を用いる等、ソフトウェアとハードウェアの組み合わせでもよい）。この場合、ソフトウェアは記憶媒体（例えば、入出力装置５０６）からロードされ、汎用演算装置５００のメモリ５０４でプロセッサによって処理される。このように、一実施形態において、先行図を用いて説明したように、コンポーネント・ベース・アプリケーションに対するコードを生成するコード生成モジュール５０５は、コンピュータ可読の記憶媒体あるいはキャリア（例えば、ＲＡＭ、磁気あるいは光ディスクやディスケットなど）に格納され得る。
【００４４】
なお、明確には規定していないが、アプリケーションの用途で必要な場合には、説明した方法の１つ以上のステップが、記憶、表示または出力ステップ、あるいはそれらすべてのステップを含んでいてもよい。すなわち、アプリケーションの用途で必要な場合には、前記方法で説明した任意のデータ、レコード、フィールド、または中間結果、あるいはそれらすべてが、他装置に記憶、表示または出力され得る、あるいはそれらすべてが実行され得る。さらに、添付図面で判定処理を意味したり、あるいは決定を伴うステップやブロックは、必ずしも判定処理の分岐の両方を実行することを要求するわけではない。すなわち、判定処理の分岐の一方は任意のステップとみなすことができる。
【００４５】
前述したことは本発明の実施形態に向けられたものであり、本発明の基本的な範囲を逸脱することなく、その他の実施形態を考え出すことができる。ここに提示した各種実施形態、あるいはそれらの部分は、他の実施形態を作成するために組み合わせることができる。また、上部、側部、底部、背部などの用語は、相対的あるいは位置的用語であり、図面に示される典型的な実施形態に対して用いられており、そのようなものとして、これら用語は置き換え可能である。
【符号の説明】
【００４６】
１００    コンポーネント・ベース・アプリケーション
１０６    データベース
２００    コンパイラ
２０２    設定パラメータ
２０４    対象機
２０６    署名比較処理部
２０８    署名データベース
５０２    プロセッサ
５０４    メモリ
【図１】
2010267264.tif 000008
【図２】
2010267264.tif 000009
【図３】
2010267264.tif 000010
【図４】
2010267264.tif 000011
【図５】
2010267264.tif 000012