(57)【特許請求の範囲】
【請求項１】
アプリケーション・プログラミング・インターフェース（ＡＰＩ）のランタイムの可視性を変更する方法であって、
アプリケーション・プログラミング・インターフェース（ＡＰＩ）を含む実行可能コードを開発するための開発環境を含むコンピュータ・システムにおいて、前記実行可能コードが、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）へのアクセスを動的に要求することができるランタイム環境において起動し、前記ランタイム環境が、アプリケーション・プログラミング・インターフェース（ＡＰＩ）タイプに基づいて、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するデフォルト可視性を動的アクセス要求に提供し、当該方法が、
ライブラリにおいて組み合わされた一組のアプリケーション・プログラミング・インターフェース（ＡＰＩ）にアクセスするステップであって、各前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）のアプリケーション・プログラミング・インターフェース（ＡＰＩ）タイプが、パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）、および非パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）を含む、ステップと、
前記一組のアプリケーション・プログラミング・インターフェース（ＡＰＩ）の中から、動的アクセス要求に提供された前記デフォルト可視性が変更されることになるアプリケーション・プログラミング・インターフェース（ＡＰＩ）を識別するステップであって、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するデフォルト可視性が、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）のアプリケーション・プログラミング・インターフェース（ＡＰＩ）タイプによって定義され、前記デフォルト可視性は、他のどのソフトウェア・コンポーネントがランタイム時に前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）にアクセスすることができるかを定義する、ステップと、
前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に追加の属性をアタッチすることによって、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する前記デフォルト可視性を無効にするステップであって、前記追加の属性は、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）にアクセスするランタイムの動的アクセス要求が前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）にアタッチされる前記追加の属性を用いて評価されることになることを、ランタイムの可視性計算モジュールに示す、ステップと、
を含む、方法。
【請求項２】
請求項１記載の方法において、アプリケーション・プログラミング・インターフェース（ＡＰＩ）を識別するステップが、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）を該アプリケーション・プログラミング・インターフェース（ＡＰＩ）の作者に公開するステップを含む、方法。
【請求項３】
請求項２記載の方法において、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する前記デフォルト可視性を無効にするステップが、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）の作者が、前記アプリケーション・プログラミング・インターフェースの前記デフォルト可視性を変更するステップを含む、方法。
【請求項４】
請求項１記載の方法において、アプリケーション・プログラミング・インターフェース（ＡＰＩ）を識別するステップが、非パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）を識別するステップを含み、前記非パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）についての前記デフォルト可視性が、前記非パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）への動的アクセス要求を禁止する、方法。
【請求項５】
請求項４記載の方法において、前記アプリケーション・プログラミング・インターフェースの前記デフォルト可視性を無効にするステップが、前記非パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）に属性をアタッチするステップを含み、前記属性が、前記非パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）への動的アクセス要求を許可するように、前記非パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する前記デフォルト可視性を無効にする、方法。
【請求項６】
請求項１記載の方法において、アプリケーション・プログラミング・インターフェース（ＡＰＩ）を識別するステップが、パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）を識別するステップを含み、前記パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）についての前記デフォルト可視性が、前記パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）への動的アクセス要求を許可する、方法。
【請求項７】
請求項６記載の方法において、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）の前記デフォルト可視性を無効にするステップが、前記パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）に属性をアタッチするステップを含み、前記属性が、前記パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）への動的アクセス要求を禁止するように、前記パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）についての前記デフォルト可視性を無効にする、方法。
【請求項８】
動的アクセス要求がリフレクションを使用する、請求項１記載の方法。
【請求項９】
アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するデフォルト可視性を低減させる方法であって、
アプリケーション・プログラミング・インターフェース（ＡＰＩ）を含む実行可能コードを開発するための開発環境を含むコンピュータ・システムにおいて、前記実行可能コードが、アプリケーション・プログラミング・インターフェース（ＡＰＩ）へのアクセスを動的に要求することができるランタイム環境において起動し、前記ランタイム環境が、アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するデフォルト可視性を有し、当該方法が、
アプリケーションのアプリケーション・コードにアクセスするステップであって、前記アプリケーション・コードが、ライブラリにおいて組み合わされた１つ以上のアクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）を参照する、ステップと、
前記アプリケーション・コード内において参照されるアクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）を識別するステップであって、前記アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）が、前記１つ以上のアクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）の中から選択され、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するデフォルト可視性が、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）のアプリケーション・プログラミング・インターフェース（ＡＰＩ）タイプによって定義され、前記デフォルト可視性は、他のどのソフトウェア・コンポーネントがランタイム時に前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）にアクセスすることができるかを定義する、ステップと、
前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）が、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）タイプに基づいてランタイム時に複数のソフトウェア・コンポーネントにアクセス可能であるかを判定するステップと、
前記アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）を参照する前記アプリケーション・コードの一部に追加の属性をアタッチすることによって、前記アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する前記デフォルト可視性を無効にするステップであって、前記追加の属性が、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するランタイムの動的アクセス要求が前記複数のソフトウェア・コンポーネントの内の少なくとも１つについて禁止されることになることを、ランタイムの可視性計算モジュールに示す、ステップと、
を含む、方法。
【請求項１０】
請求項９記載の方法において、前記アプリケーション・コード内において参照されるアクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）を識別するステップが、前記アプリケーション・コードの作者に参照される前記アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）を識別するステップを含む、方法。
【請求項１１】
請求項１０記載の方法において、前記アプリケーション・コードの一部に追加の属性をアタッチするステップは、前記アプリケーション・コードの作者が、前記アプリケーション・コードの一部に前記追加の属性をアタッチするステップを含む、方法。
【請求項１２】
請求項９記載の方法において、前記アプリケーション・コードの一部に追加の属性をアタッチするステップが、パブリックＡＰＩを参照する前記アプリケーション・コードの一部に追加の属性をアタッチするステップを含む、方法。
【請求項１３】
請求項９記載の方法において、前記アプリケーション・コードの一部に追加の属性をアタッチするステップが、非パブリックＡＰＩを参照する前記アプリケーション・コードの一部に追加の属性をアタッチするステップを含み、前記非パブリックＡＰＩは、該非パブリックＡＰＩへの動的アクセスが許可されることを示す別の属性を有する、方法。
【請求項１４】
請求項９記載の方法において、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する前記デフォルト可視性を無効にするステップが、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）を参照する前記アプリケーション・コードの一部に追加の属性をアタッチして、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）についてのメタデータがランタイム時に生成されないことを前記可視性計算モジュールに示すステップを含む、方法。
【請求項１５】
動的アクセス要求がリフレクションを使用する、請求項９記載の方法。
【請求項１６】
アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する指定可視性をコンシューマに提供する方法であって、
アプリケーション・プログラミング・インターフェース（ＡＰＩ）への動的アクセスを要求することができるランタイム環境を含むコンピュータ・システムにおいて、前記ランタイム環境が、アプリケーション・プログラミング・インターフェース（ＡＰＩ）タイプに基づいて、動的アクセス要求に、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するデフォルト可視性を提供し、当該方法が、
前記ランタイム環境において実行可能コードを実行するステップであって、前記実行可能コードがアプリケーション・コードから導出される、ステップと、
前記実行可能コードの実行中において、
コンシューマから、前記実行可能コードの一部を実行するための動的コールを受けるステップであって、前記実行可能コードの一部が、ライブラリ内のアプリケーション・プログラミング・インターフェース（ＡＰＩ）を参照する前記アプリケーション・コードの一部から導出される、ステップと、
前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）のタイプに基づいて、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するランタイム・デフォルト可視性にアクセスするステップであって、前記デフォルト可視性は、他のどのソフトウェア・コンポーネントがランタイム時に前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）にアクセスすることができるかを定義する、ステップと、
前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）にアタッチされる任意の追加の属性にアクセスするステップであって、アタッチされる追加の属性が、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する前記ランタイム・デフォルト可視性を無効にするという、アプリケーション・プログラミング・インターフェース（ＡＰＩ）の作者による希望を示す、ステップと、
前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）を参照する前記アプリケーション・コードの前記一部にアタッチされる任意の別の属性にアクセスするステップであって、前記アプリケーション・コードの前記一部にアタッチされる別の属性が、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）へのランタイム・アクセスを、前記無効にされるデフォルト可視性がさもなければ許可することになるのよりも大きく制限される可視性にセットするという、前記アプリケーション・コードの作者による希望を示す、ステップと、
前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する前記ランタイム・デフォルト可視性、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）にアタッチされる任意の追加の属性、および前記アプリケーション・コードの前記一部にアタッチされる任意の他の属性の内の１つ以上に基づいて、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する算出可視性を決定するステップと、
前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する算出可視性を前記動的コールに提供するステップと、
を含む、方法。
【請求項１７】
請求項１６記載の方法において、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する算出可視性を決定するステップが、ＡＰＩタイプ、前記ＡＰＩにアタッチされる属性、および前記ＡＰＩを参照するコードにアタッチされる属性に基づいて、前記ＡＰＩについての算出可視性を決定するステップを含む、方法。
【請求項１８】
請求項１６記載の方法において、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する算出可視性を決定するステップが、ＡＰＩタイプおよび前記ＡＰＩにアタッチされる属性に基づいて、前記ＡＰＩについての算出可視性を決定するステップを含む、方法。
【請求項１９】
請求項１６記載の方法において、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する算出可視性を決定するステップが、ＡＰＩタイプおよびコードの部分にアタッチされる属性に基づいて、ＡＰＩについての算出可視性を決定するステップを含む、方法。
【請求項２０】
請求項１６記載の方法において、前記アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する算出可視性を決定するステップが、ＡＰＩタイプのみに基づいてＡＰＩについての算出可視性を決定するステップを含む、方法。
【発明の詳細な説明】
【背景技術】
【０００１】
コンピュータ・システムおよび関係する技術は、多くの社会の側面に影響を及ぼす。実際、コンピュータ・システムの情報を処理する能力は、我々が生活し仕事する有様を一変させた。現在、コンピュータ・システムは、コンピュータ・システムの出現以前には手作業で行われていたタスク（例えば、文書処理、計画策定、会計等）のホストを実行するのが極普通である。更に近年になって、コンピュータ・システムが相互に結合され、また他の電子デバイスに結合され、有線およびワイヤレス・コンピュータ・ネットワーク双方を形成し、これを通じてコンピュータ・システムおよび他の電子デバイスが電子データを転送できるようにした。したがって、多くの計算タスクの実行は、多数の異なるコンピュータ・システムおよび／または多数の異なるコンピューティング環境にわたって分散される。
【０００２】
コード開発の段階では、ソフトウェア開発者は、多くの場合、ソフトウェア・コンポーネント間の通信を容易にするために、アプリケーション・プログラミング・インターフェース（ＡＰＩ）を使用する。ＡＰＩは、当該ＡＰＩに関連付けられたルーチン、データ構造、オブジェクト・クラス、および変数についての仕様を含む。したがって、１人の開発者は、ＡＰＩ仕様を使用することができ、その結果、他の開発者によって書かれたＡＰＩをどのようにコールするか決定することができる。
【０００３】
多くの場合、１人のソフトウェア開発者（ライブラリ開発者）は、関係する多数のＡＰＩを有するコードを開発し、指定された機能を提供するライブラリにこれらＡＰＩをグループ化する。ソフトウェア開発者は、ライブラリ内部における対応するＡＰＩをパブリックＡＰＩとして公開する(expose)ことによって、この機能の一部を他のプログラムに利用可能にすることができる。このように、他の開発者（アプリケーション開発者）は、彼らのコード内部から、パブリックＡＰＩに対するコールによって、利用可能な機能の部分にアクセスすることができる。また、ソフトウェア開発者は、機能の他の部分をプライベートのものとして維持することもできる。プライベート機能は、ライブラリ内部においてＡＰＩ間で内部的に、または他のライブラリにおける他のプライベートＡＰＩにアクセスするために使用することができる。プライベート機能を提供するＡＰＩは、他のプログラムに直接公開されることはない。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、多くのランタイム環境は、コードがサード・パーティのライブラリにおける任意のＡＰＩを動的にコールすることを許可する（例えば、メタデータにアクセスするためにリフレクション(reflection)を使用する）。したがって、アプリケーション・プログラムまたはライブラリは、他のライブラリにおけるプライベートＡＰＩを識別およびコールすることができる。ソフトウェア開発者がＡＰＩをプライベートに維持するとき、ソフトウェア開発者は、そのＡＰＩが外部からコールされることを予期しない。生憎、例えば、プライベート・メソッドの名称変更または除去というような、このようなライブラリの内部実装の詳細に対する提供サービス(servicing)変更またはバージョン(versioning)変更が、これらのライブラリを使用するアプリケーションにおいて変更点を生ずる潜在性を有する。
【０００５】
加えて、動的コールに対するランタイム・サポートは、サイズおよびワーキング・セットのオーバーヘッド（例えば、メタデータ）を伴う(carry)。ＡＰＩが実際に動的にコールされるか否かには関係なく、サイズおよびワーキング・セット・オーバーヘッドは、ＡＰＩ（プライベートまたはパブリック）のために維持される。コールされないＡＰＩのためにサイズおよびワーキング・セット・オーバーヘッドを維持すると、不必要にコンピューティング・リソースを消費ことになる。
【課題を解決するための手段】
【０００６】
本発明は、アプリケーション・プログラミング・インターフェースへのランタイム・アクセスを制御するための方法、システム、およびコンピュータ・プログラム製品に関するものである。本発明の実施形態は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対してランタイム・アクセスを制御することを含む。ランタイム環境は、動的アクセス要求に（例えば、リフレクションまたは他の動的コール技法によって）、ＡＰＩタイプに基づいて、ＡＰＩに対するデフォルト可視性(default visibility)を供給する。例えば、非パブリックＡＰＩに対するデフォルト可視性は、動的アクセスを禁止することができる。
【０００７】
ライブラリにおいて組み合わされた一組のＡＰＩがアクセスされる。この一組のＡＰＩは、１つ以上のパブリックＡＰＩおよび１つ以上の非パブリックＡＰＩを含む。動的アクセス要求に対して提供されたデフォルト可視性が変更されることになるＡＰＩが、一組のＡＰＩの中から識別される。
【０００８】
ＡＰＩに対するデフォルト可視性は、ＡＰＩに属性を適用することによって変更される。属性は、ＡＰＩに対する変更された可視性が動的アクセス要求に提供されることになることを、ランタイム時においてランタイム環境に示す。可視性の変更は、デフォルトでは動的アクセスが許可されない非パブリックＡＰＩへの動的アクセスを許可することを含むことができる。
【０００９】
他の実施形態は、アクセス可能なＡＰＩに対するデフォルト可視性を低減させることを含む。アプリケーションのアプリケーション・コードがアクセスされる。このアプリケーション・コードは、ライブラリにおいて組み合わされた１つ以上のアクセス可能なＡＰＩを参照する。アプリケーション・コード内部において参照されるアクセス可能なＡＰＩが識別される。アクセス可能なＡＰＩは、１つ以上のアクセス可能なＡＰＩの中から選択される。
【００１０】
アクセス可能なＡＰＩが、ランタイムにおいて動的にアクセスされることにはならないと判断する。アクセス可能なＡＰＩに対するデフォルト可視性を低減させるために、アクセス可能なＡＰＩに属性が適用される。この属性は、アクセス可能なＡＰＩに対する低減可視性が動的アクセス要求に提供されることになることを、ランタイム時においてランタイム環境に示す（例えば、リフレクションまたは他の動的コール技法によって）。ＡＰＩに対する可視性を低減させることにより、対応して、メタデータの生成を減らすことができる。実施形態の中には、ＡＰＩに対する可視性を低減させることは、このＡＰＩに対する動的アクセスを禁止することを含むものもある。
【００１１】
更に他の実施形態は、コンシューマに、ＡＰＩに対する指定可視性を提供することを含む。ランタイム環境において、実行可能コードが実行される。実行可能コードは、アプリケーション・コードから導出される。実行可能コードの実行中に、コンシューマから、この実行可能コードの一部を実行するための動的コールを受ける。この実行可能コードの一部は、ライブラリ内部においてＡＰＩを参照するアプリケーション・コードの一部から導出される。このＡＰＩに対するランタイム・デフォルト可視性は、ＡＰＩのタイプに基づいてアクセスされる。
【００１２】
ＡＰＩに適用される任意の属性がアクセスされる。ＡＰＩに適用される属性は、ＡＰＩに対するランタイム・デフォルト可視性を変更するというＡＰＩの作者による希望を示すことができる。アプリケーション・コードの一部に適用される任意の属性がアクセスされる。アプリケーション・コードの一部に適用される属性は、ＡＰＩに適用される任意の属性によって変更され、ランタイム・デフォルト可視性によって示されるのよりも少ない可視性をＡＰＩに対して提供するという、アプリケーション・コードの作者による希望を示すことができる。
【００１３】
ＡＰＩに対する算出可視性(calculated visibility)は、ＡＰＩに対するランタイム・デフォルト可視性、ＡＰＩに適用される任意の属性、およびＡＰＩを参照するアプリケーション・コードの一部に適用される任意の属性の内１つ以上に基づいて決定される。動的コールには、このＡＰＩに対する算出可視性が提供される。
【００１４】
この摘要は、詳細な説明において以下で更に説明する概念から選択したものを、簡略化した形態で記載するために設ける。この摘要は、特許請求する主題の主要な特徴や必須の特徴を特定することを意図するのではなく、特許請求する主題の範囲を判断するときに補助として用いられることを意図するのでもない。
【００１５】
本発明の更に他の特徴および利点について、以下に続く説明において明記するが、これらは部分的にこの説明から明らかになり、または本発明の実施によって習得することができる。本発明の特徴および利点は、添付された特許請求の範囲において特定的に指摘される手段(instrument)および組み合わせによって実現し取得することができる。本発明のこれらおよびその他の特徴は、以下の説明および添付された特許請求の範囲から一層完全に明白となり、あるいは以下に明記するように本発明の実施によって習得することができる。
【００１６】
本発明の以上で列挙したおよび他の利点ならびに特徴を得ることができる様態について説明するために、添付図面に示される具体的な実施形態を参照して、以上で端的に説明した本発明について、更に特定した説明を行う。これらの図面は本発明の典型的な実施形態を描画するに過ぎず、したがってその範囲の限定であると見なしてはならないことを理解の上で、添付図面の使用を通じて、更に具体性をもってそして詳細に、本発明について説明する。
【図面の簡単な説明】
【００１７】
【図１】図１は、アプリケーション・プログラミング・インターフェースに対するランタイム・アクセス制御を容易にする一例のコンピュータ・アーキテクチャを示す。
【図２】図２は、アプリケーション・プログラミング・インターフェースに対するランタイム・アクセスを制御する一例の方法のフロー・チャートを示す。
【図３】図３は、アクセス可能なアプリケーション・プログラミング・インターフェースに対するデフォルト可視性を低減させるのを容易にするコンピュータ・アーキテクチャの一例を示す。
【図４】図４は、アクセス可能なアプリケーション・プログラミング・インターフェースに対するデフォルト可視性を低減させる一例の方法のフロー・チャートを示す。
【図５】図５は、アプリケーション・プログラミング・インターフェースに対する指定可視性をコンシューマに提供するのを容易にする一例のコンピュータ・アーキテクチャを示す。
【図６】図６は、アプリケーション・プログラミング・インターフェースに対する指定可視性をコンシューマに提供する方法の一例のフロー・チャートを示す。
【発明を実施するための形態】
【００１８】
本発明は、アプリケーション・プログラミング・インターフェースに対するランタイム・アクセスを制御するための方法、システム、およびコンピュータ・プログラム製品にまで及ぶ。本発明の実施形態は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対してランタイム・アクセスを制御することを含む。ランタイム環境は、動的アクセス要求に（例えば、リフレクションまたは他の動的コール技法によって）、ＡＰＩタイプに基づいて、ＡＰＩに対するデフォルト可視性(default visibility)を提供する。例えば、非パブリックＡＰＩに対するデフォルト可視性は、動的アクセスを禁止することができる。
【００１９】
ライブラリにおいて組み合わせられた一組のＡＰＩがアクセスされる。この一組のＡＰＩは、１つ以上のパブリックＡＰＩおよび１つ以上の非パブリックＡＰＩを含む。動的アクセス要求に対して提供されたデフォルト可視性が変更されるべきＡＰＩが、一組のＡＰＩの中から識別される。
【００２０】
属性をＡＰＩに適用することによって、ＡＰＩに対するデフォルト可視性が変更される。属性は、ＡＰＩに対する変更可視性が動的アクセス要求に提供されることになることを、ランタイム時においてランタイム環境に示す。可視性の変更は、デフォルトでは動的アクセスが許可されない非パブリックＡＰＩに対する動的アクセスを許可することを含むことができる。
【００２１】
他の実施形態は、アクセス可能なＡＰＩに対するデフォルト可視性を低減させることを含む。アプリケーションのアプリケーション・コードがアクセスされる。このアプリケーション・コードは、ライブラリにおいて組み合わされた１つ以上のアクセス可能なＡＰＩを参照する。アプリケーション・コード内部において参照されるアクセス可能なＡＰＩが識別される。アクセス可能なＡＰＩは、１つ以上のアクセス可能なＡＰＩの中から選択される。
【００２２】
アクセス可能なＡＰＩが、ランタイムにおいて動的にアクセスされることにはならないと判断する。アクセス可能なＡＰＩに対するデフォルト可視性を低減させるために、アクセス可能なＡＰＩに属性が適用される。この属性は、アクセス可能なＡＰＩに対する低減可視性が動的アクセス要求に提供されることになることを、ランタイム時においてランタイム環境に示す（例えば、リフレクションまたは他の動的コール技法によって）。ＡＰＩに対する可視性を低減させることにより、対応して、メタデータの生成を減らすことができる。実施形態の中には、ＡＰＩに対する可視性を低減させることは、このＡＰＩに対する動的アクセスを禁止することを含むものもある。
【００２３】
更に他の実施形態は、コンシューマに、ＡＰＩに対する指定可視性を提供することを含む。ランタイム環境において、実行可能コードが実行される。実行可能コードは、アプリケーション・コードから導出される。実行可能コードの実行中に、コンシューマから、この実行可能コードの一部を実行するための動的コールを受ける。この実行可能コードの一部は、ライブラリ内部においてＡＰＩを参照するアプリケーション・コードの一部から導出される。このＡＰＩに対するランタイム・デフォルト可視性は、ＡＰＩのタイプに基づいてアクセスされる。
【００２４】
ＡＰＩに適用される任意の属性がアクセスされる。ＡＰＩに適用される属性は、ＡＰＩに対するランタイム・デフォルト可視性を変更するという、ＡＰＩの作者による希望を示すことができる。アプリケーション・コードの一部に適用される任意の属性がアクセスされる。アプリケーション・コードの一部に適用される属性は、ＡＰＩに適用される任意の属性によって変更されて、ランタイム・デフォルト可視性によって示されるよりのも少ない可視性をＡＰＩに対して提供するという、アプリケーション・コードの作者による希望を示すことができる。
【００２５】
ＡＰＩに対する算出可視性は、ＡＰＩに対するランタイム・デフォルト可視性、ＡＰＩに適用される任意の属性、およびＡＰＩを参照するアプリケーション・コードの一部に適用される任意の属性の内１つ以上に基づいて決定される。動的コールには、このＡＰＩに対する算出可視性が提供される。
【００２６】
本発明の実施形態は、以下で更に詳細に論ずるように、例えば、１つ以上のプロセッサおよびシステム・メモリというような、コンピュータ・ハードウェアを含む特定用途または汎用コンピュータを含むこと、または利用することができる。また、本発明の範囲内における実施形態は、コンピュータ実行可能命令および／またはデータ構造を搬送あるいは格納するための物理的およびその他のコンピュータ読み取り可能媒体も含む。このような、コンピュータ読み取り可能媒体は、汎用または特殊目的コンピュータ・システムによってアクセスすることができる任意の入手可能な媒体とすることができる。コンピュータ実行可能命令を格納するコンピュータ読み取り可能媒体は、コンピュータ記憶媒体（デバイス）である。コンピュータ実行可能命令を搬送するコンピュータ読み取り可能媒体は、送信媒体である。つまり、一例として、そして限定ではなく、本発明の実施形態は、少なくとも２つの全く異なる種類のコンピュータ読み取り可能媒体、即ち、コンピュータ記憶媒体（デバイス）および送信媒体を含むことができる。
【００２７】
コンピュータ記憶媒体（デバイス）は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭ、ソリッド・ステート・ドライブ（「ＳＳＤ」）（例えば、ＲＡＭに基づく）、フラッシュ・メモリ、位相変更メモリ（「ＰＣＭ: phase-change memory」）、他のタイプのメモリ、他の光ディスク・ストレージ、磁気ディスク・ストレージまたは他の磁気記憶デバイス、あるいは、所望のプログラム・コード手段をコンピュータ実行可能命令の形態で格納するため、またはデータ構造を格納するために使用することができ、汎用または特定用途のコンピュータによってアクセスすることができる任意の他の媒体を含む。
【００２８】
「ネットワーク」とは、コンピュータ・システムおよび／またはモジュールおよび／または他の電子デバイス間における電子データの輸送を可能にする１つ以上のデータ・リンクとして定義される。情報がネットワークまたは他の通信接続を通じてコンピュータに転送されるとき（ハードワイヤ、ワイヤレス、あるいはハードワイヤまたはワイヤレスの組み合わせのいずれか）、コンピュータがこの接続を送信媒体として見なすのは適正である。送信媒体は、所望のプログラム・コード手段をコンピュータ実行可能命令の形態で、またはデータ構造を搬送するために使用することができ、汎用または特定用途コンピュータによってアクセスすることができるネットワークおよび／またはデータ・リンクを含むことができる。以上の組み合わせも、コンピュータ読み取り可能媒体の範囲に含まれてしかるべきである。
【００２９】
更に、種々のコンピュータ・システムのコンポーネントに到達すると、コンピュータ実行可能命令の形態であるプログラム・コード手段、またはデータ構造を自動的にコンピュータ記憶媒体（デバイス）に（またはその逆に）自動的に転送することができる。例えば、ネットワークまたはデータ・リンクを通じて受信されたコンピュータ実行可能命令またはデータ構造を、ネットワーク・インターフェース・モジュール（例えば、「ＮＩＣ」）内にあるＲＡＭにバッファし、次いで最終的にコンピュータ・システムのＲＡＭおよび／またはコンピュータ・システムにおいてより揮発性が少ないコンピュータ記憶媒体（デバイス）に転送することができる。このため、コンピュータ記憶媒体（デバイス）を、送信媒体も利用する（または主に利用するのでもよい）コンピュータ・システム・コンポーネントに含むことができる。
【００３０】
コンピュータ実行可能命令は、例えば、命令およびデータを含み、プロセッサにおいて実行されると、汎用コンピュータ、特定用途コンピュータ、または特定用途処理デバイスに、ある種の機能または一群の機能を実行させる。コンピュータ実行可能命令は、例えば、アセンブリ言語のような２進、中間フォーマット命令、またはソース・コードであってもよい。構造的特徴および／または方法論的アクトに特定的な文言で本主題について説明したが、添付する特許請求の範囲において定められる主題は、必ずしも、以上で説明した特徴や行為に限定されないことは理解されてしかるべきである。逆に、説明した特徴および行為は、特許請求の範囲を実現する形態例として開示されるまでである。
【００３１】
本発明は、パーソナル・コンピュータ、デスクトップ・コンピュータ、ラップトップ・コンピュータ、メッセージ・プロセッサ、ハンドヘルド・デバイス、マルチプロセッサ・システム、マイクロプロセッサ・ベースのまたはプログラマブル・コンシューマ用電子機器、ネットワークＰＣ、ミニコンピュータ、メインフレーム・コンピュータ、移動体電話機、ＰＤＡ、タブレット、ページャー、ルーター、スイッチ等を含む、多くのタイプのコンピュータ・システム構成を有するネットワーク・コンピューティング環境において実施することができる。また、本発明は、分散型システム環境においても実施することができる。分散型システム環境では、ネットワークを通じてリンクされた（ハードワイヤ・データ・リンク、ワイヤレス・データ・リンク、またはハードワイヤおよびワイヤレス・データ・リンクの組み合わせのいずれかによって）ローカルおよびリモート・コンピュータ・システムの双方がタスクを実行する。分散型システム環境では、プログラム・モジュールは、ローカルおよびリモート・メモリ記憶デバイスの双方に配置されてもよい。
【００３２】
また、本発明の実施形態は、クラウド・コンピューティング環境において実現することもできる。この説明およびそれに続く特許請求の範囲において、「クラウド・コンピューティング」とは、構成可能なコンピューティング・リソースの共有プールに対する、要求に応じたネットワーク・アクセスを可能にするモデルとして定義される。例えば、クラウド・コンピューティングは、構成可能なコンピューティング・リソースの共有プールに対して、要求に応じた遍在的で便利なアクセスを提供するために、マーケットプレースにおいて採用することができる。構成可能なコンピューティング・リソースの共有プールは、仮想化によって素早くプロビジョニングし、少ない管理の手間またはサービス・プロバイダの介在で解放し、次いでしかるべくスケーリングすることができる。
【００３３】
クラウド・コンピューティング・モデルは、例えば、要求に応じたセルフ・サービス、ブロード・ネットワーク・アクセス、リソース・プーリング、即時性(rapid elasticity)、計測可能であること(measured service)等というような、種々の特性で構成することができる。また、クラウド・コンピューティング・モデルは、例えば、サービスとしてのソフトウェア（「ＳａａＳ」）、サービスとしてのプラットフォーム（「ＰａａＳ」）、およびサービスとしてのインフラストラクチャー（「ＩａａＳ」）というような、種々のサービス・モデルを公開することもできる。また、クラウド・コンピューティング・モデルは、プライベート・クラウド、コミュニティ・クラウド、パブリック・クラウド、ハイブリッド・クラウド等というような、異なる配備モデルを使用してデプロイすることもできる。この説明および特許請求の範囲では、「クラウド・コンピューティング環境」とは、クラウド・コンピューティングが採用された環境である。
【００３４】
本発明の実施形態は、ライブラリ開発者が、彼らのライブラリのＡＰＩの内どれを動的にコールできるかについて、更に正確にそして容易に制御することを可能にする。つまり、彼らのサービス提供およびバージョン変更の手間を一層適切に制御することができる。更に、アプリケーション開発者は、ランタイム・サポートのオーバーヘッドを最小化するために、動的コールのシナリオから、このようなＡＰＩの内どれを更に除外するかを制御することができる。
【００３５】
図１は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）へのアクセス制御を容易にする一例のコンピュータ・アーキテクチャ１００を示す。図１を参照すると、コンピュータ・アーキテクチャ１００は、開発環境１０１およびランタイム環境１０２を含む。開発環境１０１およびランタイム環境１０２は、例えば、システム・バス、ローカル・エリア・ネットワーク（「ＬＡＮ」）、ワイド・エリア・ネットワーク（「ＷＡＮ」）、および更にはインターネットというようなネットワークを通じて互いに接続することができる（またはその一部であることができる）。したがって、開発環境１０１およびランタイム環境１０２、ならびに任意の他の接続されたコンピュータ・システムおよびそのコンポーネントは、メッセージ関係データを作成し、メッセージ関係データ（例えば、インターネット・プロトコル（「ＩＰ」）データグラム、および送信制御プロトコル（「ＴＣＰ」）、ハイパーテキスト転送プロトコル（「ＨＴＴＰ」）、シンプル・メール転送プロトコル（「ＳＭＴＰ」）等というような、ＩＰデータグラムを利用する、あるいは他の非データグラム・プロトコルを使用する、他の上位層のプロトコル）を、ネットワークを通じて交換することができる。
【００３６】
開発環境１０１は、ソフトウェア開発のための設備を提供するソフトウェア・アプリケーションであることが可能であり、ソース・コード・エディタ、ビルド・オートメーション(build automation)、デバッガ、バージョン制御システム、クラス・ブラウザ、オブジェクト・インスペクタ、クラス階層図等を含むがこれらに限定されるのではない。実施形態の中には、開発環境１０１は、統合開発環境（ＩＤＥ）を含む、またはこれに含まれるものもある。ライブラリ開発者は、開発環境１０１を使用して、動的アクセス要求に対するＡＰＩの可視性を変更するためにＡＰＩに属性を適用することができる。
【００３７】
ランタイム環境１０２は、ソフトウェア実行のための設備を提供するソフトウェア・アプリケーションであることが可能である。ランタイム環境１０２は、コンパイラ（例えば、ジャストインタイム（ＪＩＴ）コンパイラ）、および／またはソフトウェア開発環境１０１において開発されたコードを実行するインタープリタを含むことができる。実施形態の中には、ランタイム環境１０２は、統合開発環境（ＩＤＥ）を含む、またはこれに含まれるものもある。ランタイム環境１０２は、ＡＰＩに対するアクセスを動的に要求するメカニズム（例えば、リフレクション）を含むことができる。
【００３８】
開発環境１０１および実行環境１０２は、同じ環境に統合することができ、または別個の環境に存在することができる。
ランタイム環境１０２は、可視性計算モジュール１０９を含む。可視性計算モジュールは、ＡＰＩのタイプ（例えば、内部、プライベート、パブリック等）および適用される属性に基づいて、ＡＰＩに対する可視性を計算するように構成される。デフォルトの可視性規則１０８が、ＡＰＩタイプ毎にデフォルトの可視性を定義することができる（例えば、動的アクセスを許可する、または動的アクセスを除去する）。適用される属性は、デフォルトの可視性を変更するまたは無効にするために使用することができる。したがって、適用される属性は、ライブラリ開発者に、どのように個々のＡＰＩを動的にアクセスできるかについて、更に正確な制御を行わせる。
【００３９】
実施形態の中には、デフォルト可視性規則１０８は、プライベートまたは内部として示されるＡＰＩに対して、動的アクセスを除去することを定めるものもある。ライブラリ開発者は、開発環境１０１を使用してプライベートＡＰＩまたは内部ＡＰＩに属性を適用することができる。適用される属性は、動的アクセスがプライベートＡＰＩまたは内部ＡＰＩに対して許可されることになることを示すことができる。プライベートＡＰＩまたは内部ＡＰＩに対する動的コールを受けると、可視性計算モジュール１０９は、適用される属性が、プライベートまたは内部ＡＰＩに対する（除去された動的アクセスの）デフォルトの可視性を無効にすると判断することができる。したがって、この動的コールは、プライベートＡＰＩまたは内部ＡＰＩに対するアクセスが許可される。
【００４０】
図２は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するアクセスを制御する一例の方法２００のフロー・チャートを示す。方法２００については、コンピュータ・アーキテクチャ１００のコンポーネントおよびデータに関して説明する。
【００４１】
方法２００は、ライブラリに組み合わせられた一組のアプリケーション・プログラミング・インターフェース（ＡＰＩ）にアクセスするステップ（２０１）を含む。この一組のアプリケーション・プログラミング・インターフェース（ＡＰＩ）は、１つ以上のパブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）、および１つ以上の非パブリック・アプリケーション・プログラミング・インターフェース（ＡＰＩ）を含む。例えば、開発環境１０１は、ライブラリ１０３にアクセスすることができる。ライブラリ１０３は、パブリックＡＰＩ１０４を含む１つ以上のパブリックＡＰＩを含む。ライブラリ１０３は、非パブリックＡＰＩ１０６を含む１つ以上の非パブリック（例えば、プライベートまたは内部）ＡＰＩを含む。
【００４２】
方法２００は、一組のアプリケーション・プログラミング・インターフェース（ＡＰＩ）から、動的アクセス要求に提供されたデフォルト可視性を変更されることになるアプリケーション・プログラミング・インターフェース（ＡＰＩ）を識別するステップ（２０２）を含む。例えば、開発環境１０１は（可能性としては、作者の入力に応答して）、動的アクセス要求（例えば、リフレクションまたは他の動的コール技法を使用する）に対する、非パブリックＡＰＩ１０６に対するデフォルト可視性が変更されることになることを識別することができる。
【００４３】
方法２００は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に属性を適用することによって、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するデフォルトの可視性を、変更可視性(altered visibility)に変更するステップ（２０３）を含む。この属性は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する変更可視性が、動的アクセス要求に提供されることになることを、ランタイム時においてランタイム環境に示す。例えば、作者１１３が開発環境１０１において可視性入力１１２を入力することができる。可視性の入力１１２に応答して、開発環境１０１は、属性１０７を非パブリックＡＰＩ１０６に適用することができる。属性１０７は、デフォルトの可視性規則１０８において定められた非パブリックＡＰＩに対するデフォルト可視性が、非パブリックＡＰＩ１０６に対して変更されることになることを、ランタイム環境１０２に示すことができる。
【００４４】
その後、ライブラリ１０３を他のソース・コードと共に編集して実行可能コード１１１にすることができる。実行可能コード１１１の実行中、可視性計算モジュール１０９は、デフォルト可視性規則１０８と、非パブリックＡＰＩ１０６に対する可視性を計算したときの属性１０７との双方を考慮することができる。実施形態の中には、属性１０７は、デフォルト可視性規則１０８が、非パブリックＡＰＩに対する動的アクセスは禁止されることを示したとしても、非パブリックＡＰＩ１０６に対する動的アクセスが許可されることを示すものもある。
【００４５】
図３は、アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するデフォルト可視性を低減させるのを容易にするコンピュータ・アーキテクチャの一例１００を示す。図３を参照すると、コンピュータ・アーキテクチャ３００は、開発環境３０１およびランタイム環境３０２を含む。開発環境３０１およびランタイム環境３０２は、例えば、システム・バス、ローカル・エリア・ネットワーク（「ＬＡＮ」）、ワイド・エリア・ネットワーク（「ＷＡＮ」）、更にはインターネットというような、ネットワークを通じて互いに接続する（またはその一部である）ことができる。したがって、開発環境３０１およびランタイム環境３０２、更には任意の他の接続されるコンピュータ・システムおよびそれらのコンポーネントは、メッセージ関係データを作成し、ネットワークを通じてネットワーク関係データ（例えば、インターネット・プロトコル（「ＩＰ」）データグラム、および送信制御プロトコル（「ＴＣＰ」）、ハイパーテキスト転送プロトコル（「ＨＴＴＰ」）、シンプル・メール転送プロトコル（「ＴＣＰ」）等というようなＩＰデータグラムを利用する、あるいは他の非データグラム・プロトコルを使用する、他の上位層のプロトコル）を交換することができる。
【００４６】
開発環境３０１は、ソフトウェア開発のための設備を提供するソフトウェア・アプリケーションであることが可能であり、ソース・コード・エディタ、ビルド・オートメーション(build automation)、デバッガ、バージョン制御システム、クラス・ブラウザ、オブジェクト・インスペクタ、クラス階層図等を含むがこれらに限定されるのではない。実施形態の中には、開発環境１０１は、統合開発環境（ＩＤＥ）を含む、またはこれに含まれるものもある。アプリケーション開発者は、開発環境３０１を使用して、アクセス可能なＡＰＩ（例えば、サード・パーティ・ライブラリに含まれる）を参照するコードに属性を適用することができる。アクセス可能なＡＰＩを参照するコードに適用される属性は、このアクセス可能なＡＰＩに対するデフォルト可視性を低減させるために使用することができる。
【００４７】
ランタイム環境３０２は、ソフトウェア実行のための設備を提供するソフトウェア・アプリケーションであることが可能である。ランタイム環境は、コンパイラ（例えば、ジャストインタイム（ＪＩＴ）コンパイラ）、および／またはソフトウェア開発環境３０１において開発されたコードを実行するインタープリタを含むことができる。実施形態の中には、ランタイム環境３０２は、統合開発環境（ＩＤＥ）を含む、またはこれに含まれるものもある。ランタイム環境３０２は、ＡＰＩに対するアクセスを動的に要求するメカニズム（例えば、リフレクション）を含むことができる。
【００４８】
開発環境３０１および実行環境３０２は、同じ環境に統合することができ、または別個の環境に存在することができる。
ランタイム環境３０２は、可視性計算モジュール３０９を含む。可視性計算モジュール３０９は、アクセス可能なＡＰＩ（例えば、動的アクセスを許可するように属性が設定されたパブリックＡＰＩまたは非パブリックＡＰＩ）を参照するコードに適用される属性に基づいて、ＡＰＩに対する可視性を計算するように構成される。デフォルト可視性規則３０８は、アクセス可能なＡＰＩに対する動的アクセスを許可することができる。したがって、適用される属性は、アプリケーション開発者に、この属性が適用されなければアクセス可能なＡＰＩ（例えば、サード・パーティ・ライブラリに含まれる）を動的アクセスから除外するメカニズムを与える。この属性が適用されなければアクセス可能なＡＰＩを、動的アクセスから除外することにより、ランタイム・サポート・オーバーヘッド（例えば、メタデータの生成）を最小化し、これによってリソースを保存する。
【００４９】
図４は、アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するデフォルト可視性を低減させる一例の方法４００のフロー・チャートを示す。方法４００については、コンピュータ・アーキテクチャ３００のコンポーネントおよびデータを関して説明する。
【００５０】
方法４００は、アプリケーションのアプリケーション・コードにアクセスするステップ（４０１）を含み、アプリケーション・コードは、ライブラリに組み合わされた１つ以上のアクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）を参照する。例えば、開発環境３０１は、アプリケーション・コード３１４にアクセスすることができる。また、開発環境３１０はライブラリ３０にもアクセスすることができる。アプリケーション・コード３１４は、例えば、ライブラリ３０３に含まれるＡＰＩ３０４および３０６のような、１つ以上のＡＰＩを参照することができる。
【００５１】
方法４００は、アプリケーション・コード内部において参照されるアクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）を識別するステップ（４０２）を含む。アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）は、１つ以上のアクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）の中から選択される。例えば、開発環境３０１は、ＡＰＩ参照３１６によって参照されるＡＰＩ３０６を識別することができる。
【００５２】
方法４００は、アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）がランタイムにおいて動的にアクセスされることにはならないと判断するステップ（４０３）を含む。例えば、開発環境３０１が（可能性としては、作者の入力に応答して）、ＡＰＩ３０６に対する動的アクセスが禁止されることになることを決定することができる。
【００５３】
方法４００は、アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）を参照するアプリケーション・コードの部分に属性を適用することによって、アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するデフォルト可視性を、低減可視性に低減させるステップ（４０４）を含む。この属性は、アクセス可能なアプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する低減可視性が、動的アクセス要求に提供されることになることを、ランタイム時においてランタイム環境に示す。例えば、作者３１３は、開発環境３０１において可視性入力３１２を入力することができる。可視性入力３１２に応答して、開発環境３０１は、属性３１７をＡＰＩ参照３１６（ＡＰＩ３０６に対する参照）に適用することができる。属性３１７は、ＡＰＩ３０６に対するデフォルト可視性が狭められるべきことを、ランタイム環境３０２に示すことができる。
【００５４】
その後、アプリケーション・コード３１４およびライブラリ３０３を、（恐らく、他のソース・コードと共に）コンパイルして、実行可能コード３１１にすることができる。実行可能コード３１１の実行中、可視性計算モジュール３０９は、デフォルト可視性規則３０８と、ＡＰＩ３０６に対する可視性を計算したときの属性３１７との双方を考慮することができる。実施形態の中には、デフォルト可視性規則３０８がアクセス可能なＡＰＩに対する動的アクセスが許可されることを示しても、属性３１７はＡＰＩ３０６に対する動的アクセスが禁止されることを示すものある。
【００５５】
ＡＰＩに対する限定可視性は、ＡＰＩについてのメタデータを生成しないことを含むことができる。例えば、コンピュータ・アーキテクチャ３００において示すように、メタデータはＡＰＩ３０６には生成されない。一方で、ＡＰＩ３０４（アプリケーション・コード３１４から参照される他のアクセス可能なＡＰＩ）には、メタデータ３１９を生成することができる。
【００５６】
図５は、コンシューマに、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する指定可視性を提供するのを容易にするランタイム環境の一例５００を示す。図５を参照すると、ランタイム環境５００は、可視性計算モジュール５０１およびコンシューマ５３１を含む。可視性計算モジュール５０１およびコンシューマ５０３は、例えば、システム・バス、ローカル・エリア・ネットワーク（「ＬＡＮ」）、ワイド・エリア・ネットワーク（「ＷＡＮ」）、更にはインターネットというような、ネットワークを通じて互いに接続することができる。したがって、可視性計算モジュール５０１およびコンシューマ５３１、更には任意の他の接続されるコンピュータ・システムおよびそれらのコンポーネントは、メッセージ関係データを作成し、ネットワークを通じてメッセージ関係データ（例えば、インターネット・プロトコル（「ＩＰ」）データグラム、および送信制御プロトコル（「ＴＣＰ」）、ハイパーテキスト転送プロトコル（「ＨＴＴＰ」）、シンプル・メール転送プロトコル（「ＴＣＰ」）等というようなＩＰデータグラムを利用する、あるいは他の非データグラム・プロトコルを使用する、他の更に上位層のプロトコル）を交換することができる。
【００５７】
ランタイム環境５００は、ソフトウェア実行のための設備を提供するソフトウェア・アプリケーションであることが可能である。ランタイム環境は、コンパイラ（例えば、ジャストインタイム（ＪＩＴ）コンパイラ）、および／またはソフトウェア開発環境５００において開発されたコードを実行するインタープリタを含むことができる。実施形態の中には、ランタイム環境５００は、統合開発環境（ＩＤＥ）を含む、またはこれに含まれるものもある。ランタイム環境５００は、ＡＰＩに対するアクセスを動的に要求するメカニズム（例えば、リフレクション(reflection)）を含むことができる。
【００５８】
ランタイム環境５００は、可視性計算モジュール５０１を含む。可視性計算モジュール５０１は、ライブラリ内に一緒にグループ化された複数のＡＰＩの各々に対する可視性を計算するように構成される。可視性は、ＡＰＩのタイプ（例えば、内部、プライベート、パブリック）、ＡＰＩに適用される属性（例えば、ライブラリ作者）、およびＡＰＩを参照するアプリケーションに適用される属性に基づいて、ＡＰＩ毎に計算することができる。適用された属性は、デフォルトの可視性を変更する、無効にする、低減させる等のために使用することができる。
【００５９】
実施形態の中には、デフォルト可視性規則５０２が、非パブリック（例えば、プライベートまたは内部）ＡＰＩに対して動的アクセスが除去されること、およびパブリックＡＰＩに対して動的アクセスが許可されることを定めるものもある。しかしながら、非パブリックＡＰＩの作者（例えば、ライブラリの作者）が、デフォルト可視性を無効にし、非パブリックＡＰＩに対する動的アクセスを許可するために、属性を非パブリックＡＰＩに適用することができる。同様に、パブリックＡＰＩの作者（例えば、ライブラリの作者）がデフォルト可視性を無効にし、パブリックＡＰＩに対する動的アクセスを拒否するために、属性をパブリックＡＰＩに適用することもできる。他のデフォルト可視性規則も可能である。
【００６０】
いずれの動的にアクセス可能なＡＰＩ（デフォルトで動的にアクセス可能であっても、適用された属性によって動的にアクセス可能になったのでもよい）に対しても、サード・パーティ作者（例えば、アプリケーションの作者）は、ＡＰＩから動的アクセスを除去するために、動的にアクセス可能なＡＰＩを参照するコードに属性を適用することができる。このため、アプリケーションの作者は、ランタイム・サポート・オーバーヘッド（例えば、メタデータの生成）を最小化することができ、これによってリソースを保存する。
【００６１】
図６は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する指定可視性をコンシューマに提供する一例の方法６００のフロー・チャートを示す。方法６００については、ランタイム環境５００のコンポーネントおよびデータに関して説明する。
【００６２】
方法６００は、ランタイム環境において実行可能コードを実行するステップ（６０１）を含み、実行可能コードは、アプリケーション・コードから導出される。例えば、実行可能コードは、ランタイム環境５００において実行することができる。実行可能コード５０３は、ライブラリに収容されたＡＰＩに対する参照を含むアプリケーション・コードから導出することができる。例えば、ＡＰＩ参照５１１および５１７は、ライブラリに収容されたＡＰＩを参照することができる。ライブラリに収容されたＡＰＩは、ＡＰＩ５１３および５１８を含むことができる。
【００６３】
方法６００は、実行可能コードの実行中に、実行可能コードの一部を実行するためにコンシューマから動的コールを受けるステップ（６０２）を含む。この実行可能コードの一部は、ライブラリ内部においてアプリケーション・プログラミング・インターフェース（ＡＰＩ）を参照するアプリケーション・コードの一部から導出される。例えば、動的コール５２１は、コンシューマ５３１から受けることができる。動的コール５２１は、実行可能コード５０３の一部を実行するためのコールであることが可能である。
【００６４】
一実施形態では、動的コール５２１は、ＡＰＩ参照５１１を含む実行可能コードを実行するためのコールである。ＡＰＩ参照５１１は、ＡＰＩ５１３またはＡＰＩ５１８のいずれかを参照することができる。他の実施形態では、動的コール５２１は、ＡＰＩ参照５１７を含む実行可能コードを実行するためのコールである。ＡＰＩ参照５１７は、ＡＰＩ５１３またはＡＰＩ５１８のいずれかを参照することができる。
【００６５】
方法６００は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）のタイプに基づいて、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するランタイム・デフォルト可視性にアクセスするステップ（６０３）を含む。タイプ５１４によって示されるように、ＡＰＩ５１３は非パブリックＡＰＩである。つまり、ＡＰＩ参照がＡＰＩ５１３を参照するとき、非パブリックＡＰＩに対するランタイム・デフォルト可視性（例えば、動的アクセスを禁止する）に、デフォルト可視性規則５０２（ＡＰＩ５１３に対する）からアクセスすることができる。タイプ５１９によって示されるように、ＡＰＩ５１８はパブリックＡＰＩである。つまり、ＡＰＩ参照がＡＰＩ５１８を参照するとき、パブリックＡＰＩに対するランタイム・デフォルト可視性（例えば、動的アクセスを許可する）に、（ＡＰＩ５１８についての）デフォルト可視性規則５０２からアクセスすることができる。
【００６６】
方法６００は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に適用される任意の属性にアクセスするステップ（６０４）を含む。アプリケーション・プログラミング・インターフェース（ＡＰＩ）に適用される属性は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するランタイム・デフォルト可視性を変更するという、アプリケーション・プログラミング・インターフェース（ＡＰＩ）の作者による希望を示す。例えば、ＡＰＩ参照がＡＰＩ５１３を参照するとき、属性５１６にアクセスすることができる。属性５１６は、ＡＰＩ５１３に対するランタイム・デフォルト可視性（デフォルト可視性規則５０２において定められる）を変更するという、ライブラリ作者による希望を示すことができる。例えば、デフォルトでは、非パブリックＡＰＩに対する動的アクセスを禁止することができる。しかしながら、属性５１３は、ＡＰＩ５１３に対する動的アクセスが許可されることになることを示すことができる。
【００６７】
方法６００は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）を参照するアプリケーション・コードの一部に適用される任意の属性にアクセスするステップ（６０５）を含む。アプリケーション・コードの一部に適用される属性は、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する可視性が、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に適用される任意の属性によって変更され、ランタイム・デフォルト可視性によって示されるよりも少ない程度で提供されるという、アプリケーション・コードの作者による希望を示す。例えば、動的コール５２１が、ＡＰＩ参照５１１を含む実行可能コードを実行するためのコールであるとき、属性５１２にアクセスすることができる。属性５１２は、参照ＡＰＩ（例えば、ＡＰＩ５１３またはＡＰＩ５１８）に対する可視性を低減させるという、アプリケーション作者による希望を示すことができる。例えば、属性５１２は、参照ＡＰＩ（例えば、ＡＰＩ５１３またはＡＰＩ５１８）に対する動的アクセスが禁止されることを示すことができる。したがって、ライブラリの作者が他の方法でＡＰＩに対する動的アクセスを許可しても、アプリケーション開発者は、属性５１２を適用して、ＡＰＩに対する動的アクセスを禁止することができる。
【００６８】
方法６００は、以下の内１つ以上に基づいて、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する算出可視性(calculated visibility)を決定するステップ（６０６）を含む。アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対するランタイム・デフォルト可視性、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に適用される任意の属性、およびアプリケーション・プログラミング・インターフェース（ＡＰＩ）を参照するアプリケーション・コードの一部に適用される任意の属性。このように、可視性計算モジュール５０１は、（デフォルト可視性規則５０２において定められる）ＡＰＩのタイプ、ＡＰＩに適用される任意の属性、およびＡＰＩを参照するＡＰＩ参照に適用される任意の属性に基づいて、ＡＰＩに対する算出可視性５２２を決定することができる。
【００６９】
方法６００は、算出可視性にしたがって、アプリケーション・プログラミング・インターフェース（ＡＰＩ）に対する可視性を、動的コールに提供するステップ（６０７）を含む。例えば、コンシューマ５３１に、実行可能コード５０３において動的にコールされるＡＰＩに対する可視性５２２を提供することができる。また、動的コール５２１の結果５２４をコンシューマ５３１に戻すこともできる。結果５２４は、動的にコールされたＡＰＩに動的アクセスが許可されないことを示すこともあり得る。
【００７０】
実行可能コード５０３内部において、参照元(referring)コードおよびＡＰＩの種々の異なる組み合わせが可能である。一実施形態では、動的コール５２１がＡＰＩ参照５１１を使用してＡＰＩ５１３をコールする。この実施形態では、可視性５２２は、ＡＰＩタイプ５１４に対するデフォルト可視性（例えば、デフォルト可視性規則５０２において定められる）、属性５１２、および属性５１６から決定される。他の実施形態では、動的コール５２１はＡＰＩ参照５１１を使用してＡＰＩ５１８をコールする。この実施形態では、可視性５２２は、ＡＰＩタイプ５１９に対するデフォルト可視性（例えば、デフォルト可視性規則５０２において定められる）、および属性５１２から決定される。
【００７１】
更に他の実施形態では、動的コール５２１はＡＰＩ参照５１７を使用してＡＰＩ５１３をコールする。この更に他の実施形態では、可視性５２２は、ＡＰＩタイプ５１４に対するデフォルト可視性（例えば、デフォルト可視性規則５０２において定められる）および属性５１６から決定される。追加の実施形態では、動的コール５２１はＡＰＩ参照５１７を使用してＡＰＩ５１８をコールする。この更に他の実施形態では、可視性５２２は、ＡＰＩタイプ５１９に対するデフォルト可視性（例えば、デフォルト可視性規則５０２において定められる）から決定される。
【００７２】
本発明は、その主旨や本質的な特性から逸脱することなく、他の特定形態で具体化されてもよい。説明した実施形態は、あらゆる観点において、限定ではなく例示に過ぎないと見なすものとする。したがって、本発明の範囲は、以上の説明ではなく、添付した特許請求の範囲によって示される。特許請求の範囲の均等の意味および範囲に該当する全ての変更は、その範囲内に包含されるものとする。
【図１】
0006473442.tif 000002
【図２】
0006473442.tif 000003
【図３】
0006473442.tif 000004
【図４】
0006473442.tif 000005
【図５】
0006473442.tif 000006
【図６】
0006473442.tif 000007