説明

コードエラーを減らすためのコントラクトプログラミング

一実施形態において、コンピュータシステムは、アプリケーションAPIを拡大するためのAPI(application programming interface)を提供する。コンピュータシステムは、第1のプログラミング言語で記述されたコントラクトAPIからのコントラクトを用いてアプリケーションAPIを拡大するというユーザの意図を示す、第2のプログラミング言語で記述されたソフトウェアコードを受け取る。ソフトウェアコードは、コントラクトAPIへの参照を含む。コントラクトは、アプリケーションAPIの適切な使用を示すアサーションを含む。コンピュータシステムは、ソフトウェアコード内の参照に従ってコントラクトAPIの一部にアクセスし、受け取ったソフトウェアコードおよびコントラクトAPIの参照された部分を、ソフトウェアコードの中間言語(IL)バージョンにコンパイルする。ILバージョンは、第1のプログラミング言語および第2のプログラミング言語の両方に共通の中間言語におけるものである。ILバージョンは、アプリケーションAPIの適切な使用を示すアサーションを含む。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コードエラーを減らすためのコントラクトプログラミングに関する。
【背景技術】
【0002】
今日の社会においてコンピュータの使用が急増するにつれ、これらのコンピュータ上で稼働するソフトウェアアプリケーションを開発するための方法及びシステムの数も、増加している。ソフトウェアアプリケーションは、使用されているアプリケーションの設計に基づき、多種多様のタスクを実施するために使用することができる。ソフトウェアアプリケーションは一般的には、共に動作して何らかのタイプの所望の最終結果を生成するよう設計された多数の個々のファイルを含む。そのようなソフトウェアアプリケーションを記述ために、ソフトウェア開発者は一般的には、そのアプリケーションに使用するプログラミング言語を決定する。今日、多くのプログラミング言語が使用され、その結果、多くのソフトウェアアプリケーションが異なる言語で記述されている。これらの言語は、お互いに互換性が無いことが多く、異なるシンタックス、異なるコンパイル方法、および他の異なるコード要素を使用するものが少なくない。
【0003】
複数のプログラミング言語の統合および使用をそれらの種々の実装において簡素化するために、マネージドコードを導入して、これらの種々のアプリケーションが相互作用可能であるプラットフォームを提供している。マネージドコードは、とりわけ、アプリケーション開発者がプログラムの属性を特定することを可能にし、それによりそのアプリケーションのある部分を使用しようとする他の開発者は、どのようにすれば最善であるかが分かる。例えば、開発者は、アプリケーションの変数、メソッド、または全体のプロセスに対応する種々の要素を特定することができる。開発者は、例えば、コントラクトまたは仕様において、変数Xが特定の型を有する、または特定の値より大であると記述できる。そのようなアプリケーションコントラクトまたは仕様を使用して、コードがコンパイルされる前に、コード内に生成されるエラーの数を減少させることが多い。
【発明の概要】
【発明が解決しようとする課題】
【0004】
しかしながら、そのようなアプリケーションコントラクトは、特定できるものが非常に制限されている。例えば、ほとんどのアプリケーションコントラクトが、変数の型を特定することに制限される。これは、型のエラーを取り除くことには有益である。しかしながら、そのようなコントラクトを使用することによって、存在し得る多くの他のエラーを防ぐことはできないであろう。
【課題を解決するための手段】
【0005】
本明細書に説明する実施形態は、アプリケーションAPIを拡大することを対象とする。一実施形態において、コンピュータシステムは、アプリケーションAPIを拡大するためのAPI(application programming interface)を提供する。コンピュータシステムは、第1のプログラミング言語で記述されたコントラクトAPIからのコントラクトを用いてアプリケーションAPIを拡大するというユーザの意図を示す、第2のプログラミング言語で記述されたソフトウェアコードを受け取る。ソフトウェアコードは、コントラクトAPIへの参照を含む。コントラクトは、アプリケーションAPIの適切な使用を示すアサーションを含む。コンピュータシステムは、ソフトウェアコード内の参照に従ってコントラクトAPIの一部にアクセスし、受け取ったソフトウェアコードおよびコントラクトAPIの参照された部分を、受け取ったソフトウェアコードの中間言語(IL)バージョンにコンパイルする。ILバージョンは、第1のプログラミング言語および第2のプログラミング言語の両方に共通の中間言語におけるものである。ILバージョンは、アプリケーションAPIの適切な使用を示すアサーションを含む。
【0006】
他の実施形態において、コンピュータシステムは、コントラクトAPIからのコントラクトを用いてアプリケーションAPIを拡大するというユーザの意図を示すソフトウェアコードを、コンピュータユーザから受け取る。ソフトウェアコードは、コントラクトAPIへの参照を含む。コントラクトは、アプリケーションAPIの適切な使用を示すアサーションを含む。コンピュータシステムは、ソフトウェアコード内の参照に従ってコントラクトAPIの一部にアクセスし、受け取ったソフトウェアコードおよびコントラクトAPIの参照された部分を、アプリケーションAPIの適切な使用を示す1つまたは複数のアサーションを含む、受け取ったソフトウェアコードの中間言語バージョンにコンパイルし、ソフトウェアコードのコンパイルされた中間言語バージョンをコンピュータユーザに提供する。
【0007】
本「発明の概要」は、以下「発明を実施するための形態」でさらに述べる概念を選択して簡略化した形式で紹介するために提供するものである。本「発明の概要」は、請求の主題の重要な特徴または主要な特徴を特定することを意図しておらず、請求の主題の範囲を決定する際の援助として使用されることも意図していない。
【図面の簡単な説明】
【0008】
本発明の実施形態の上記および他の利点および特徴をさらに明確にするために、本発明の実施形態のさらに特定の説明を、添付の図面を参照して与える。当然のことながら、これらの図面は本発明の典型的な実施形態のみを示し、従って、その範囲を制限するものとみなされるべきではない。本発明を、添付の図面を使用して、追加的な特異性および詳細と共に記述し説明する。
【0009】
【図1】本発明の実施形態が、APIコントラクトの修正および/または生成を含めて動作することができるコンピュータアーキテクチャを示す図である。
【図2】アプリケーションAPIを拡大するための方法の一例のフローチャートである。
【図3】アプリケーションAPIを拡大するための方法の代替例のフローチャートである。
【図4】修正されたコントラクトの例示的実施形態を示す図である。
【図5】生成されたコントラクトの例示的実施形態を示す図である。
【図6】コントラクトのAPIを使用して実行可能バイナリを生成するための例示的システムを示す図である。
【発明を実施するための形態】
【0010】
本明細書に説明する実施形態は、アプリケーションAPIを拡大することを対象とする。一実施形態において、コンピュータシステムは、アプリケーションAPIを拡大するためのAPI(application programming interface)を提供する。コンピュータシステムは、第1のプログラミング言語で記述されたコントラクトAPIからのコントラクトを用いてアプリケーションAPIを拡大するというユーザの意図を示す、第2のプログラミング言語で記述されたソフトウェアコードを受け取る。ソフトウェアコードは、コントラクトAPIへの参照を含む。コントラクトは、アプリケーションAPIの適切な使用を示すアサーションを含む。コンピュータシステムは、ソフトウェアコード内の参照に従ってコントラクトAPIの一部にアクセスし、受け取ったソフトウェアコードおよびコントラクトAPIの参照された部分を、受け取ったソフトウェアコードの中間言語(IL)バージョンにコンパイルする。ILバージョンは、第1のプログラミング言語および第2のプログラミング言語の両方に共通の中間言語におけるものある。ILバージョンは、アプリケーションAPIの適切な使用を示すアサーションを含む。
【0011】
他の実施形態において、コンピュータシステムは、コントラクトAPIからのコントラクトを用いてアプリケーションAPIを拡大するというユーザの意図を示すソフトウェアコードを、コンピュータユーザから受け取る。ソフトウェアコードは、コントラクトAPIへの参照を含む。コントラクトは、アプリケーションAPIの適切な使用を示すアサーションを含む。コンピュータシステムは、ソフトウェアコード内の参照に従ってコントラクトAPIの一部にアクセスし、受け取ったソフトウェアコードおよびコントラクトAPIの参照された部分を、アプリケーションAPIの適切な使用を示す1つまたは複数のアサーションを含む、受け取ったソフトウェアコードの中間言語バージョンにコンパイルし、ソフトウェアコードのコンパイルされた中間言語バージョンをコンピュータユーザに提供する。
【0012】
他の実施形態において、コンピュータシステムは、ソフトウェアアプリケーションが第1のプログラミング言語で記述された少なくとも1つのコントラクトを含むよう構成されたAPIを有すると判定する。コンピュータシステムは、第2のプログラミング言語で記述されたソフトウェアコードを使用してソフトウェアアプリケーションの実行可能コントラクトを生成するというユーザの意図を示すコンピュータユーザから、第2のプログラミング言語で記述されたソフトウェアコードを受け取る。
【0013】
コンピュータシステムは、ソフトウェアコードを、第2のプログラミング言語で記述されたソフトウェアコードを受け取るよう構成されたマネージドフレームワークコンポーネントに送り、第1のプログラミング言語および第2のプログラミング言語の両方に共通のランタイム言語でソフトウェアコードのバージョンを出力する。コンピュータシステムは、第2のプログラミング言語で記述されたソフトウェアコードの中間言語バージョンを受け取り、ソフトウェアコードの受け取った中間言語バージョンに基づき、ソフトウェアアプリケーションの実行可能コントラクトを生成する。
【0014】
本発明の実施形態は、以下にさらに詳細に検討するように、コンピュータハードウェアを含む専用コンピュータまたは汎用コンピュータを含むか、または利用できる。本発明の範囲内の実施形態にはまた、コンピュータ実行可能命令および/またはデータ構造を搬送または記憶するための、物理的コンピュータ可読媒体および他のコンピュータ可読媒体を含む。そのようなコンピュータ可読媒体は、汎用コンピュータシステムまたは専用コンピュータシステムによりアクセス可能な任意の利用可能な媒体とすることが可能である。コンピュータ実行可能命令を記憶するコンピュータ可読媒体は、物理的記憶媒体である。コンピュータ実行可能命令を搬送するコンピュータ可読媒体は、伝送媒体である。従って、限定ではなく例として、本発明の実施形態は、少なくとも2つの明らかに異なるタイプのコンピュータ可読媒体、すなはち、物理的記憶媒体および伝送媒体を含むことが可能である。
【0015】
物理的記憶媒体には、RAM、ROM、EEPROM、CD−ROMもしくは他の光ディスク記憶装置、磁気ディクス記憶装置もしくは他の磁気記憶装置、または、コンピュータ実行可能命令またはデータ構造の形式の所望のプログラムコード手段を記憶するために使用することが可能であり、かつ、汎用コンピュータまたは専用コンピュータによりアクセス可能である任意の他の媒体を含む。
【0016】
「ネットワーク」は、コンピュータシステムおよび/またはモジュールおよび/または他の電子デバイスの間で電子データの移送を可能にする1つまたは複数のデータリンクとして定義される。情報が、ネットワークまたは別の通信接続(有線、無線、または有線もしくは無線の組み合わせのいずれか)を介してコンピュータに転送または提供されるとき、コンピュータは、適切にその接続を伝送媒体と見なす。伝送媒体は、コンピュータ実行可能命令またはデータ構造の形式の所望のプログラムコード手段を搬送または移送するために使用することが可能であり、かつ、汎用コンピュータまたは専用コンピュータによりアクセス可能である、ネットワークおよび/またはデータリンクを含むことが可能である。上記のものの組み合わせもまた、コンピュータ可読媒体の範囲に含むべきである。
【0017】
しかしながら、当然ことながら、種々のコンピュータシステムコンポーネントに届くとすぐに、コンピュータ実行可能命令またはデータ構造の形式のプログラムコード手段を、伝送媒体から物理的記憶媒体に自動的に転送することができる。例えば、ネットワークまたはデータリンクを介して受け取ったコンピュータ実行可能命令またはデータ構造を、ネットワークインターフェースカード内のRAMにバッファリングすることが可能であり、そして最終的には、コンピュータシステムRAMへ、および/またはコンピュータシステムにおいて低不揮発性物理的記憶媒体へ転送することが可能である。従って、当然のことながら、物理的記憶媒体は、伝送媒体をも(または、さらには主として)利用するコンピュータシステムコンポーネントに含むことが可能である。
【0018】
コンピュータ実行可能命令は、例えば、汎用コンピュータ、専用コンピュータ、または専用処理装置に、ある特定の機能または機能の群を実施させる命令およびデータを含む。コンピュータ実行可能命令は、例えば、バイナリ、アセンブリ言語といった変換形式の命令、またはさらにはソースコードであることができる。本発明を、構造的特徴および/または方法論的な行為に特有の言語で説明しているたが、当然のことながら、添付の請求項に定義される主題は必ずしも上述の特徴または行為に限定されない。むしろ、説明する特徴および行為は、請求項を実装する例示の形式として開示するものである。
【0019】
当業者は理解するであろうが、本発明は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、メッセージプロセッサ、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースの家庭用電化製品またはプログラム可能な家庭用電化製品、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、携帯電話、PDA、ページャ、ルータ、スイッチ等を含む、多数のタイプのコンピュータシステム構成を有するネットワークコンピュータ環境において実践することができる。本発明はまた、ネットワークを介してリンクされる(有線データリンク、無線データリンク、または有線データリンクおよび無線データリンクの組み合わせのいずれかにより)、ローカルコンピュータシステムおよびリモートコンピュータシステムの両方がタスクを実施する分散システム環境において実践することができる。分散システム環境においては、プログラムモジュールを、ローカルのメモリ記憶装置およびリモートのメモリ記憶装置の両方に配置できる。
【0020】
図1は、本発明の原理を採用できるコンピュータアーキテクチャ100を示す。コンピュータアーキテクチャ100は、コンピュータシステム101を含む。いくつかの実施形態において、コンピュータシステム101はアプリケーションコード110を含む。アプリケーションコード110は、任意のサイズまたは複雑性を持つ任意のタイプのソフトウェアアプリケーションコードであることができ、任意のタイプの使用に対して設計される。アプリケーションコード110は、ソフトウェアアプリケーションの一部であることができ、またはそれ自身の内部にソフトウェアアプリケーションを含むことができる。アプリケーションコード110は、任意のプログラム言語で記述された任意のタイプのコードを含むことができる。コード110には、メソッド、プロセス、リンクされたライブラリ、コードの個々の行、またはコンピュータシステムと相互作用するために使用できる任意の他のタイプの情報を含むことができる。
【0021】
いくつかの実施形態において、アプリケーションコード110はまた、API(application programming interface)111を含む。APIは、ユーザまたは開発者がソフトウェアアプリケーションの機能性にアクセスすることを可能にする、任意のタイプのインターフェースであることができる。例えば、アプリケーション開発者は一般的には、開発者のアプリケーションの特徴を使用するソフトウェアアプリケーションをサードパーティの開発者が記述できるよう、APIを記述する。いくつかの場合において、以下でさらに詳細に説明するように、アプリケーションのAPIをどのように使用するかを示すAPIのコントラクト(例えば、コントラクト142)内に、アサーションを与えると有利であろう。コントラクト内の方法を使用して、開発者は、ソフトウェアアプリケーションのAPIとどのように相互作用するかをより良く理解することができ、その結果、高品質でバグの無いコードを作成することができる。
【0022】
コンピュータシステム101におけるコントラクトAPI120を、参照113を受け取るよう構成することができ、参照は、コントラクトAPIがAPIコントラクトを修正または生成するために使用されることを示す。例えば、API111は、コントラクトAPI120がAPI111のコントラクトの1つを修正するために使用されることを示す、コントラクトAPIへの参照112を含むことができる。コントラクトは、アプリケーションAPI111がどのように使用されるかを示すアサーションを含むことができる。アサーションは、内部でアプリケーションAPI111が動作するのに最も適している境界を定義することができる。アサーションの例には、前提条件、事後条件、特定のアサーション、不変条件、ロック宣言およびチェックされる例外が含まれる。アサーションについては、以下でさらに詳細に説明する。
【0023】
ユーザ105は、ソフトウェア開発者、クライアント/エンドユーザ、システム管理者または任意の他のタイプのコンピュータユーザを含む、任意のタイプのコンピュータユーザであることができる。いくつかの場合において、ユーザ105は、アプリケーションコード110をコンパイラ130に送ることができる。コンパイラ130は、ソフトウェアコードの何らかの部分をコンパイルするよう構成された任意のタイプのソフトウェアアプリケーションであることができる。コンパイラ130は、中間形式で、何らかのタイプの中間言語(IL)で、コードを出力することができ、または実行可能な機械可読コードを出力することができる。いくつかの実施形態において、コンパイラ130は、マネージドフレームワークの一部であることができ、かつ、マネージドフレームワークコンポーネントと称することができる。
【0024】
本明細書において使用するとき、マネージドフレームワークは、複数の異なるプログラミング言語で記述されたコードファイルを、統一された方法でマネージドフレームワーク(例えば、Microsoft社の共通言語ランタイム、Java仮想マシン、またはLISP(list processing language)インタプリタ)により動作することが可能な中間言語命令に縮小する(またはコンパイルする)ことを可能にする手段であることができる。これにより、複数のプログラミング言語間の相互運用が可能になる。従って、各マネージドフレームワークは、そのフレームワークと互換性がある言語および互換性が無い言語を有する。
【0025】
いくつかの実施形態において、コンピュータシステム101を、アプリケーションコード110が、所与のマネージドフレームワークまたはコンパイラ(例えば、コンパイラ130)と互換性のある言語で記述されているかどうかを判定するよう構成することができる。さらに、コンピュータシステム101に記憶され、コンパイラ130によりアクセスされるソフトウェアコードを、その言語の互換性を判定するよう処理することができる。従って、少なくともいくつかの実施形態において、コードがユーザ105により受け取られたかどうか、またはコンピュータシステム101上のデータストアにおいてアクセスされたかどうかにかかわらず、アプリケーションコード110がコンパイラ130と互換性があると判定することができる。
【0026】
コンパイラ130は、アプリケーションコード110を処理するよう構成され、かつ、API141およびAPIコントラクト142を含む中間言語(IL)バージョンのソフトウェアコード140をツール150に送ることができる。いくつかの実施形態において、ツール150には、様々な機能を実施するよう構成された様々なソフトウェアツールを含むことができる。ツール150には、静的エラーがILバージョン140に存在するかどうかを判定するツール、ILバージョンの正確性の検証を実施するツール、または、ランタイムチェックへの参照をコントラクトに挿入して、対応する参照に従ってランタイムチェックをアプリケーションコードに注入することを可能にするツールを含むことができる。多くの他のツールをツール150に含むことができる。ツール150を、ILバージョン140をAPI141およびランタイムチェック参照143を有するコントラクト142と共に実行モジュール160に送るよう構成することができる。実行モジュール160は、ILバージョン140を実行するよう構成された任意のタイプのソフトウェアメソッド、プロセス、またはアプリケーションであることができる。実行モジュール160は、実行により失敗またはコントラクト違反が生じたこと、または、あるいは何の失敗もコントラクト違反も起きなかったことを示す状態表示161を出力できる。この処理について、図2および3に関連して以下でさらに詳細に説明する。
【0027】
図2は、アプリケーションAPIを拡大するための方法200のフローチャートを示す。方法200を、ここでは図1、4および6の構成要素およびデータを頻繁に参照して説明する。
【0028】
方法200は、第1のプログラミング言語で記述されたコントラクトAPIからのコントラクトを用いてアプリケーションAPIを拡大するというユーザの意図を示す、第2のプログラミング言語で記述されたソフトウェアコードを受け取る動作を含み、ソフトウェアコードはコントラクトAPIへの参照を含み、コントラクトはアプリケーションAPIの適切な使用を示す1つまたは複数のアサーションを含む(動作210)。例えば、コンパイラ130は、第1のプログラミング言語(例えば、VB(Visual Basic)、C#等)で記述されたコントラクトAPI120からのコントラクト(例えば、コントラクト142)を用いてアプリケーションAPI111を拡大するというユーザ105の意図を示す、第2のプログラミング言語(例えば、VB(Visual Basic)、C#等)で記述されたアプリケーションコード110(用語ソフトウェアコードおよびアプリケーションコードは、本明細書において同義的に使用される)を受け取ることができる。アプリケーションコード110は、コントラクトAPIへの参照112を含み、いくつかの場合において、参照113を用いてコントラクトAPI120と通信、またはコントラクトAPI120を参照することができる。コントラクト(例えば、コントラクト142)は、アプリケーションAPI111の適切な使用を示すアサーションを含む。コントラクトAPI120の一般的性質により、コントラクトは、任意のタイプのコード、メソッド、プロセス等を含むよう十分に拡張可能であることができる。さらに、第1のプログラミング言語は、任意の一般使用のプログラミング言語であることができる。コントラクトの拡張性は、新しいメソッドがコントラクトAPIに追加されることを可能にすることができ、従って、新しい種類のコントラクトが記述されることを可能にする。クライアントは、第2のプログラミング言語で記述されたコントラクト内のそのような新しいメソッドを使用することが可能である。
【0029】
いくつかの場合において、アサーションは、そのAPIを使用するアプリケーションを記述する開発者が使用できる。例えば、サードパーティの開発者がアプリケーションAを記述し、アプリケーションBに提供された機能を使用したい場合、該開発者は、アプリケーションBのAPIを使用してアプリケーションBの機能にアクセスするであろう。いくつかの実施形態において、アプリケーションBのAPI内のコントラクトには、アプリケーションBのAPIを使用する際に満たされるべき前提条件、事後条件といったアサーションを含むことができる。アサーションは、内部でアプリケーションBが動作するのに最も適している境界を定義することができる。
【0030】
アサーションには、前提条件、事後条件、特定のアサーション、不変条件、ロック宣言およびチェックされる例外を含むがこれに限らない。前提条件は、本明細書で使用する場合、機能の呼び出し側が満たすべき要件を示す。前提条件は、機能へのエントリ時において真であることが要求される。事後条件は、本明細書で使用する場合、機能の実装が、終了(潜在的には、成功的終了および例外的な終了の両方)時に実現させる保証を示す。事後条件は、機能から出た時に真でなければならない。前提条件および事後条件の両方とも、メソッドの宣言の一部として含むことができる。
【0031】
特定のアサーションは、本明細書で使用する場合、プログラムのコードの一部として含まれ、サニティチェックまたはプログラム論理の明確化作用として働く。特定のアサーションはまた、静的ベリファイアへの補助として働くこともできる。特定のアサーションは、これらが含まれるプログラムの制御フロー内の適切なポイントで真でなければならない。不変条件は、本明細書で使用する場合、ある型に対する全ての動作に渡って真である条件を示す。いくつかの実施形態において、不変条件は、型の宣言の一部として含まれ、データ上のアサーションとして動作できる。外部のクライアント(人またはプログラム)が無効な期間を何ら発見することができない場合には、いくつかのウィンドウのプログラムの実行中に、不変条件を一時的に無効にすることができる。ロック宣言は、本明細書で使用する場合、並行処理下のプログラムの挙動に関する分析の支援に使用されるステートメントである。ロック宣言は、どのロックがどのデータを保護するかを特定するよう設計される。前提条件および事後条件を使用して、どのロックを保持すべきまたは保持すべきでないかを表すことができる。チェックされる例外は、本明細書で使用する場合、メソッドから投入することが可能な例外の組を制約する。チェックされる例外は、事後条件に似ているが、例外的な退出を対象とする。チェックされる例外を、メソッドの宣言の一部として含むことができる。
【0032】
一般に、アサーションは、同様の機能を実施するよう設計される。すなはち、記述された条件が実行時の特定のポイントにおいて真でない場合、プログラムが正しくないことを示すよう設計される。従って、アサーションを、特定のポイントにおけるプログラムの記述または挙動の文書化に使用すること、プログラム内のエラーの分析または検出の補助に使用される計算可能な式として使用すること、プログラムの異なる部分間のコントラクト(アサーションポイントに通じるコードが満たさなければならない要件、またはアサーションポイントに続くコードが依存することができる保証)として使用すること、または任意の他の多数の使用(例えば、アサーションが信頼できるまたは正しいことが証明されていると仮定した場合、コンパイラを介したコードの生成)が可能である。いくつかの場合において、コントラクト内のアサーションを、コードがコントラクトに対して合致するかどうかを静的プログラムベリファイアがチェックするために、またはバグ発見ツールがコード内の起こり得るエラーを見つけるために、使用できる。
【0033】
従って、アプリケーションコード110は、既存のコントラクトを有する、またはコントラクトを何ら有しないAPI111を含むことができる。いくつかの場合において、API141は、複数のコントラクトを含むことができ、それぞれのコントラクトが、異なるメソッドに対応する複数のアサーションを有することができる。いくつかの場合において、APIコントラクト142には、呼び出し側がメソッドを呼び出すことを許可される前に満たされるべき項目を特定する、1つまたは複数の前提条件を含むことができる。従って、そのような前提条件を有するメソッドを使用するために、前提条件は、メソッドが呼び出される前に満たされなければならない。言いかえれば、前提条件が満たされない場合、そのメソッドを呼び出すことはできない。(または、メソッドが呼び出される場合、そのメソッドは失敗する)。例えば、前提条件が違反されるときに、構築プロセスで実施されるチェックを介してメソッドの呼び出しを阻止することは有利であろう。さらに、ユーザが完全な構築プロセスを使用できないときのための潜在的なバックアップとして、ランライム時に前提条件を評価することができる。前提条件が満たされない場合、例外を投入すること、または何らかの他のタイプの挙動(例えば、エスカレーションポリシーをトリガすること)を実施することにより、メソッドの実行は失敗する可能性がある。
【0034】
同様に、APIコントラクト142は、メソッドのリターン時に有効である1つまたは複数の保証を特定する、1つまたは複数の事後条件を含むことができる。従って、少なくともいくつかの場合において、事後条件がメソッドのリターン時に満たされない場合、コントラクトは、それ以上APIの使用を許可しない。APIコントラクト142はまた、ある型に対する全ての動作に渡って真である条件を示す、1つまたは複数のオブジェクト不変条件を含むことができる。コントラクト142内のアサーションはいずれも宣言型であり得ることに留意すべきである。従って、宣言型アサーションは、実装の詳細のそれぞれを記載せずに、アサーションの機能を記載することができる。
【0035】
方法200は、ソフトウェアコード内の参照に従って、コントラクトAPIの一部にアクセスする動作を含む(動作220)。例えば、コンパイラ130は、アプリケーションコード110内の参照112に従って、コントラクトAPI120の一部にアクセスすることができる。従って、いくつかの場合において、コンパイラ130は、参照112を使用して、中間言語バージョン140をコンパイルする際に使用するためにコントラクトAPI120の一部にアクセスすることができる。
【0036】
方法200はまた、受け取ったソフトウェアコードおよびコントラクトAPIの参照された部分を、受け取ったソフトウェアコードの中間言語バージョンにコンパイルする動作を含み、中間言語バージョンは第1のプログラミング言語および第2のプログラミング言語の両方に共通の中間言語におけるものであり、中間言語バージョンはアプリケーションAPIの適切な使用を示す1つまたは複数のアサーションを含む(動作230)。例えば、コンパイラ130は、アプリケーションコード110およびコントラクトAPI120の参照された部分をアプリケーションコード110の中間言語バージョン140にコンパイルすることができる。中間言語バージョン140は、第1のプログラミング言語(例えば、VB、C#等)および第2のプログラミング言語(例えば、VB、C#等)の両方に共通の中間言語(IL)におけるものであることができる。ILバージョン140は、アプリケーションAPI141の適切な使用を示すアサーションを含むことができる。
【0037】
いくつかの実施形態において、例えば、アプリケーションコード110をVisual Basicで記述することができ、コントラクトAPIをC#で記述することができ、コンパイラ130を、C#で記述されたコントラクトAPI120と互換性のあるVisual BasicのコードのILバージョンを出力するよう構成することができる。いくつかの場合において、両言語が、マネージドフレームワークの一部であることができる。そのような場合、両言語が、共通のマネージドフレームワークの一部であるため、1つの言語で記述されたコードを使用して、別の言語で記述されたコードを修正することができる。これは、コントラクトAPI120がユーザ105には未知のプログラミング言語で記述されており、それにもかかわらずユーザ105が、場合によっては種々のアサーションを追加することにより、アプリケーションAPIのコントラクトを修正することを所望する状況においては有利であろう。
【0038】
いくつかの実施形態において、コンピュータシステム101は、様々な異なるソフトウェアツールを含むことができるツール150を含む。例えば、ツール150には、コンパイルされた中間言語バージョン140にアクセスし、かつ、1つまたは複数のランタイムチェック参照143をコントラクト142に挿入するよう構成されるツールを含むことができる。ランタイムチェック参照143を、ランタイムチェックを挿入できるアプリケーションコード内の場所を識別するプレースホルダとして使用することができる。そのようなツールを、さらに、ランタイムチェック参照を有するコントラクト142を含むILバージョン140を実行するよう、かつ、コントラクト142内の少なくとも1つのアサーションが、ILバージョンの実行中に違反されたと判定するよう構成することができる。さらに、そのような判定に基づき、ツールを、アサーションの内の少なくとも1つが違反されたという表示を与えるよう構成することができる(例えば、状態表示161において)。他の場合において、ツール150の1つを、挿入されたランタイムチェック参照を有するコントラクト142を含むILバージョン140を実行するよう、かつ、コントラクト142内のアサーションのいずれもILバージョンの実行中に違反されなかったと判定するよう構成することができる。そして、そのような判定に基づき、ツールを、アサーションのいずれも違反されなかったという表示を与えるよう構成することができる(例えば、状態表示161において)。
【0039】
いくつかの実施形態において、ツール150には、ILバージョン140に対して静的分析を実施して、コントラクト142のアサーションが満たされたかどうかを判定するよう構成されたツールを含むことができる。いくつかの場合において、静的分析が、コントラクトのアサーションが満たされたことを判定する場合、ユーザにそれを通知することができる(例えば、正確性の検証151において)。同様に、1つまたは複数のアサーションが満たされなかった場合、通知(例えば、静的エラー151)を、そのような情報を含むように構成することができる。いくつかの場合において、ユーザには、単にコントラクトが修正されたことを通知することができる。
【0040】
図4に説明する例示的実施形態において、コントラクトを、上述した方法でアサーションを用いて拡大することができる。アプリケーションコード406は、手つかずの元のままの形式(405)であり、API408および、前提条件、事後条件、不変条件、または他の要素といった種々のアサーションに対応できる複数のアサーション1、2および3を有するコントラクト409を含む。コントラクトAPI120の一部と共にコンパイルされた後、コントラクト409を拡大するために使用されるアプリケーションコード406を、ユーザ105が入力できる。アプリケーションコード426の結果として得られた修正バージョン425は、API428および、拡大された(または新しい)アサーション1A、3および4を有するコントラクト429を含む。アサーション1Aは、元のアサーション1の修正バージョンであり、アサーション3は同一であり、アサーション4は追加されたものである。従って、コントラクト拡大には、既存のアサーションを変更すること、アサーション(例えば、要素2)を削除すること、および/または、アサーションをコントラクトに追加することを含むことができる。
【0041】
図3は、アプリケーションAPIを拡大するための代替の方法300のフローチャートを示す。方法300を、ここでは図1、5および6の構成要素およびデータを頻繁に参照して説明する。
【0042】
方法300は、コントラクトAPIからのコントラクトを用いてアプリケーションAPIを拡大するというユーザの意図を示すソフトウェアコードを、コンピュータユーザから受け取る動作を含み、ソフトウェアコードはコントラクトAPIへの参照を含み、コントラクトはアプリケーションAPIの適切な使用を示す1つまたは複数のアサーションを含む(動作310)。例えば、コントラクトAPI120からのコントラクト142を用いてアプリケーションAPI111を拡大するというユーザ105の意図を示すアプリケーションコード110を、コンピュータユーザ105から受け取ることができる。アプリケーションコード110は、コントラクトAPI112への参照を含む。コントラクト142は、アプリケーションAPI141の適切な使用を示す1つまたは複数のアサーションを含む。上記で示したように、コントラクト142は、呼び出し側がメソッドを呼び出すことを許可される前に満たされるべき項目を特定する、1つまたは複数の前提条件を含むことができる。加えてまたはあるいは、コントラクト142は、メソッドのリターン時に有効である1つまたは複数の保証を特定する1つまたは複数の事後条件を含むことができる。不変条件、特定のアサーション、ロック宣言、チェックされる例外および他のアサーションを、APIコントラクト142内に個別にまたは集合的に含むこともできる。
【0043】
方法300はまた、ソフトウェアコード内の参照に従ってコントラクトAPIの一部にアクセスする動作を含む(動作320)。例えば、コンパイラ130は、アプリケーションコード110内の参照112に従って、コントラクトAPI120の一部にアクセスすることができる。
【0044】
方法300は、受け取ったソフトウェアコードおよびコントラクトAPIの参照された部分を、アプリケーションAPIの適切な使用を示す1つまたは複数のアサーションを含む受け取ったソフトウェアコードの中間言語バージョンにコンパイルする動作(動作330)を含む。例えば、コンパイラ130は、アプリケーションコード110およびコントラクトAPI120の参照された部分を、API141の適切な使用を示す種々のアサーションを用いてAPI141およびコントラクト142を含むILバージョン140にコンパイルすることができる。いくつかの場合において、コンパイラ130は、ソフトウェアコードを受け取り、かつ、マネージドフレームワークに含まれる複数の異なるプログラミング言語に共通するアプリケーションコード140の中間言語(IL)バージョンを出力するよう構成される、マネージドフレームワークの一部であることができる。例えば、ソフトウェアコード110がC#で記述され、かつ、コントラクト142がVisual Basicで記述されている場合、コンパイラ130を、Visual Basicで記述されたコントラクト142と互換性のあるC#コードのILバージョンを出力するよう構成することができる。
【0045】
方法300は、ソフトウェアコードのコンパイルされた中間言語バージョンをコンピュータユーザに提供する動作を含む(動作340)。例えば、コンピュータシステム101は、コンパイルされたILバージョン140をコンピュータユーザ105に提供することができる。いくつかの場合において、ILバージョンを、ツール150の後のアプリケーションのユーザ105に提供することができる。いくつかの場合において、コンピュータシステム101は、ILバージョン140をツール150に直接提供することができる。上記で示したように、多くの異なるツールを使用して、エラーチェック(ランタイムまたは静的)、ドキュメンテーション生成、ロギング、または他の特徴からの任意のものを実施することができる。例えば、ドキュメンテーションを使用して、アプリケーションAPIを用いてコントラクトをどのように使用するかをそのようなユーザに通知することができる。そのようなドキュメンテーションは、ツール150により自動的に生成することができる。
【0046】
コントラクト142は、既にAPI111の一部である既存のコントラクトの拡大されたバージョンを表しことができる。加えてまたはあるいは、コントラクト142は、コントラクトAPI120を使用して生成された新しいコントラクトを表すことができる。図5にて説明する例示的実施形態において、API528のコントラクト529は、上述のコントラクト拡大と同様の方法で生成することができる。言い換えると、コントラクト生成は、情報を含有しない(すなわち、アサーションを含有しない)コントラクトを拡大することと等価であることができる。本例において、アプリケーションコード506は、手つかずの元のままの形式(505)であり、API508を含む。アプリケーションコード110は、ILバージョンに変換された後、生成されたコントラクトを有するアプリケーションAPIを作成するために使用することができる(525)。その結果として生成されるアプリケーションコード526は、API528および、前提条件、事後条件、不変条件、または他の要素といった種々のアサーションに対応できる、アサーション1、2および3を有する生成されたコントラクト529を含む。従って、API528を、コントラクト内に含まれる種々のアサーションの任意または全てのものを含む、生成されたコントラクト529を含みかつ使用するよう構成することができる。
【0047】
いくつかの実施形態には、アプリケーションコード、1つまたは複数のコントラクト、ライブラリ参照、および他の要素を含む実行可能バイナリを生成するためのシステムを含むことができる。例えば、図6にて説明するように、コントラクト606を有するAPI605を含むソフトウェアアプリケーションコードを受け取るようコンパイラ615を構成することができ、コントラクト606は、ソフトウェアアプリケーションコードとどのように相互作用するかを特定する1つまたは複数のアサーション607(そのうちのあるものは条件付きである)を識別する。コントラクト606は、拡張可能であり、ある値と交換されるアプリケーションコードの一部を示す1つまたは複数の参照を含むことができる。さらに、コントラクト606を、任意の汎用プログラミング言語で記述することができる。
【0048】
コンパイラ615は、1つまたは複数のアサーションを、任意の受け取ったバイナリ610と共に、ソフトウェアアプリケーションコードの内の対応するメソッドに統合するよう構成することができる。リライタ625は、ソフトウェアアプリケーションコード621、コントラクト622およびライブラリ参照623を含む、コンパイルされたバイナリ620をコンパイラ615から受け取るよう、かつ、コントラクト内の参照により示されるアプリケーションコードの一部を中間(ランタイム)言語内の値と交換するように受け取ったバイナリをリライトするよう構成することができる。
【0049】
いくつかの場合において、バイナリを、ランタイムチェックおよびそれに続く読み込みの両方のために書き換えることができる。さらに、この新しい(書き換えられた)バイナリを、書き換えられたソフトウェアを使用するソフトウェアの新しい部分をコンパイルするために入力として使用することができる。書き換えられたバイナリを、実行可能バイナリ630として出力することができる。リライタ625は、書き換え時に使用するために、1つまたは複数のライブラリ626へ選択的にアクセスすることができる。いくつかの場合において、ソフトウェアコードおよびコントラクトを、別個にコンパイルし、次いで、後にリライタ615により結合することができる。上記で示したように、アサーションには、前提条件、事後条件、オブジェクト不変条件、ロック宣言、チェックされる例外、使用プロトコル、または任意の他のタイプのアサーションを含むことができる。
【0050】
従って、いくつかの実施形態によると、ユーザは、1つの言語でソフトウェアコードを記述し、そのソフトウェアコードを使用して、別の言語で記述されたアプリケーションAPIのコントラクトを拡大することができる。コントラクトは、コントラクトに関連するアプリケーションAPIを適切に使用するために満たされるべき前提条件および事後条件を含む複数のアサーションを含み、これによりプログラミングエラーをより減少させることができる。
【0051】
本発明を、その精神または主要な特徴から逸脱することなく他の特定の形式で具現化することができる。説明した実施形態は、あらゆる点において単に例示であり制限するものではないと見なされるべきである。本発明の範囲は、従って、前述の説明よりもむしろ添付の請求項により示される。請求項と等価の意味および範囲内にある全ての変更が、請求項の範囲に包含される。

【特許請求の範囲】
【請求項1】
第2のプログラミング言語で記述されたアプリケーションAPIを拡大するための、第1のプログラミング言語で記述されたコントラクトAPI(application programming interface)をコンピュータ可読媒体上に有する1つまたは複数のコンピュータ可読媒体を備える、コンピュータプログラム製品であって、前記アプリケーションAPIは1つまたは複数のコントラクトを含み、前記コンピュータプログラム製品はコンピュータ実行可能命令を備え、前記コンピュータ実行可能命令は、コンピューティングシステムの1つまたは複数のプロセッサにより実行されるときに前記コンピュータシステムに方法を実施させ、前記方法は、
前記第1のプログラミング言語で記述された前記コントラクトAPIからのコントラクトを用いて前記アプリケーションAPIを拡大するというユーザの意図を示す、前記第2のプログラミング言語で記述されたソフトウェアコードを受け取る動作であって、前記ソフトウェアコードは前記コントラクトAPIへの参照を含み、前記コントラクトは前記アプリケーションAPIの適切な使用を示す1つまたは複数のアサーションを含む動作と、
前記ソフトウェアコード内の前記参照に従って、前記コントラクトAPIの一部にアクセスする動作と、
前記受け取ったソフトウェアコードおよび前記コントラクトAPIの前記参照された部分を前記受け取ったソフトウェアコードの中間言語バージョンにコンパイルする動作であって、前記中間言語バージョンは前記第1のプログラミング言語および前記第2のプログラミング言語の両方に共通の中間言語におけるものであり、前記中間言語バージョンは前記アプリケーションAPIの適切な使用を示す1つまたは複数のアサーションを含む動作と
を含むことを特徴とするコンピュータプログラム製品。
【請求項2】
1つまたは複数のソフトウェアツールを用いて前記コンパイルされた中間言語バージョンにアクセスする動作と、
1つまたは複数のランタイムチェックへの1つまたは複数の参照を前記コントラクトの内の少なくとも1つに挿入して、前記ランタイムチェックが前記対応する参照に従ってアプリケーションコードに注入されることを可能にする動作と
をさらに含むこと特徴とする請求項1に記載の方法を実施するよう構成されたAPI。
【請求項3】
前記挿入されたランタイムチェックを含む前記中間言語バージョンを実行する動作と、
前記コントラクト内の前記アサーションの内の少なくとも1つが前記中間言語バージョンの実行中に違反されたと判定する動作と、
前記判定に基づき、前記アサーションの内の少なくとも1つが違反されたという表示を与える動作と、
をさらに含むこと特徴とする請求項2に記載の方法を実行するよう構成されたAPI。
【請求項4】
前記挿入されたランタイムチェックを含む前記中間言語バージョンを実行する動作と、
前記コントラクト内の前記アサーションのいずれも前記中間言語バージョンの実行中に違反されなかったと判定する動作と、
前記判定に基づき、前記アサーションのいずれも違反されなかったという表示を与える動作と
をさらに含むこと特徴とする請求項2に記載の方法を実施するよう構成されたAPI。
【請求項5】
前記アプリケーションAPIのコントラクトの内の少なくとも1つを静的にチェックして、前記コントラクトのアサーションのいずれかが違反されたかどうかを判定する動作
をさらに含むこと特徴とする請求項1に記載の方法を実施するよう構成されたAPI。
【請求項6】
前記アサーションは、呼び出し側がメソッドを呼び出すことを許可される前に満たされるべき項目を特定する1つまたは複数の前提条件を含むこと特徴とする請求項1に記載の方法を実施するよう構成されたAPI。
【請求項7】
前記アサーションは、前記メソッドの通常の終了および前記メソッドの例外的な終了の内の少なくとも一方の際、前記メソッドのリターン時に有効である1つまたは複数の保証を特定する1つまたは複数の事後条件を含むこと特徴とする請求項1に記載の方法を実施するよう構成されたAPI。
【請求項8】
前記アサーションは、ロック宣言の内の少なくとも1つを含むこと特徴とする請求項1に記載の方法を実施するよう構成されたAPI。
【請求項9】
前記アサーションは、少なくとも1つのチェックされる例外を含むこと特徴とする請求項1に記載の方法を実施するよう構成されたAPI。
【請求項10】
前記アサーションは、オブジェクト不変条件の内の少なくとも1つを含むこと特徴とする請求項1に記載の方法を実施するよう構成されたAPI。
【請求項11】
前記コントラクトは、前記コントラクトAPIの結果として拡張可能であり、前記拡張性は、新しいメソッドを前記コントラクトAPIに追加することを可能にして、1つまたは複数のクライアントが前記第2のプログラミング言語で記述された前記コントラクト内の前記新しいメソッドを使用することができるように、新しい種類のコントラクトを記述することを可能にすること特徴とする請求項1に記載の方法を実施するよう構成されたAPI。
【請求項12】
前記コントラクト内の前記アサーションの内の少なくとも1つは宣言型であること特徴とする請求項1に記載の方法を実施するよう構成されたAPI。
【請求項13】
前記拡大されたコントラクトに基づき、前記ソフトウェアアプリケーションのAPIのドキュメンテーションを自動的に生成する動作さらに含むこと特徴とする請求項1に記載の方法を実施するよう構成されたAPI。
【請求項14】
前記コントラクトAPIを使用して記述された前記コントラクトは複数のダウンストリームツールに対して維持されること特徴とする請求項1に記載の方法。
【請求項15】
コンピュータシステムにおいて、アプリケーションAPIを拡大するための方法であって、前記アプリケーションAPIは1つまたは複数のコントラクトを含み、
コントラクトAPIからのコントラクトを用いて前記アプリケーションAPIを拡大するというユーザの意図を示すソフトウェアコードを、コンピュータユーザから受け取る動作であって、前記ソフトウェアコードは前記コントラクトAPIへの参照を含み、前記コントラクトは前記アプリケーションAPIの適切な使用を示す1つまたは複数のアサーションを含む動作と、
前記ソフトウェアコード内の前記参照に従って前記コントラクトAPIの一部にアクセスする動作と、
前記受け取ったソフトウェアコードおよび前記コントラクトAPIの前記参照された部分を、前記アプリケーションAPIの適切な使用を示す1つまたは複数のアサーションを含む前記受け取ったソフトウェアコードの中間言語バージョンにコンパイルする動作と、
前記ソフトウェアコードの前記コンパイルされた中間言語バージョンを前記コンピュータユーザに提供する動作と
を含むことを特徴とする方法。
【請求項16】
前記アサーションは、前提条件、事後条件、ロック宣言、チェックされる例外、使用プロトコル、およびオブジェクト不変条件の内の1つまたは複数を含むことを特徴とする請求項9に記載の方法。
【請求項17】
前記コントラクトは、前記コントラクトを完全汎用のプログラミング言語で記述することができるように拡張可能であることを特徴とする請求項9に記載の方法。
【請求項18】
APIコントラクトを修正するためのコンピュータシステムであって、前記システムは、
コンパイラであって、
ソフトウェアアプリケーションコードとどのように相互作用するかを特定する1つまたは複数のアサーションを識別する少なくとも1つのコントラクトを有するAPIを含む、前記ソフトウェアアプリケーションコードを受け取るステップであって、前記コントラクトは1つの値と交換されるべきアプリケーションコードの一部を示す1つまたは複数の参照を含むよう拡張可能であり、前記コントラクトは汎用のプログラム言語で記述されるステップと、
1つまたは複数のアサーションを前記ソフトウェアアプリケーションコード内の対応するメソッドに統合するステップと
を実施するよう構成されたコンパイラと、
リライタであって、
前記コンパイラからバイナリを受け取るステップであって、前記バイナリは少なくとも1つの前記ソフトウェアアプリケーションコードと、前記少なくとも1つのコントラクトとを含むステップと、
前記コントラクト内の前記参照により示される前記アプリケーションコードの一部がある値と交換されるように、前記受け取ったバイナリを書き換えるステップと、
前記書き換えたバイナリを実行可能バイナリとして出力するステップと
を実施するよう構成されたリライタと
を備えることを特徴とするシステム。
【請求項19】
前記コンパイラは1つまたは複数の前記バイナリを受け取るよう構成されることを特徴とする請求項18に記載のシステム。
【請求項20】
前記アサーションは、前提条件、事後条件、ロック宣言、チェックされる例外、使用プロトコル、およびオブジェクト不変条件の内の少なくとも1つであることを特徴とする請求項18に記載のシステム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate


【公表番号】特表2011−508317(P2011−508317A)
【公表日】平成23年3月10日(2011.3.10)
【国際特許分類】
【出願番号】特願2010−539586(P2010−539586)
【出願日】平成20年11月26日(2008.11.26)
【国際出願番号】PCT/US2008/084994
【国際公開番号】WO2009/085521
【国際公開日】平成21年7月9日(2009.7.9)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.JAVA
【出願人】(500046438)マイクロソフト コーポレーション (3,165)
【Fターム(参考)】