説明

コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築する方法、その方法を実行するプログラムを含むコンピュータ可読の記憶媒体、およびコンパイラ

【課題】コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築する際、実行可能なコンポーネント・コードが不必要に再生成および再コンパイルされないようにする。
【解決手段】ソースコードをコンパイルするリクエストを受信したとき、各ソースコード・コンポーネントに対して署名を抽出するステップ306と、ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスに対応して格納されている署名を検索するステップ308と、抽出された署名を格納されている署名と比較するステップ310と、抽出された署名が格納されている署名と一致しない場合、ソースコード・コンポーネントを実行可能なコードにコンパイルするステップ312と、抽出された署名が格納されている署名と一致する場合、ソースコード・コンポーネントに対して実行可能なコードをリポジトリから獲得するステップ314とを含む。

【発明の詳細な説明】
【技術分野】
【0001】
政府機関の財政的支援への言及
本発明は、米国国防省による契約H98230−07−C−0383の下で、政府の助成を受けて完成されたものである。政府は、本発明に対して一定の権利を有する。
【0002】
本発明は、概してコンポーネント・ベース・コード生成に関し、より詳細には、コンポーネント・ベース・アプリケーションを構築するための逐次添加法(incremental method)に関する。
【背景技術】
【0003】
コンポーネント・ベース・アプリケーションは、相互接続した複数の機能コンポーネント、すなわち演算子を使用し構築されるアプリケーションである。この文脈で、コンポーネントは小さなコード片であり、データ変換、フィルタリング、注記、分類、逆多重化、分流などの汎用演算を実行する。2つのコンポーネントは、潜在的に無限量のデータを有するストリームを通じて交信可能である。コンポーネントは、ある規定シーケンスに従うよう、既に定義されている方法でこのデータに対して作動し、出力を生じる。
【0004】
一般的に、これらコンポーネントの各々は、コード生成およびコードコンパイルを伴う二段階プロセスにしたがって構築される。コード生成ステップでは、アプリケーションの宣言的記述から実行可能なコードが生成される。具体的に、特定クラスのコンポーネントを考えると、コード生成は、そのクラスに対応するコード・ジェネレータの呼び出しを伴い、そのコンポーネントにとって適切な設定パラメータをコード・ジェネレータに提供する。コード・ジェネレータは、そのコンポーネント向け汎用プログラミング言語(例えば、CまたはC++プログラミング言語)で特殊コードを生成する。コードコンパイルステップでは、その特殊コードが、対象プラットホーム(例えば、インテルX86命令セット・アーキテクチャベースのコンピュータ)で実行可能なオブジェクト・コードにコンパイルされる。生成またはコンパイルステップ、あるいは両ステップを編成するために、通常汎用ビルドツールが使用される。そのようなビルドツールの例として、「make」、「gnumake」、「nmake」、「JAM」および「ant」ツールがある。
【発明の概要】
【発明が解決しようとする課題】
【0005】
ある場合には、コンポーネント・ベース・アプリケーションの宣言的記述を含むファイルが変わるかもしれない。その結果、アプリケーションと関連するコンポーネントの一部も変わる可能性があり、それらコンポーネントの再生成が必要となる。従来のビルドツールは、コードが変わったかどうかを判定するのにタイム・スタンプデータを当てにし、コンポーネント全てのコードを再生成すると共に、再生成されたコードを全面的にコンパイルし直す。このように、タイム・スタンプがオブジェクト・コードのものより新しいという理由だけで、事実上変更されていない(例えば、データ処理方法が変更されていない)コンポーネントに対してまでもコードが再生成され、コンパイルし直される。
【課題を解決するための手段】
【0006】
コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築する方法の一実施形態は、コンポーネント・ベース・アプリケーションに対するソースコードをコンパイルするようにとのリクエストを受信するステップを含み、そのリクエストがソースコードを特定し、ソースコードが複数のソースコード・コンポーネントからなり、ソースコード・コンポーネントの各々がアプリケーションの異なるコンポーネントを実装し、さらに、各ソースコード・コンポーネントに対して一連のステップを実行するステップを含み、前記一連のステップは、ソースコード・コンポーネントに対して署名を抽出するステップと、ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスに対応して格納されている署名を検索するステップと、抽出された署名を格納されている署名と比較するステップと、抽出された署名が格納されている署名と一致しない場合、ソースコード・コンポーネントを実行可能なコードにコンパイルするステップと、抽出された署名が格納されている署名と一致する場合、ソースコード・コンポーネントに対して実行可能なコードをリポジトリから獲得するステップとを含む。
【0007】
すなわち、上記された本発明の特徴が詳細に理解され得るように、実施形態を参照して発明のより詳細な説明がなされ、その一部が添付図面に示される。しかしながら、添付図面は本発明の典型的な実施形態のみを図解するものであり、発明の範囲を制限するものと見なすべきではない。なぜならば、本発明はその他同等に有効な実施形態を含む余地があるためである。
【図面の簡単な説明】
【0008】
【図1】本発明による利益を享受する第1の典型的なコンポーネント・ベース・アプリケーションを示すブロック図である。
【図2】本発明に係わるコンパイラの一実施形態を示すブロック図である。
【図3】本発明に係わり、コンポーネント・ベース・アプリケーションのコードを生成する方法の一実施形態を示すフローチャートである。
【図4】本発明による利益を享受する第2の典型的なコンポーネント・ベース・アプリケーションを示すブロック図である。
【図5】汎用計算装置を用いて実現されるコード生成方法のハイレベルなブロック図である。
【発明を実施するための形態】
【0009】
一実施形態において、本発明は、コンポーネント・ベース・アプリケーションを逐次構築する方法および装置である。本発明の実施形態は、メタデータを用いた署名手法を用い、実行可能なコンポーネント・コードが不必要に再生成および再コンパイルされないようにする。特に、メタデータは、アプリケーションの各コンポーネントを定義する構成を記述するために用いられる。各コンポーネントのメタデータから署名が算出され、コード・リポジトリでそのコンポーネントに対して生成された実行可能なコードに関連してその署名が保持される。コード生成時には、コード・リポジトリが検索され、新しいコードが生成されるコンポーネントに対応して格納されたコードがある場合には、その格納されたコードに対応する署名が検索される。格納されたコードの署名が、新しいコードのために算出された署名と異なる場合、そのコンポーネントのコードは、新しいコードにしたがって再生成される。一方、署名に違いがないなら、そのコンポーネントのコードが再生成されることはない。
【0010】
図1は、本発明による利益を享受する第1の典型的なコンポーネント・ベース・アプリケーション100を示すブロック図である。特に、この典型的なコンポーネント・ベース・アプリケーション100は、ストリーム処理アプリケーションである。しかしながら、本発明は、実質的にいかなるタイプのコンポーネントー・ベース開発の枠組みでも用いることができ、ストリーム処理アプリケーションに限定されることはない。
【0011】
アプリケーション100は、ストリームによって互いに接続される複数のコンポーネント、すなわち「演算子」102−102(以下、集合的に演算子102と称する)からなる。演算子102は、入力ストリーミング・データ104に対して演算を行い、その演算結果を(可能なかぎりは、同様にストリーム形式で)データベース106に出力するように構成される。
【0012】
一実施形態において、演算子102の各々は、以下に示す複数の候補タイプの一つである。すなわち、Source(例えば、演算子102で外部データ・ソースからデータを読み込むのに使用される)、Functor(例えば、演算子102、102、102および102で、フィルタリング等、ストリーミング・データに対する基本的なデータ変換を実行するために使用される)、Aggregate(例えば、演算子102で、ストリーミング・データを論理的にグループ化し要約するために使用される)、Join(例えば、演算子102で、2つのストリームを関連付けるために使用される)、Sink(例えば、演算子102で、データを外在化するために使用される)のいずれかであるが、それらに限定されるわけではない。演算子102の各々は、それぞれ個別な方法で構成できる。すなわち、各演算子102は、個別のタイプで構成可能なコンポーネントである。そのため、各演算子102は、ストリーム処理アプリケーション100の文脈中で「演算子インスタンス」とも称される。
【0013】
例えば、典型的なアプリケーション100は、ライブの株式市況フィードなど、金融データストリームを処理するように構成されているかもしれない。そのようなアプリケーションでは、Source演算子102が、入力データストリーム104からの入力を読み取り、この入力を第1および第2のFunctor演算子102および102に渡す。第1のFunctor演算子102は取引を通し、入力データストリームから出来高価格を算出し、一方第2のFunctor演算子102は入力データストリームから株価を渡す。そして、取引および出来高価格が第1のFunctor演算子102からAggregate演算子102に渡され、Aggregate演算子102が入力データストリームの中の各株価ティッカあるいはシンボルの移動平均を算出する。そして、Aggregate演算子102は、その移動平均を第3のFunctor演算子102に渡し、第3のFunctor演算子102が入力データストリーム中の株式の出来高加重平均価格(VWAP)を算出する。Joint演算子102は、株価を第2のFunctor演算子102から受け取り、出来高加重平均価格を第3のFunctor演算子102から受け取り、バーゲン指標を算出する。そして、Joint演算子102はそのバーゲン指標を第4のFunctor演算子102に渡し、第4のFunctor演算子102は、ゼロ値バーゲン指標でメッセージの量を減らしてそのデータをSink演算子102に渡す。Sink演算子102は結果をデータベース106に書き込む。
【0014】
上述したように、典型的なアプリケーション100のようなストリーム処理アプリケーションをコンパイルすることは、そのアプリケーションの論理的記述から実行可能なコードを生成することを伴う。特定種類の演算子インスタンスを考えると、コード生成は、対応するコード・ジェネレータの呼び出しと、そのコード・ジェネレータへの適切な設定パラメータの提供を伴う。コード・ジェネレータは、汎用プログラミング言語(例えば、CやC++プログラミング言語)でその演算子インスタンスの特殊コードを生成する。そして、生成されたコードは、対象プラットホームで実行可能なオブジェクト・コードにコンパイルされる。一般に、「make」ツールなど汎用ビルドツールを用いてコンパイルが実行される。
【0015】
例えば、高水準プログラミング言語で表された以下に示す2つの典型的なFunctor演算子インスタンスを考える。ここでは、2つのFunctor演算子を用い、TradeQuoteと呼ばれるプライマル・ストリームから入来するデータを処理することにより新しいストリーム(TradeFilterおよびQuoteFilter)を生成する。これらの例は、以下に示すように、SPADEプログラミング言語で記述されている。詳細は、Gedik他、「SPADE: The System SDeclarative Stream Processing Engine」、SIGMOD Conference2008、1123-1134に記載されている。
【数1】


【数2】


例1および例2は、対応するFunctor演算子インスタンスの宣言的記述を高水準プログラミング言語に翻訳したものを表す。
【0016】
例1および例2における2つのFunctor演算子インスタンスは、違った方法で明確に設定される。具体的には、各演算子インスタンスが生成しているストリームのスキーマは異なる(つまり、QuoteFilterのスキーマ対TradeFilterのスキーマ)。また、フィルタリング条件(ttype=”Trade”& volume>0.0 versus ttype=”Quote” & askprice>0.0)など、パラメータの一部が異なる(つまり、結果としてそれぞれが生じたストリーム・メッセージが異なり、例1では、入力タプルの属性値に基づきmyvwapと称する新しいメッセージ属性が算出される)。また、属性割り当ても異なる。すなわち、Functor演算子インスタンスに関連したコード・ジェネレータがこれら2つのFunctor演算子インスタンスに対して異なるコードを生成することを意味する。
【0017】
図2は、本発明に係わるコンパイラ200の一実施形態を示すブロック図である。図2の文脈では、以下詳述するように、「コンパイラ」と称する構成要素がコード生成とコンパイルの両方を実行する。コンパイラ200は、例えば、図1に示すコンポーネント・ベース・アプリケーションなどのコンポーネント・ベース・アプリケーションのコンポーネントまたは演算子インスタンスのコードを生成するように実装される。図示するように、コンパイラ200は予定された演算子インスタンス(例えば、ストリーム処理アプリケーションの文脈におけるストリーム・スキーマやフィルタリング述部など)の設定パラメータ202を受け取り、その予定された演算子インスタンスに対応するオブジェクト・コードを出力する。コンパイラ200の構成は、ハードウェアであっても、ソフトウェアであっても、あるいはそれらの組み合わせであってもよい。コンパイラ200は、署名コンパレータ、署名データベース、コード・ジェネレータなど、複数の要素からなる。コンパイラ200の一実施例が、本発明によって構成されるSPADEプログラミング言語コンパイラである。
【0018】
図示するように、コンパイラ200は、署名比較エンジン206、リポジトリすなわち署名データベース208、複数のコード生成部210−210(以下、まとめて「コード生成部210」とする)、バックエンド212からなる。コンパイラ200が、コンポーネント・ベース・プログラムの予定された演算子インスタンスに対する設定パラメータ202を受けると、設定パラメータ202が署名比較処理部206に渡される。図3で詳述されるように、署名比較処理部206は、設定パラメータ202から予定された演算子インスタンスの署名を抽出する。そして、署名比較エンジン206は、抽出した署名と既に生成され格納されている演算子インスタンスの署名とを比較する。格納されている署名は署名データベース208から検索される。
【0019】
署名比較に基づき、予定された演算子インスタンス(Source, Functor, Aggregate, Join, Sinkなど)に対して実行可能なコードを生成すべきと判断した場合、署名比較処理部206は、予定された演算子インスタンスで表された演算子タイプに対応するコード・ジェネレータ210に設定パラメータ202を渡す。コード・ジェネレータ210は、その演算子インスタンスに対し汎用プログラミング言語で特殊コードを生成し、その特殊コードをバックエンド・コンパイラ(CまたはC++プログラミング言語コンパイラ)212に渡す。バックエンド・コンパイラ212は特殊コードを対象機204で実行可能なオブジェクト・コードにコンパイルし、そのオブジェクト・コードを対象機204に提供する。
【0020】
図3は、本発明に係わり、コンポーネント・ベース・アプリケーションのコードを生成するメソッド300の一実施形態を示すフローチャートである。例えば、図2に示すコンパイラ200の署名比較処理部206によってメソッド300が実施される。また、例えば、コンポーネント・ベース・アプリケーションが変更されコンパイラが再起動される時にメソッド300が実施される。
【0021】
メソッド300はステップ302で初期化され、ステップ304に進む。ステップ304で、メソッド300は、コンポーネント・ベース・アプリケーションのコードを再生成するよう指示を受ける。このように、アプリケーション中で予定されたバージョンの少なくとも1つの演算子インスタンスに対してコードを生成するよう指示される。ここでは、その演算子インスタンスが現行バージョンのアプリケーションに存在している。
【0022】
ステップ306で、メソッド300は、予定されたバージョンの演算子インスタンスの署名を抽出する。一実施形態において、その署名は拡張マークアップ言語(XML)文書であり、その予定されたバージョンの演算子インスタンスの設定パラメータを取り込む。この例では、その署名が設定パラメータを表し、ある演算子の修正可能な諸相を特定の設定にするために用いられる。このように、その署名により、異なるコードの生成を引き起こすすべての関連演算子パラメータが取り込まれる。例えば、データストリーム処理アプリケーションの文脈では、演算子インスタンスの署名が、ストリーム・スキーマ、フィルタリング述部、あるいは、JoinおよびGroup-by設定などを含むかもしれない。一実施形態において、演算子インスタンスの署名は、その演算子インスタンスに関連したメタデータから抽出される。例えば、メソッド300は、その演算子インスタンスのソースコードから設定パラメータを抽出し、署名であるメタデータのXMLベースあるいは文字列ベースの表現を生成してもよい。一実施形態において、メタデータ中でコンパイル時間を評価可能な定数式が、実行時にロードされるプレース・ホルダ(例えば、修正された設定パラメータ)によって置き換えられる。このメタデータによって、演算子インスタンスに関連したすべての設定パラメータが取り込まれる。
【0023】
ステップ308では、メソッド300がコード・リポジトリから現行バージョンの演算子インスタンスに関連する署名を検索する。一実施形態において、コード・リポジトリは、演算子インスタンスに対して生成されたコードと共に、アプリケーションに関連した各演算子インスタンスの署名を保持している。
【0024】
ステップ310では、メソッド300が、予定された演算子インスタンスと現行演算子インスタンスの署名を比較し、一致するかを判定する。上述したように、演算子インスタンスの署名は、その演算子インスタンスに関連したすべての設定パラメータを取り込むメタデータから抽出される。これらの設定パラメータを考えると、その演算子タイプに関連したコード生成部は、その演算子インスタンスに適したコードを作成することができる。このように、2つの演算子インスタンスのメタデータが同じならば、(署名に加えて)それら演算子インスタンスに対して生成されたコードも同じである。しかしながら、2つの演算子インスタンスのメタデータが異なるなら、(署名に加えて)それら演算子インスタンスに対して生成されたコードも異なる。一実施形態において、それら署名は徹底的に比較され、一致を見い出すためには、個別ビットに至るまで一致していなければならない。
【0025】
ステップ310で、予定された演算子インスタンスと現行演算子インスタンスの署名は一致しないとメソッド300が結論付けるなら、メソッド300はステップ312に進み、演算子インスタンスに対するコードを再生成する(すなわち、予定されたバージョンの演算子インスタンスに従ってコードを生成する)。そして、ステップ316で終了する前に、メソッド300は再生成されたコードとその署名を(例えば、図2の署名データベース208に)記憶する。
【0026】
その代わりに、ステップ310で、予定された演算子インスタンスと現行演算子インスタンスの署名は一致するとメソッド300が結論付けるなら、メソッド300はステップ314に進み、ステップ316で終了する前に、その演算子インスタンスに対するコードを再生成する必要がないと判断する(つまり、予定されたバージョンの演算子インスタンスは、現行バージョンの演算子インスタンスと同じである)。
【0027】
それにより、メソッド300は、旧バージョンのアプリケーションから変化のない演算子インスタンスに対するコードを不必要に再生成しないようにする。同じ演算子インスタンスは同じコードを共有すべきである。例えば、例1および例2に記載したプログラム断片の31個のインスタンスを作成する以下の高水準コードを考える。
【数3】

【0028】
メソッド300によれば、例3の62(つまり、31×2)個の演算子インスタンスのコードを再生成しないようにし、その代わり、(同一グループのコンポーネントが31日の各日に再利用されるので)2つの演算子インスタンスに対するコードのみを再生成することは有利である。
【0029】
メソッド300には1つの注目すべき例外があり、それは、ある演算子タイプのコード生成部が変化した場合である(例えば、新バージョンの高水準言語コンパイラが利用できるため)。そのような場合は、新バージョンの演算子インスタンスと現行バージョンの演算子インスタンスの署名が一致しても、演算子インスタンスのコードは再生成されなければならない。コード生成部における変化はファイル・タイム・スタンプを用いて検出され得る。例えば、コード生成部が最後に生成されたコードよりも最近の時点で修正された場合、ビルドツールは、演算子インスタンスの署名を確認せずにコードを再生成することができる。
【0030】
また、署名を用いたメソッド300の手法は、コンポーネント・ベース・アプリケーションが反復演算子のインスタンスを含む場合、不必要なコードの再生成と再コンパイルを避けるためにも利用可能である。上述したように、署名は各演算子インスタンスに対して生成され、対応するコード生成部は、それぞれ独自の署名各々に対して一度呼び出される。このように、同一署名を共有する演算子インスタンスは同一演算子クラスのインスタンスとなり、同一コードを共有する。演算子インスタンスのコードを共有することにより、不必要なコード生成を回避し、コンパイル時間を著しく短縮できる。
【0031】
しかしながら、演算子インスタンス間でコードを共有することは、時として制限が強すぎる場合がある。なぜならば、演算子インスタンス間の類似性を最大限に活用することができないためである。例えば、以下のコード抜粋を考える。ここでは、多数のSource演算子の構成のわずかな変化が、ファイルからのデータをストリームとして流されるメッセージに変換するために用いられ、過度にコードが生成されることになる。
【数4】

【0032】
具体的には、各演算子インスタンスに対して、異なるプログラミング言語(例えばCまたはC++プログラミング言語)実装の演算子インスタンス・コードが生成される。例えば、例4のコード抜粋を参照すると、各Source演算子は、従来技術に基づく実装では生成されたコードに埋め込まれる別のURIによって指定されたファイルからデータを読み出し、演算子の異なるインスタンス化に向け生成されたコードをわずかに変えることが認められる。
【0033】
このように、コンパイル時に既知の定数に依存するパラメータ構成だけが異なる反復演算子インスタンスをアプリケーションが含む場合、本発明の実施形態は、不必要なコード再生成をさらに回避しようとする。実行時に演算子インスタンスが初期化される際、パラメータ構成のコンパイル時定数は、演算子インスタンスによってロードされるべき引数に変換され得る。例えば、追加ロジックを生成されたコードに含めることにより、例4のファイル名をその演算子インスタンスの引数に変換し、演算子インスタンスの引数からファイル名を抽出することができる。このような方法で、例4のすべてのSource演算子インスタンスがコードを共有することができるが、演算子処理ロジック自体に変化がないので、実行時に異なる引数を与えることもできる。
【0034】
一実施形態において、このコード共有手法は、(定数ではなく)変数パラメータが異なる演算子インスタンスに適合する限り、部分的に一定の演算子パラメータに適用される。一実施形態において、演算子インスタンスのメタデータの一部であっても、コンパイル時定数は(上述の)演算子インスタンスの署名から除外される。なぜならば、それらコンパイル時定数は、図3に示す署名比較時に再コンパイルを引き起こしてしまうからである。
【0035】
複数の演算子インスタンスが、互いにそっくりそのままのコピーである場合も、演算子インスタンス接続における違いが、生成されるコードにおける変化となるかもしれない。例えば、接続情報が演算子インスタンス構成の一部になるかもしれない。例えば、以下の高水準コードを考える。
【数5】

【0036】
例5では、第2のFunctor演算子インスタンスがその入力ポートに接続された2つのストリーム(すなわち、QuotesAおよびQuotesB)を有し、第1のFunctor演算子インスタンスがその入力ポートに接続された1つのストリーム(すなわち、QuotesA)しか有していないこと以外、これら2つのFunctor演算子インスタンスは同じである。同様に、2つのFunctor演算子インスタンスによって生成される出力ストリームが数の異なる下流演算子に接続される場合もあるかもしれない。
【0037】
このように、相互接続パターンのみが異なる反復演算子インスタンスをアプリケーションが含む場合、本発明の実施形態は、不必要なコード再生成をさらに回避しようとする。一実施形態において、このことは、演算子コードをコンテナ・コードから分離することによって達成される。コンテナは複数の演算子を受け入れることができ、演算子間の接続を確立する責任がある。演算子インスタンスと同様、コンテナ・インスタンスも自動的に生成される。演算子グラフからコンテナ・グラフへのマッピングには柔軟性がある。
【0038】
また、演算子インスタンスと同様、不必要なコード再生成および再コンパイルを回避するために、署名をコンテナ・インスタンスから抽出することもできる。このように、アプリケーションで複数の演算子を受け入れるコンテナの異なるインスタンスを用い、コードの再生成および再コンパイルを最小限にとどめることができる。なお、コンテナ・コードは、通常演算子コードほど複雑ではない。
【0039】
例えば、図4は、本発明による利益を享受する第2の典型的なコンポーネント・ベース・アプリケーション400を示すブロック図である。図示するように、アプリケーション400は、ストリームによって互いに接続される複数のコンポーネント、すなわち「演算子」402−402(以下、集合的に演算子402と称する)からなる。これらの演算子インスタンス402は、コンテナ・インスタンス404、406、および408から408(以下、集合的にコンテナ・インスタンス408と称する)によって受け入れられる。コンテナ・インスタンス404、406および408の各々は、少なくとも1つの演算子インスタンス402を受け入れる。
【0040】
一実施形態において、すべての演算子インスタンス402は同じ方法で構成され、そのためコードを共有する。さらに、図示するように、内部接続に関しては同一であるm個のコンテナ・インスタンス408があり、それによって演算子インスタンス402が受け入れられる。典型的なアプリケーション400の文脈では、コンテナ・インスタンス408の1つに対してだけコードを生成すればよく、このコードはm個のコンテナ・インスタンス408すべてに対して共有され得る。
【0041】
同様に接続された同一演算子インスタンスからなる反復コンテナ・インスタンスをアプリケーションが含む場合、本発明の実施形態は、不必要なコード再生成をさらに回避しようとする。一実施形態において、このことは、既に説明した解決策に類似した方法で達成される。具体的に、署名はコンテナ・インスタンスの各々に対して抽出され、あるコンテナ・インスタンスに対する署名は、そのコンテナ・インスタンスが受け入れる演算子インスタンスの署名と共に、そのコンテナ・インスタンスの相互接続トポロジを取り込む。このような方法で、同一構成を有するコンテナ・インスタンスはコードを共有できる。
【0042】
図5は、汎用演算装置500を用いて実現されるコード生成方法のハイレベルなブロック図である。一実施形態において、汎用演算装置500は、プロセッサ502、メモリ504、コード生成モジュール505、および入出力(I/O)装置506を備える。入出力装置は、ディスプレイ、キーボード、マウス、スタイラス、無線ネットワークアクセスカードなどである。一実施形態において、少なくとも1つの入出力装置が記憶装置(例えば、ディスク・ドライブ、光ディスク・ドライブ、あるいはフレキシブル・ディスク・ドライブ)である。なお、コード生成モジュール505は、物理的装置、あるいは通信チャネルを介してプロセッサに連結されるサブシステムとして実現され得る。
【0043】
その代わりに、コード生成モジュール505は、1つ以上のソフトウェア・アプリケーションによって表現され得る(あるいは、特定用途向け集積回路(ASIC)を用いる等、ソフトウェアとハードウェアの組み合わせでもよい)。この場合、ソフトウェアは記憶媒体(例えば、入出力装置506)からロードされ、汎用演算装置500のメモリ504でプロセッサによって処理される。このように、一実施形態において、先行図を用いて説明したように、コンポーネント・ベース・アプリケーションに対するコードを生成するコード生成モジュール505は、コンピュータ可読の記憶媒体あるいはキャリア(例えば、RAM、磁気あるいは光ディスクやディスケットなど)に格納され得る。
【0044】
なお、明確には規定していないが、アプリケーションの用途で必要な場合には、説明した方法の1つ以上のステップが、記憶、表示または出力ステップ、あるいはそれらすべてのステップを含んでいてもよい。すなわち、アプリケーションの用途で必要な場合には、前記方法で説明した任意のデータ、レコード、フィールド、または中間結果、あるいはそれらすべてが、他装置に記憶、表示または出力され得る、あるいはそれらすべてが実行され得る。さらに、添付図面で判定処理を意味したり、あるいは決定を伴うステップやブロックは、必ずしも判定処理の分岐の両方を実行することを要求するわけではない。すなわち、判定処理の分岐の一方は任意のステップとみなすことができる。
【0045】
前述したことは本発明の実施形態に向けられたものであり、本発明の基本的な範囲を逸脱することなく、その他の実施形態を考え出すことができる。ここに提示した各種実施形態、あるいはそれらの部分は、他の実施形態を作成するために組み合わせることができる。また、上部、側部、底部、背部などの用語は、相対的あるいは位置的用語であり、図面に示される典型的な実施形態に対して用いられており、そのようなものとして、これら用語は置き換え可能である。
【符号の説明】
【0046】
100 コンポーネント・ベース・アプリケーション
106 データベース
200 コンパイラ
202 設定パラメータ
204 対象機
206 署名比較処理部
208 署名データベース
502 プロセッサ
504 メモリ

【特許請求の範囲】
【請求項1】
コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築する方法であって、
コンピュータシステムで仕事を遂行するコンパイラが、前記コンポーネント・ベース・アプリケーションに対するソースコードをコンパイルするようにとのリクエストを受信するステップを含み、前記リクエストが前記ソースコードを特定し、前記ソースコードが複数のソースコード・コンポーネントからなり、前記複数のソースコード・コンポーネントの各々が前記アプリケーションの異なるコンポーネントを実装し、
さらに、前記コンパイラが前記複数のソースコード・コンポーネントの各ソースコード・コンポーネントに対して一連のステップを実行するステップを含み、該一連のステップが
前記ソースコード・コンポーネントに対して抽出された署名を抽出するステップと、
前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスに対応して格納されている署名を検索するステップと、
前記抽出された署名を前記格納されている署名と比較するステップと、
前記ソースコード・コンポーネントを、前記格納されている署名と一致しない前記抽出された署名に対応する前記実行可能なコードにコンパイルするステップと、
前記抽出された署名が前記格納されている署名と一致する場合、前記ソースコード・コンポーネントの前記実行可能なコードをリポジトリから獲得するステップと、
を含む方法。
【請求項2】
前記抽出された署名は前記ソースコードに関連したメタデータから抽出され、前記格納されている署名は、前バージョンのソースコードに関連したメタデータから以前に抽出されたものであり、該前バージョンのソースコードからは、前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスが生成されたものである、請求項1に記載の方法。
【請求項3】
前記ソースコードに関連した前記メタデータが前記ソースコードの1つ以上の設定パラメータを取り込み、前記前バージョンのソースコードに関連した前記メタデータが、前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスの1つ以上の設定パラメータを取り込む、請求項2記載の方法。
【請求項4】
前記抽出した署名は拡張マークアップ言語文書であり、前記ソースコードの前記1つ以上の設定パラメータを取り込み、前記格納されている署名も拡張マークアップ言語文書であり、前記前バージョンのソースコードの前記1つ以上の設定パラメータを取り込む、請求項3記載の方法。
【請求項5】
前記ソースコードに関連した前記メタデータ中、コンパイル時に評価可能な1つ以上の定数式が実行時にロードされるプレース・ホルダによって置き換えられる、請求項3記載の方法。
【請求項6】
前記リポジトリにおいて、前記格納されている署名が、前記ソースコード・コンポーネントに対する前記現在利用可能な実行可能コードのインスタンスに関連している、請求項1記載の方法。
【請求項7】
前記リポジトリは、コードと、前記複数のソースコード・コンポーネントにおける各ソースコード・コンポーネントの署名とを保持する、請求項6記載の方法。
【請求項8】
前記ソースコード・コンポーネントが入力データに対して演算を行う演算子である、請求項1記載の方法。
【請求項9】
前記ソースコード・コンポーネントが入力データに対して演算を行う1つ以上の演算子を受け入れるコンテナである、請求項1記載の方法。
【請求項10】
コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築する実行可能プログラムを含むコンピュータ可読の記憶媒体であって、該プログラムは
コンピュータシステムで仕事を遂行するコンパイラが、前記コンポーネント・ベース・アプリケーションに対するソースコードをコンパイルするようにとのリクエストを受信するステップを含み、前記リクエストが前記ソースコードを特定し、前記ソースコードが複数のソースコード・コンポーネントからなり、前記複数のソースコード・コンポーネントの各々が前記アプリケーションの異なるコンポーネントを実装し、
さらに、前記コンパイラが前記複数のソースコード・コンポーネントの各ソースコード・コンポーネントに対して一連のステップを実行するステップを含み、該一連のステップが
前記ソースコード・コンポーネントに対して抽出された署名を抽出するステップと、
前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスに対応して格納されている署名を検索するステップと、
前記抽出された署名を前記格納されている署名と比較するステップと、
前記ソースコード・コンポーネントを、前記格納されている署名と一致しない前記抽出された署名に対応する前記実行可能なコードにコンパイルするステップと、
前記抽出された署名が前記格納されている署名と一致する場合、前記ソースコード・コンポーネントの前記実行可能なコードをリポジトリから獲得するステップと、
を含むコンピュータ可読の記憶媒体。
【請求項11】
前記抽出された署名は前記ソースコードに関連したメタデータから抽出され、前記格納されている署名は、前バージョンのソースコードに関連したメタデータから以前に抽出されたものであり、該前バージョンのソースコードからは、前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスが生成されたものである、請求項10記載のコンピュータ可読の記憶媒体。
【請求項12】
前記ソースコードに関連した前記メタデータが前記ソースコードの1つ以上の設定パラメータを取り込み、前記前バージョンのソースコードに関連した前記メタデータが、前記ソースコード・コンポーネントに対して現在利用可能な実行可能コードのインスタンスの1つ以上の設定パラメータを取り込む、請求項11記載のコンピュータ可読の記憶媒体。
【請求項13】
前記抽出した署名は拡張マークアップ言語文書であり、前記ソースコードの前記1つ以上の設定パラメータを取り込み、前記格納されている署名も拡張マークアップ言語文書であり、前記前バージョンのソースコードの前記1つ以上の設定パラメータを取り込む、請求項12記載のコンピュータ可読の記憶媒体。
【請求項14】
前記ソースコードに関連した前記メタデータ中、コンパイル時に評価可能な1つ以上の定数式が、実行時にロードされるプレース・ホルダによって置き換えられる、請求項12記載のコンピュータ可読の記憶媒体。
【請求項15】
前記リポジトリにおいて、前記格納されている署名が、前記ソースコード・コンポーネントに対する前記現在利用可能な実行可能コードのインスタンスに関連している、請求項10記載のコンピュータ可読の記憶媒体。
【請求項16】
前記リポジトリは、コードと、前記複数のソースコード・コンポーネントにおける各ソースコード・コンポーネントの署名とを保持する、請求項15記載のコンピュータ可読の記憶媒体。
【請求項17】
前記ソースコード・コンポーネントが入力データに対して演算を行う演算子である、請求項10記載のコンピュータ可読の記憶媒体。
【請求項18】
前記ソースコード・コンポーネントが入力データに対して演算を行う1つ以上の演算子を受け入れるコンテナである、請求項10記載のコンピュータ可読の記憶媒体。
【請求項19】
コンポーネント・ベース・アプリケーションに対して実行可能なコードを構築するコンパイラであって、
前記コンポーネント・ベース・アプリケーションに対するソースコードをコンパイルするようにとのリクエストを受信する入力を含み、前記リクエストが前記ソースコードを特定し、前記ソースコードが複数のソースコード・コンポーネントからなり、前記複数のソースコード・コンポーネントの各々が前記アプリケーションの異なるコンポーネントを実装し、
さらに、前記入力に連結され、前記複数のソースコード・コンポーネントの各ソースコード・コンポーネントに対して一連のステップを実行する複数の要素を含み、前記複数の要素が
前記ソースコード・コンポーネントに対して抽出された署名を抽出する署名比較部と、
前記ソースコード・コンポーネントに対して既に生成された実行可能なコードのインスタンスに対応して格納された署名を格納する署名データベースと、
前記署名が前記格納されている署名と一致しない場合、前記ソースコード・コンポーネントを前記実行可能なコードにコンパイルし、前記ソースコード・コンポーネントの前記実行可能なコードをリポジトリから獲得するコード生成部と、
を含むコンパイラ。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate


【公開番号】特開2010−267264(P2010−267264A)
【公開日】平成22年11月25日(2010.11.25)
【国際特許分類】
【出願番号】特願2010−111035(P2010−111035)
【出願日】平成22年5月13日(2010.5.13)
【出願人】(390009531)インターナショナル・ビジネス・マシーンズ・コーポレーション (4,084)
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MASCHINES CORPORATION
【Fターム(参考)】