(57)【特許請求の範囲】
【請求項１】
１または複数のハードウェアプロセッサと、前記１または複数のハードウェアプロセッサによって実行され得るコンピュータ実行可能命令を有する１または複数のハードウェア記憶装置とを備えたシステムであって、前記コンピュータ実行可能命令は中間言語プログラムコードの静的解析の一環として少なくとも以下の、
前記中間言語プログラムコードにおいて複数のコンポーネントを識別することであって、各コンポーネントは異なる実行スコープを備え、対応するコントラクトを含み、各コントラクトは、前記対応する実行スコープのランタイムにおいて当該コントラクトに遭遇した場合、前記コントラクトの述部が真であるかを、前記対応する実行スコープの以降の実行の条件とする、ことと、
前記複数のコンポーネントの特定のコンポーネントに対応する特定のコントラクトの特定の述部が、前記特定のコンポーネントのランタイムにおいて常に真とは限らないと判定することと、
前記複数のコンポーネントのための実行可能コードを１または複数の実行可能バイナリ内に生成することであって、前記特定のコンポーネントのための前記実行可能コードを生成するときに、前記複数のコンポーネントの１または複数の他のコンポーネントの第１のセットによって前記特定のコンポーネントが呼び出される場合に、ランタイムにおいて前記特定のコントラクトのチェックを迂回させることができる第１のエントリポイントを有し、前記複数のコンポーネントの１または複数の他のコンポーネントの第２のセットによって前記特定のコンポーネントが呼び出される場合に、ランタイムにおいて前記特定のコントラクトをチェックさせる第２のエントリポイントを有する実行可能コードの部分を生成することを含む、ことと、
を実行するようシステムを構成する、システム。
【請求項２】
前記特定のコンポーネントは前記システムに挙動を実行するよう命令し、前記特定のコントラクトは、前記挙動を変更することなく前記特定のコントラクトのチェックを削除できるように、意味的に構造化されている、請求項１に記載のシステム。
【請求項３】
各コントラクトが、前記対応するコンポーネントのインターフェースを使用して、前記対応するコンポーネントの呼び出し元に意味的にアクセス可能である、請求項１に記載のシステム。
【請求項４】
コントラクトが対応するコンポーネントの事前条件である、請求項１に記載のシステム。
【請求項５】
コントラクトが対応するコンポーネントの事後条件である、請求項１に記載のシステム。
【請求項６】
ランタイムにおいて遭遇した前記特定の述部が真ではない場合、前記システムは、前記特定のコンポーネントの前記実行スコープの外で外部回復コードを実行するよう構成される、請求項１に記載のシステム。
【請求項７】
ランタイムにおいて遭遇した前記特定の述部が真ではない場合、前記システムは、前記特定の述部が真ではないことに応答して回復コードが実行されないように、前記特定のコンポーネントの呼び出しを控えるよう構成される、請求項１に記載のシステム。
【請求項８】
前記システムはまた、述部が外部から見える副作用を含むような少なくともいくつかの条件を検出するように構成される、請求項１に記載のシステム。
【請求項９】
前記システムはまた、前記１または複数の実行可能バイナリを記憶装置上に格納するように構成される、請求項１に記載のシステム。
【請求項１０】
前記システムはまた、
前記複数のコンポーネントの別のコンポーネントに対応する別のコントラクトの別の述部が、前記別のコンポーネントのランタイムにおいて常に真であると判定し、
前記複数のコンポーネントのための前記実行可能コードを１または複数の実行可能バイナリ内に生成するときに、前記別の述部が前記別のコンポーネントのランタイムにおいて常に真であると判定されたことに基づいて、前記別のコンポーネントのための実行可能コードの第３の部分であって、前記別のコントラクトおよび前記別の述部に対応する実行可能コードがない、実行可能コードの第３の部分を生成するように構成される、請求項１に記載のシステム。
【請求項１１】
１または複数のハードウェアプロセッサを含むコンピュータシステムで実装される、中間言語プログラムコードの静的解析を実行するための方法であって、
前記１または複数のハードウェアプロセッサが、前記中間言語プログラムコードにおいて複数のコンポーネントを識別することであって、各コンポーネントは異なる実行スコープを備え、対応するコントラクトを含み、各コントラクトは、前記対応する実行スコープのランタイムにおいて当該コントラクトに遭遇した場合、前記コントラクトの述部が真であるかを、前記対応する実行スコープの以降の実行の条件とする、ことと、
前記１または複数のハードウェアプロセッサが、前記複数のコンポーネントの特定のコンポーネントに対応する特定のコントラクトの特定の述部が、前記特定のコンポーネントのランタイムにおいて常に真とは限らないと判定することと、
前記１または複数のハードウェアプロセッサが、前記複数のコンポーネントのための実行可能コードを１または複数の実行可能バイナリ内に生成することであって、前記特定のコンポーネントのための前記実行可能コードを生成するときに、前記複数のコンポーネントの１または複数の他のコンポーネントの第１のセットによって前記特定のコンポーネントが呼び出される場合に、ランタイムにおいて前記特定のコントラクトのチェックを迂回
させることができる第１のエントリポイントを有し、前記複数のコンポーネントの１または複数の他のコンポーネントの第２のセットによって前記特定のコンポーネントが呼び出される場合に、ランタイムにおいて前記特定のコントラクトをチェックさせる第２のエントリポイントを有する実行可能コードの部分を生成することを含む、ことと、
を含む方法。
【請求項１２】
前記静的解析は、リファクタリングツール、検証ツール、自動化ドキュメンテーションジェネレータの少なくとも１つによって実行される、請求項１１に記載の方法。
【請求項１３】
コントラクトが対応するコンポーネントの事前条件である、請求項１１に記載の方法。
【請求項１４】
コントラクトが対応するコンポーネントの事後条件である、請求項１１に記載の方法。
【請求項１５】
ランタイムにおいて遭遇した前記特定の述部が真ではない場合、前記特定のコンポーネントの前記実行スコープの外で外部回復コードが実行される、請求項１１に記載の方法。
【請求項１６】
ランタイムにおいて遭遇した前記特定の述部が真ではない場合、前記特定の述部が真ではないことに応答して回復コードが実行されないように、前記特定のコンポーネントの呼び出しを控える、請求項１１に記載の方法。
【請求項１７】
前記１または複数のハードウェアプロセッサが、前記１または複数の実行可能バイナリを１または複数のハードウェア記憶装置上に格納することをさらに含む、請求項１１に記載の方法。
【請求項１８】
前記複数のコンポーネントの別のコンポーネントに対応する別のコントラクトの別の述部が、前記別のコンポーネントのランタイムにおいて常に真であると判定することと、
前記複数のコンポーネントのための前記実行可能コードを１または複数の実行可能バイナリ内に生成するときに、前記別の述部が前記別のコンポーネントのランタイムにおいて常に真であると判定されたことに基づいて、前記別のコンポーネントのための実行可能コードの第３の部分であって、前記別のコントラクトおよび前記別の述部に対応する実行可能コードがない、実行可能コードの第３の部分を生成することと、をさらに含む、請求項１１に記載の方法。
【請求項１９】
コンピュータシステムの１または複数のハードウェアプロセッサによって実行され得るコンピュータ実行可能命令が記憶されたコンピュータ可読記憶媒体であって、前記コンピュータ実行可能命令は、中間言語プログラムコードの静的解析の一環として少なくとも以下の、
前記中間言語プログラムコードにおいて複数のコンポーネントを識別することであって、各コンポーネントは異なる実行スコープを備え、対応するコントラクトを含み、各コントラクトは、前記対応する実行スコープのランタイムにおいて当該コントラクトに遭遇した場合、前記コントラクトの述部が真であるかを、前記対応する実行スコープの以降の実行の条件とする、ことと、
前記複数のコンポーネントの第１のコンポーネントに対応する第１のコントラクトの第１の述部が、前記複数のコンポーネントの前記第１のコンポーネントのランタイムにおいて常に真であると判定することと、
前記複数のコンポーネントの第２のコンポーネントに対応する第２のコントラクトの第２の述部が、前記複数のコンポーネントの前記第２のコンポーネントのランタイムにおいて常に真とは限らないと判定することと、
前記複数のコンポーネントのための実行可能コードを１または複数の実行可能バイナリ内に生成することであって、
前記複数のコンポーネントの前記第１のコンポーネントのための前記実行可能コードを生成するときに、前記第１の述部が前記複数のコンポーネントの第１のコンポーネントのランタイムにおいて常に真であると判定されたことに基づいて、前記第１のコントラクトおよび前記第１の述部に対応する実行可能コードがない、実行可能コードの第１の部分を生成すること、および
前記複数のコンポーネントの前記第２のコンポーネントのための前記実行可能コードを生成するときに、前記複数のコンポーネントの１または複数の他のコンポーネントの第１のセットによって前記第２のコンポーネントが呼び出される場合に、ランタイムにおいて前記第２のコントラクトのチェックを迂回させることができる第１のエントリポイントを有し、前記複数のコンポーネントの１または複数の他のコンポーネントの第２のセットによって前記第２のコンポーネントが呼び出される場合に、ランタイムにおいて前記第２のコントラクトをチェックさせる第２のエントリポイントを有する実行可能コードの第２部分を生成することを含む、ことと、
を実行するよう前記コンピュータシステムを構成する、コンピュータ可読記憶媒体。
【請求項２０】
ランタイムにおいて遭遇した前記第２の述部が真ではない場合、前記コンピュータシステムは、前記第２の述部が真ではないことに応答して回復コードが実行されないように、前記複数のコンポーネントの第２のコンポーネントの呼び出しを控えるよう構成される、請求項１９に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]  コンピュータおよびコンピューティングシステムは、現代生活のほぼすべての側面に影響を及ぼしている。コンピュータは、仕事、レクリエーション、保健医療、輸送、娯楽、家庭経営などに広く関わっている。コンピュータ機能は、典型的には、コンピューティングシステムがソフトウェアコードを実行した結果である。
【０００２】
[0002]  現代のソフトウェアコードの大部分は、発見、報告、およびエラー状態からの復帰を目的としたものである。現実の状況においては、エラー状態は比較的まれであり、シミュレーションするのが難しい場合が多いにもかかわらず、プログラマはエラー状態の処理に相当量のリソースを充てている。
【０００３】
[0003]  ソフトウェアシステム内では、エラー回復コードに、システム内の全コード数に比して過度に多いバグが存在する。このことは、エラー状態は、シミュレーションするのが難しい場合が多いため試験を経ないままになることもよくあり、やがて顧客が実地運用する際に根本的な問題となって現れるという事実と直接的に相関する。不適切なエラー回復ロジックは複合的なエラーをもたらし、最終的にはクラッシュおよびデータ破損を招く可能性がある。
【０００４】
[0004]  従来のソフトウェアシステムは、様々なタイプのエラー状態を混在させつつ、これらのエラー状態を処理するための単一のメカニズムを提供している。この画一性は、開発者がシステムに対して一貫した単一の方法でエラー状態を判断できるようにするため、表面上は魅力的である。その反面、この画一性はエラーにおける定性的差異を不明瞭にしてしまう。
【０００５】
[0005]  本明細書において特許請求される主題は、上述のような環境においてのみいかなる欠点をも解決する実施形態または動作する実施形態に限定されるものではない。むしろ、上記の背景は、本明細書に記載するいくつかの実施形態が実施され得る典型的な１つの技術分野を例示するためにのみ提供される。
【発明の概要】
【０００６】
[0006]  本明細書に記載する少なくとも１つの実施形態では、フロントエンドコンパイラがソースコードを中間コードにコンパイルするシステムについて説明する。中間コードは後でバイナリコードに変換することができる。ソースコードはコントラクトチェックを含む。実行スコープのランタイムにおいてこのチェックに遭遇した場合、その実行スコープの以降の実行は、コントラクトに関連付けられた述部が真であるか否かを条件とする。述部が真ではない場合、実行スコープは実行されなくなる。例えば、実行スコープが１つのプログラムであったと仮定すると、このプログラムは内部のエラー回復ロジックを実行することなく中断する。任意選択により外部のエラー回復ロジックを実行してもよい。
【０００７】
[0007]  フロントエンドコンパイラはコントラクトチェックを保持するように動作し、その結果、このチェックはプログラムの意味解析によって引き続き理解され得るような意味構造を維持する。それゆえ、チェックは、中間コードに作用する静的解析ツールによって理解され得る。
【０００８】
[0008]  例えば、静的解析コードは、中間コードに基づいてバイナリを生成するバックエンドコンパイラであってもよい。あるタイプの解析として、コントラクトチェックに関連付けられた述部がすべての条件下で真となるか否かを判定し、ランタイムでのチェックの実行を差し控えるものが考えられる。別のタイプの解析として、チェックに関連付けられた実行が特定の条件下（実行コンポーネントが別のコンポーネントによって呼び出されるなど）で真となるか否かを判定し、その条件が満たされるときにランタイムでのチェックを差し控えるものが考えられる。さらに別のタイプの解析として、チェックに関連付けられた述部が常に偽となるか否かを判定し、プログラムにバグが含まれていることをプログラマに対して警告するものが考えられる。中間コードに作用することができる他のタイプの静的アナライザには、リファクタリングツール、検証ツール、自動化ドキュメンテーションジェネレータなどが含まれる。
【０００９】
[0009]  「発明の概要」は、特許請求された主題の主な特徴または本質的特徴を特定することを意図するものではなく、また、特許請求された主題の範囲を決定する際の助けとして用いられることを意図するものでもない。
【００１０】
[0010]  上述した利点および特徴、ならびに他の利点および特徴を取得できる方法を記載するため、添付図面を参照することにより、様々な実施形態についてさらに詳細に説明する。これらの図面は例示的な実施形態を示すに過ぎず、したがって、本発明の範囲を限定するものと解釈すべきではないことを理解し、以下の添付図面を用いて、実施形態についてさらに具体的かつ詳細に記載し、説明する。
【図面の簡単な説明】
【００１１】
【図１】[0011]本明細書に記載するいくつかの実施形態が採用され得るコンピューティングシステムを抽象的に示す図である。
【図２】[0012]ソースコードで表現されたコントラクトおよびアサーション（すなわちコントラクトチェック）が意味的に保持されるような方法、かつ、ソースコードで表現された挙動が残されるような方法で、ソースコードが中間言語コードにコンパイルされる環境の概略図である。
【図３Ａ】[0013]事前条件の形式でのコントラクトを有するコンポーネントに実行フローが到達している環境を示し、事前条件が満たされない場合に発生し得るフェイルファストを示す図である。
【図３Ｂ】[0014]事後条件の形式でのコントラクトを有するコンポーネントに実行フローが到達している環境を示し、事後条件が満たされない場合に発生し得るフェイルファストを示す図である。
【図４Ａ】[0015]各コンポーネントが事前条件の形式でのコントラクトを含む、ソースコード内または中間言語コード内で表現された可能なコンポーネント呼び出しのチェーンを示す図である。
【図４Ｂ】[0016]実行フローがいくつかのコントラクトチェックを削除するように最適化され、かつ、コントラクトに対するチェックを条件付きで要求するコンポーネントのために複数のエントリポイントを含むように最適化されている、バイナリコードで表現された可能なコンポーネント呼び出しのチェーンを示す図である。
【図５Ａ】[0017]送信側プロセスから見た、プロセス間通信を実現するメソッド５００Ａのフローチャート図である。
【図５Ｂ】[0018]受信側プロセスから見た、プロセス間通信を実現するメソッド５００Ａのフローチャート図である。
【図６】[0019]プロセス間通信が発生し得る環境の図である。
【発明を実施するための形態】
【００１２】
[0020]  本明細書に記載する実施形態では、フロントエンドコンパイラがソースコードを中間コードにコンパイルするシステムについて説明する。中間コードは後でバイナリコードに変換することができる。ソースコードはコントラクトを含む。実行スコープのランタイムにおいてこのコントラクトに遭遇した場合、その実行スコープの以降の実行は、コントラクトに関連付けられた述部が真であるか否かを条件とする。述部が真ではない場合、実行スコープは実行されなくなる。例えば、実行スコープが１つのプログラムであったと仮定すると、このプログラムは内部のエラー回復ロジックを実行することなく中断する。任意選択により外部のエラー回復ロジックを実行してもよい。
【００１３】
[0021]  フロントエンドコンパイラはコントラクトを保持するように動作し、その結果、コントラクトはコントラクトの意味解析によって引き続き理解され得るような意味構造を維持する。それゆえ、コントラクトは、中間コードに作用する静的解析ツールによって理解され得る。このような静的解析ツールは、バックエンドコンパイラ、リファクタリングツール、検証ツール、自動化ドキュメンテーションジェネレータなどを含んでもよい。
【００１４】
[0022]  図１を用いて、コンピューティングシステムの導入的検討を行う。次に図２〜図６を用いて、例示的システムおよびその例示的動作について上記の順に説明する。
【００１５】
[0023]  コンピューティングシステムは、現代においてますます多様な形態をとりつつある。コンピューティングシステムには、例えば、ハンドヘルドデバイス、電気製品、ラップトップコンピュータ、デスクトップコンピュータ、メインフレーム、分散コンピューティングシステム、さらに、従来ではコンピューティングシステムと見なされなかった装置までもが含まれる。本記載および特許請求の範囲における「コンピューティングシステム」という用語は広義に定義され、少なくとも１つの実体ある物理プロセッサと、プロセッサにより実行可能なコンピュータ実行可能命令を保持できる実体ある物理メモリとを含む、任意のデバイスもしくはシステム（またはこれらの組み合わせ）を含んでいる。このメモリはいかなる形態をとってもよく、コンピューティングシステムの性質および形態に依存しても構わない。コンピューティングシステムはネットワーク環境に分散化されてもよいし、複数のコンピューティングシステムをその構成要素として含んでもよい。
【００１６】
[0024]  図１に示すように、コンピューティングシステム１００は、最も基本的な構成において、少なくとも１つの処理装置１０２とコンピュータ可読媒体１０４とを含む。コンピュータ可読媒体１０４は、概念的に、揮発性、不揮発性、または両者の何らかの組み合わせである物理システムメモリを含むものと考えられる。コンピュータ可読媒体１０４はまた、概念的に不揮発性大容量記憶装置を含む。コンピューティングシステムが分散化されている場合、処理、記憶および／または格納の各機能も分散化され得る。
【００１７】
[0025]  本明細書で使用する「実行可能モジュール」または「実行可能コンポーネント」という用語は、このコンピューティングシステム上で実行可能なソフトウェアオブジェクト、ルーティング、またはメソッドを指すことがある。本明細書に記載する様々なコンポーネント、モジュール、エンジン、およびサービスは、このコンピューティングシステム上で実行されるオブジェクトまたはプロセスとして（例えば、個別のスレッドとして）実装され得る。このような実行可能モジュールは、タイプセーフが強制され、かつ、プロセスがその固有のメモリオブジェクトに割り当てられるような、管理された環境下で実行される場合、マネージドコードであり得る。このような実行可能モジュールは、ＣまたはＣ＋＋などのネイティブコードで記述されている実行可能モジュールである場合、アンマネージドコードでもあり得る。
【００１８】
[0026]  以下の記載では、実施形態を、１つまたは複数のコンピューティングシステムにより実行される動作に関して説明する。このような動作がソフトウェアに実装される場合、この動作を実行する関連コンピューティングシステムの１つまたは複数のプロセッサは、コンピュータ実行可能命令を実行したことに応答してコンピューティングシステムの演算を命令する。例えば、このようなコンピュータ実行可能命令は、１つのコンピュータプログラム製品を成す１つまたは複数のコンピュータ可読媒体上に具現化することができる。このような演算の一例として、データの操作が挙げられる。コンピュータ実行可能命令（および操作されたデータ）は、コンピューティングシステム１００のメモリ１０４に格納することができる。コンピューティングシステム１００はまた、コンピューティングシステム１００が、例えばネットワーク１１０を介して、他のプロセッサと通信できるようにするための通信チャネル１０８を含んでもよい。
【００１９】
[0027]  本明細書に記載する実施形態は、以下にさらに詳細に検討するように、例えば、１つまたは複数のプロセッサおよびシステムメモリなどのコンピュータハードウェアを含む専用コンピュータまたは汎用コンピュータを備えるか、または利用できる。本明細書に記載する実施形態はまた、コンピュータ実行可能命令および／またはデータ構造を搬送または格納するための、物理的なコンピュータ可読媒体および他のコンピュータ可読媒体を含む。このようなコンピュータ可読媒体は、汎用コンピュータシステムまたは専用コンピュータシステムによりアクセスすることができる、いかなる利用可能な媒体であってもよい。コンピュータ実行可能命令を格納するコンピュータ可読媒体は、物理的記憶媒体である。コンピュータ実行可能命令を搬送するコンピュータ可読媒体は、伝送媒体である。したがって、本発明の実施形態は、限定ではなく例示として、少なくとも２つの明らかに異なるタイプのコンピュータ可読媒体、すなわちコンピュータ記憶媒体および伝送媒体を備えることができる。
【００２０】
[0028]  コンピュータ記憶媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭもしくは他の光学ディスク記憶装置、磁気ディスク記憶装置もしくは他の磁気記憶装置、またはコンピュータ実行可能命令もしくはデータ構造の形式での所望のプログラムコード手段を格納するために使用することができ、かつ、汎用コンピュータまたは専用コンピュータによりアクセスすることができる、他の任意の実体ある記憶媒体を含む。
【００２１】
[0029]  「ネットワーク」は、コンピュータシステムおよび／またはモジュールおよび／または他の電子デバイスの間で電子データの移送を可能にする１つまたは複数のデータリンクとして定義される。情報が、ネットワークまたは別の通信接続（有線、無線、または有線もしくは無線の組み合わせのいずれか）を介してコンピュータに転送または提供されるとき、コンピュータは、その接続を伝送媒体と適切に見なす。伝送媒体は、コンピュータ実行可能命令またはデータ構造の形式での所望のプログラムコード手段を搬送または移送するために使用することができ、かつ、汎用コンピュータまたは専用コンピュータによりアクセスすることができる、ネットワークおよび／またはデータリンクを含むことができる。上記のものの組み合わせもまた、コンピュータ可読媒体の範囲内に含めるべきである。
【００２２】
[0030]  さらに、コンピュータ実行可能命令またはデータ構造の形式でのプログラムコード手段は、種々のコンピュータシステムコンポーネントに到達するとすぐに、伝送媒体からコンピュータ記憶媒体へ自動的に転送され得る（逆もまた同様）。例えば、ネットワークまたはデータリンクを介して受け取ったコンピュータ実行可能命令またはデータ構造を、ネットワークインターフェースコントローラ（「NIC」など）内のＲＡＭにバッファリングすることが可能であり、そして最終的にはコンピュータシステムＲＡＭへ、および／またはコンピュータシステムにおける低揮発性コンピュータ記憶媒体へ転送することが可能である。したがって、コンピュータ記憶媒体は、伝送媒体も（または、さらには伝送媒体を主として）利用するコンピュータシステムコンポーネントに含めることができると理解すべきである。
【００２３】
[0031]  コンピュータ実行可能命令は、例えば、プロセッサで実行される際に汎用コンピュータ、専用コンピュータ、または専用処理装置に特定の機能または機能群を実行させる命令およびデータを備える。コンピュータ実行可能命令は、例えば、バイナリ、アセンブリ言語などの中間形式の命令、またはさらにはソースコードであってもよい。本主題は、構造的特徴および／または方法論的な動作に特有の言語で記載されているが、添付の特許請求の範囲に定義される主題は上述の特徴または動作に必ずしも限定されないと理解すべきである。むしろ、記載された特徴および動作は、特許請求の範囲を実施する例示的形態として開示するものである。
【００２４】
[0032]  当業者であれば理解するであろうが、本発明は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、メッセージプロセッサ、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースの家電製品またはプログラム可能な家電製品、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、携帯電話、ＰＤＡ、ページャ、ルータ、スイッチなどを含む、多くのタイプのコンピュータシステム構成を有するネットワークコンピューティング環境において実施できる。本発明はまた、ネットワークを介してリンクされる（有線データリンク、無線データリンク、または有線データリンクおよび無線データリンクの組み合わせのいずれかにより）、ローカルコンピュータシステムおよびリモートコンピュータシステムの両方がタスクを実行する分散システム環境において実施されてもよい。分散システム環境では、プログラムモジュールを、ローカルの記憶装置およびリモートの記憶装置の両方に配置してもよい。
【００２５】
[0033]  図２は、コンパイラ２１０を備えるシステム２００を示す。コンパイラ２１０は、例えば、コンピューティングシステム１００を使用して動作する。例として、コンピューティングシステム１００は、１つのコンピュータプログラム製品を構成する１つまたは複数のコンピュータ可読記憶媒体に格納されたコンピュータ実行可能命令にアクセスできる。コンピューティングシステム１００は、プロセッサ１０２を使用してこれらのコンピュータ実行可能命令を実行することで、コンピューティングシステムにコンパイラ２１０をインスタンス化かつ／または動作させることができる。
【００２６】
[0034]  これに応答して、コンパイラ２１０はソースコード２０１にアクセスし、中間言語コード２１１を生成する。中間言語コード２１１は、「バイナリコード」または「バイナリ」としばしば称されるマシン実行可能コードに変換しない限り、コンピューティングシステムが直接実行することはできない。しかしながら、中間言語コード２１１は、静的解析ツール２２０による静的解析が可能である。
【００２７】
[0035]  ソースコード２０１は、図示したように、２つのコントラクト２０２Ａおよび２０２Ｂを含む。ここで、３点リーダ２０２Ｃは、ソースコード内に任意の数のコントラクトが存在し得ることを示す。コントラクト２０２Ａ、２０２Ｂ、および２０２Ｃを、これ以降、集合的に「コントラクト２０２」とも称する。各コントラクトは、バイナリが実際に実行されるランタイム環境において遭遇した述部が真であるか否かに応じて、実行スコープのさらなる実行を条件付ける。「実行スコープ」とは、コンパイラ２１０によってコンパイルされるプログラムならびにコンパイルの一環としてプログラムに渡される任意のコードとして定義される。
【００２８】
[0036]  例えば、コントラクトをコンポーネントの事前条件に関連付け、その場合、コンポーネントが呼び出されるときに、事前条件を評価することによりコンテキストがチェックされるようにしてもよい。事前条件が真でない場合、コンポーネントは実行されない。例えば、図３Ａは、実行フロー３０１Ａがコンポーネント３１０Ａに到達している環境３００Ａを示す。コントラクト３１１Ａは関連付けられた述部３１２Ａを有する。述部３１２Ａは、事前条件が満たされたか否かを判定するために検証される。述部３１２Ａが真である場合、コンポーネント３１０Ａのロジック３１３Ａが実行され、実行フロー３０１Ａは正常に継続する。しかし、述部３１２Ａが真ではない場合、コンポーネント３１０Ａのロジック３１３Ａは実行されず、代わりに実行フロー３０１Ａはフェイルファストイベントに遭遇する。
【００２９】
[0037]  フェイルファストイベントは、実行コンテキスト（すなわち、コンパイルされたプログラム）が実行の継続を許可されていないことを意味する。エラー回復ロジックが実行される場合、このエラー回復ロジックは内部から実行コンテキストに提供されるのではない。むしろ、エラー回復ロジックは、仮に実行されたとしても、実行スコープの範囲外で実行される外部エラー回復ロジックである。
【００３０】
[0038]  コントラクトをコンポーネントの事後条件に関連付け、その場合、コンポーネントが呼び出されるときに、コンポーネントのロジックが実行されて初めて事後条件がチェックされるようにしてもよい。例えば、図３Ｂは、実行フロー３０１Ｂがコンポーネント３１０Ｂに到達している環境３００Ｂを示す。次に、コンポーネントのロジック３１３Ｂが実行される。ロジック３１３Ｂが完了した後、実行フロー３０１Ｂは、述部３１２Ｂが関連付けられたコントラクト３１１Ｂに遭遇する。この時点で、述部３１２Ｂは、事後条件が満たされたか否かを判定するために検証される。述部３１２Ｂが真である場合、実行フロー３０１Ｂはコンポーネント３１０Ｂから出て、正常に継続する。しかし、述部３１２Ｂが真ではない場合、実行フロー３０１Ｂはフェイルファストイベントに遭遇する。
【００３１】
[0039]  図２に戻ると、ソースコード２０１はまた、図示したように、３つの挙動２０３Ａ、２０３Ｂ、および２０３Ｃを含んでいる。ここで、３点リーダ２０３Ｄは、ソースコード２０１内に任意の数のコントラクトが存在し得ることを示す。挙動２０３Ａ、２０３Ｂ、２０３Ｃ、および２０３Ｄを、これ以降、集合的に「挙動２０３」とも称する。挙動は、プログラムのロジックに関連付けられた実際のアクションである。例えば、図３Ａおよび図３Ｂを参照すると、挙動２０３は、実際にはコンポーネント２１０Ａおよびコンポーネント２１０Ｂそれぞれのロジック２１３Ａおよびロジック２１３Ｂの一部である。
【００３２】
[0040]  コンパイラ２１０は、挙動２０３がすべて保持されるように中間言語コード２１１を生成する。換言すれば、中間言語コード２１１が後でバイナリコードに変換されるとき、このバイナリコードはこれらの挙動を引き起こすバイナリ命令を含んでいる。中間言語コード２１１はまた、意味的に構造化された方法でコントラクト２０２を含み、その結果、命令された挙動２０３を変更することなく、コントラクトを中間言語コード２１１から削除することができる。
【００３３】
[0041]  いくつかの実施形態において、コンパイラ２１０は少なくともいくつかの条件を検出するように構成されており、その条件下では述部が外部から見える副作用を含んでいる。その場合、コンパイラ２１０は、コンパイルプロセスでエラーを送出することで、ソースコード２０１の作者が、外部から見える副作用を、当該の述部を含むコントラクトまたはアサーションから除去する修正を施せるようにして、外部から見える副作用を存在させない。このようにして、コンパイル後も残っているコントラクト２０２を、外部から見える副作用がないものとして扱えるようになる。
【００３４】
[0042]  事前条件であるコントラクト２０２は、実行可能コンポーネントの呼び出し元がコンポーネント呼び出しの前にコントラクトの意味理解を得るように、意味的に構造化されている。例えば、図３Ａの場合を取り上げると、コントラクト３１１Ａは、コンポーネント３１０Ａの呼び出し元に意味論的にアクセス可能になる。したがって、呼び出し元は、コンポーネント３１０Ａのアプリケーションプログラムインターフェース（API）に対する意味理解を得るのと同様に、コントラクト３１２Ａに対する意味理解も得る。したがって、ランタイムにおいて、第２コンポーネントを呼び出す第１コンポーネントは、第２コンポーネントを呼び出す前に、まず第２コンポーネントのコントラクトが満たされるか否かを確認するチェックを行うことができる。第１コンポーネントは、コントラクトが満たされると判定した場合、呼び出しを実行できる。しかし、第１コンポーネントは、コントラクトが満たされないと判定した場合、第２コンポーネントを呼び出すとフェイルファストイベントを引き起こしてしまうため、呼び出しを控える。次いで、第１コンポーネントが代替実行パスを試行するように構成されることで、無駄なフェイルファストイベントを回避できる。
【００３５】
[0043]  システム２００はまた静的解析ツール２２０を含む。静的解析ツール２２０は、中間言語コード２１１内に含まれるコントラクトチェック２０２の実行を含む、中間言語コード２１１を評価するように構成されている。静的解析ツール２２０の様々な例を取り上げるが、このような例は相互排他的なものではない。中間言語コード２１１を、そこに包含されるコントラクト２０２を含めて静的に解析する静的解析ツール２２０は、複数存在し得る。
【００３６】
[0044]  静的アナライザ２２０は、例えば、コンピューティングシステム１００を使用して動作する。例として、コンピューティングシステム１００は、１つのコンピュータプログラム製品を構成する１つまたは複数のコンピュータ可読記憶媒体に格納されたコンピュータ実行可能命令にアクセスできる。コンピューティングシステム１００は、プロセッサ１０２を使用してこれらのコンピュータ実行可能命令を実行することで、コンピューティングシステムに静的アナライザ２２０をインスタンス化かつ／または動作させることができる。
【００３７】
[0045]  一例として、静的アナライザは、中間言語コード２１１に基づきバイナリを生成するバックエンドコンパイラであってもよい。対照的に、コンパイラ２１０はフロントエンドコンパイラと見なすことができる。フロントエンドコンパイラはソースコードを中間言語コードに変換する。結果としての中間言語コードをバックエンドコンパイラがマシンコードに変換する。バックエンドコンパイラ２２０は、中間言語コード２１１内のコントラクト２０２の意味構造にアクセスして、この意味知識に基づいて任意の数の最適化を行うことができる。次に、図４Ａおよび図４Ｂを用いて、このような最適化のいくつかを説明する。
【００３８】
[0046]  図４Ａは、ソースコードまたは中間言語コードで表現された、考えられるコンポーネント呼び出しのチェーン４００Ａを示す。チェーン４００Ａは、事前条件として関連付けられたコントラクト４１１〜４１５をそれぞれ備える５つのコンポーネント４０１Ａ〜４０５Ａを含む。コンポーネント４０１Ａはコンポーネント４０２Ａを呼び出すことができるが、この呼び出しはコントラクト４１２が満たされているという条件で実行される。コンポーネント４０２Ａはコンポーネント４０３Ａを呼び出すことができるが、この呼び出しはコントラクト４１３が満たされているという条件で実行される。コンポーネント４０３Ａはコンポーネント４０４Ａを呼び出すことができるが、この呼び出しはコントラクト４１４が満たされているという条件で実行される。コンポーネント４０５Ａも同様にコンポーネント４０４Ａを呼び出すことができるが、この呼び出しはコントラクト４１４が満たされているという条件で実行される。チェーン４００Ａは、ソースコードで表現された、したがって中間言語コード２１１で表現されたコントラクト２０２および挙動２０３の意味構造によって表された、可能な実行フローを示す。
【００３９】
[0047]  バックエンドコンパイラは、中間言語を静的に解析してチェーン４００Ａの概念を定式化することができる。バックエンドコンパイラは、関連付けられたコンポーネントのコントラクトの述部が常に真であるか否かを判定しようと試みるために、静的解析を実行するように構成されている。この判定は、ランタイムに発生し得たことに関するバックエンドコンパイラの知識に基づいて行われる。バックエンドコンパイラは、述部が常に真であると判定した場合、コントラクトチェックを完全に削除することでバイナリを最適化することができる。
【００４０】
[0048]  例えば、図４Ａを参照して、コンポーネント４０２Ａが呼び出された時点で、コントラクト４１２に関連付けられた述部が常に真であるとバックエンドコンパイラが判定したとする。その場合、このコンパイラは、インタラクションが発生した場合、ランタイムにおけるコントラクトのチェックを不要にするバイナリを生成する。図４Ｂは、中間言語チェーン４００Ａと機能的挙動が同じであるバイナリコンポーネントチェーン４００Ｂを示す。具体的には、中間言語コンポーネント４０１Ａ〜４０５Ａのロジックがそれぞれ対応するバイナリコンポーネント４０１Ｂ〜４０５Ｂによって実装される。ここで留意すべきは、バイナリコンポーネント４０２Ｂがコントラクト４１２をチェックしないことで、バイナリコンポーネント４０２Ｂの実行を効率化している点である。
【００４１】
[0049]  同様に、バックエンドコンパイラは、コンポーネント４０３Ａが呼び出された時点で、コントラクト４１３に関連付けられた述部が常に真であると判定する。そのため、コントラクト４１３のチェックが行われることなく、対応するバイナリコンポーネント４０３Ｂが生成される。ここでもまたバイナリコンポーネント４０３の実行が効率化される。
【００４２】
[0050]  バックエンドコンパイラは、コンポーネント４０４Ａがコンポーネント４０３Ａによって呼び出された場合、コントラクト４１４が満たされると判定する（すなわち、コントラクトに関連付けられた述部が満たされることを、バックエンドコンパイラが判定できる）。しかし、バックエンドコンパイラは、コンポーネント４０４Ａがコンポーネント４０５Ａによって呼び出された場合、コントラクト４１４が満たされるか否かを判定できない（すなわち、コントラクトに関連付けられた述部が真となることを、バックエンドコンパイラが検証できない）。この場合、２つのエントリポイントを持つバイナリコンポーネント４０４Ｂが作成される。片方のエントリポイント４２２はコントラクト４１４のチェックを迂回させることができ、この例ではバイナリコンポーネント４０３Ｂの適切なエントリポイントとなる。他方のエントリポイント４２１は、コントラクト４１４をチェックさせ、この例ではバイナリコンポーネント４０５Ｂの適切なエントリポイントとなる。
【００４３】
[0051]  静的アナライザ２２０はまた、フロントエンドコンパイラ２１０と連携して、述部に外部から見える副作用が含まれないように保証することができる。言うまでもなく、述部のランタイム評価は処理サイクルを消費するが、この評価は、通常ならあるはずの影響をコンポーネントのロジックにも、コンパイル中のプログラムの意味的に表現された挙動２０３にも及ぼすことがない。述部には、プログラム外の外部から識別可能な結果をもたらさない、いくつかの副次的な計算が含まれている可能性がある。しかしながら、これは、上記の記載および特許請求の範囲においては「副作用」と見なされない。外部から見える副作用が存在していないことを保証することで、プログラムは、コントラクトチェックの存在の有無にかかわらず、外部から識別可能な同じ挙動で実行されるようになる。コントラクトチェックは、プログラムの作成および試験のために含まれていることがしばしばであっても、プログラムの出荷前にたいてい削除されるので、これは有用である。したがって、試験用のプログラムの挙動は、プログラム出荷後の挙動と同じになる。
【００４４】
[0052]  静的アナライザ２２０は、リファクタリングツール、検証ツール、自動化ドキュメンテーションジェネレータであってもよく、および／または中間言語コード２１１内で意味的に表現されたコントラクト２０２を使用して、中間言語コード２１１に対し他の任意のタイプの静的解析を実行してもよい。例えば、静的アナライザ２２０は、コントラクトに関連付けられた述部が常に偽となると判定して、プログラムにバグが含まれていることをプログラマに対して警告してもよい。
【００４５】
[0053]  このように、本明細書に記載する原則は、コントラクトを含む中間言語コードに対し強力かつインテリジェントな静的解析を可能にし、また、あるコンポーネントが別のコンポーネントを呼び出す際にバイナリに対する顕著な最適化を可能にする。これらの原則は、１つのプロセスが別のプロセスからコンポーネントを呼び出す場合にまで、その適用範囲を広げることができる。
【００４６】
[0054]  図５Ａおよび図５Ｂはそれぞれ、プロセス間通信を実現するメソッド５００Ａおよびメソッド５００Ｂのフローチャートを示す。メソッド５００Ａは、実行される場合、図５Ｂのメソッド５００Ｂに先行して実行される。メソッド５００Ｂ（および実行される場合のメソッド５００Ａ）は、プロセス間呼び出しのチャネル内に概念的に常駐する抽象化レイヤによって遂行され得る。図６は、プロセス間通信が発生し得る環境６００を示す。したがって、図６の環境６００を頻繁に参照しながら、図５Ａおよび図５Ｂについて説明する。
【００４７】
[0055]  図５Ａのメソッド５００Ａは、第１プロセス内の第１コンポーネントが第２プロセス内の第２コンポーネントとのプロセス間通信を要求したことの検出（動作５０１）に応答して実行される。例えば、図６の環境６００において、プロセス６１１内のコンポーネント６０１がプロセス６１２内のコンポーネント６０２に通信を送出すると仮定する。すると、プロセス６１１内のチャネルコンポーネント６２１によってメソッド５００Ａが実行される一方で、プロセス６１２内のチャネルコンポーネント６２２によってメソッド５００Ｂが実行される。メソッド５００Ａおよびメソッド５００Ｂの作用は、コンポーネント６０１およびコンポーネント６０２から隠される。コンポーネント６０１およびコンポーネント６０２からは、通信がプロセス間チャネル６１０によって実現されているようにしか見えない。
【００４８】
[0056]  プロセス間通信が第１コンポーネント６０１から送出される旨の通知（図５Ａの動作５０１）に応答して、チャネルコンポーネント６２１は、継続実行についてのコントラクトが満たされているか否かを検証する（図５Ａの分岐記号５０２）。コントラクトには、安全なプロセス間通信を可能にするように意図された述部が含まれている。コントラクトが満たされていない場合（分岐記号５０２における「いいえ」）、チャネルコンポーネント６２１は通信を抑制する（動作５０３）。逆に、コントラクトが満たされている場合（分岐記号５０２における「はい」）、チャネルコンポーネント６２１は、ターゲットプロセス内のチャネルコンポーネント６２２に対しプロセス間メッセージを送出する（動作５０４）。
【００４９】
[0057]  図５Ｂは、メソッド５００Ａが既に実行されたかどうかにかかわらず、ターゲットチャネルコンポーネントが到着メッセージを処理する、メソッド５００Ｂのフローチャートを示す。チャネルコンポーネント６２２は、まずプロセス間メッセージを受け取る（動作５１１）。すると、チャネルコンポーネント６２１は、継続実行についてのコントラクトが満たされているか否かを検証する（図５Ｂの分岐記号５１２）。この場合もまた、コントラクトには、安全なプロセス間通信を可能にするように意図された述部が含まれている。
【００５０】
[0058]  コントラクトが満たされていない場合（分岐記号５１２における「いいえ」）、チャネルコンポーネント６２２は通信を抑制し（動作５１３）、さらに、今後においてプロセス６１２と通信するプロセス６１１のいかなる権限も終了させることができる。コントラクトが満たされていないとターゲットチャネルコンポーネント６２２が判定したからには、呼び出し元プロセス６１１がメソッド５００Ａを実行しなかった可能性が高い。ゆえに、このプロセスは安全な通信に対応していないと思われるため、プロセス６１１とプロセス６１２との間のいかなる通信の終了も正当化され得る。このように、フェイルファストを引き起こす可能性があるいかなる欠陥も、その欠陥を含むプロセス内に封じ込めることができる。逆に、コントラクトが満たされている場合（分岐記号５１２における「はい」）、プロセス間通信はターゲットコンポーネント６０２に渡される（動作５１４）。
【００５１】
[0059]  このように、中間言語コードにおけるコントラクトの意味構造の保持。さらに、このような意味構造の使用を通じたバイナリへのコンパイルの最適化について説明した。
【００５２】
[0060]  本発明は、その精神または本質的特徴から逸脱することなく、他の特定の形態で実現することができる。上述の実施形態は、すべての態様において限定的ではなく例示的なものと解釈すべきである。したがって、本発明の範囲は、上記の記載ではなく、むしろ添付の特許請求の範囲によって示される。特許請求の範囲と均等の意味および範囲内での変更は、すべて特許請求の範囲の範囲内に包含される。
【図１】
0006401235.tif 000002
【図２】
0006401235.tif 000003
【図３Ａ】
0006401235.tif 000004
【図３Ｂ】
0006401235.tif 000005
【図４Ａ】
0006401235.tif 000006
【図４Ｂ】
0006401235.tif 000007
【図５Ａ】
0006401235.tif 000008
【図５Ｂ】
0006401235.tif 000009
【図６】
0006401235.tif 000010