(57)【特許請求の範囲】
【請求項１】
コンピュータ実行可能命令を有するコンピュータ可読記憶媒体であって、前記コンピュータ実行可能命令が、コンピューティングシステムの１つまたは複数のプロセッサにより実行されるときに、前記コンピューティングシステムに、アノテーションコンポーネントをメモリ内でインスタンス生成させ、前記アノテーションコンポーネントが、少なくとも、特定のオブジェクトグラフを参照する参照を返す実行可能コンポーネントを評価するように、および、前記実行可能コンポーネントにより返される前記参照をアノテートするように構成され、前記アノテーションコンポーネントが、以下のこと、すなわち、
前記実行可能コンポーネントへの何らかの入力引数が存在するかどうかを決定する動作と、
前記実行可能コンポーネントへの１つまたは複数の入力引数が存在する場合の、各々の入力引数が、イミュータブルであるか、オブジェクトグラフであって、前記オブジェクトグラフ内を指し示す外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを表すかのいずれかであるかどうかを決定する動作と、
前記実行可能コンポーネントへの入力引数が存在しないこと、または、各々の入力引数が、イミュータブルであるか、外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを表すかのいずれかであることのいずれかである場合の、表明属性を前記返される参照に割り当てる動作であって、前記表明属性が、１）前記返される参照により参照される前記特定のオブジェクトグラフへの外部参照が存在しないこと、および、２）前記オブジェクトグラフの外側のいずれのオブジェクトへも、前記オブジェクトグラフの内部のミュータブル参照が存在しないことを表明する、割り当てる動作と
を実行するように構成される、コンピュータ可読記憶媒体。
【請求項２】
前記実行可能コンポーネントが入力引数を有さない、請求項１に記載のコンピュータ可読記憶媒体。
【請求項３】
前記実行可能コンポーネントが少なくとも１つの入力引数を有する、請求項１に記載のコンピュータ可読記憶媒体。
【請求項４】
前記アノテーションコンポーネントが、前記入力引数が前記表明属性をさらに有すると決定することにより、前記入力引数が、外部ミュータブル参照を有さないオブジェクトグラフを参照すると決定する、請求項３に記載のコンピュータ可読記憶媒体。
【請求項５】
前記実行可能コンポーネントの前記入力引数の前記表明属性がさらに、前記アノテーションコンポーネントにより割り当てられた、請求項４に記載のコンピュータ可読記憶媒体。
【請求項６】
前記アノテーションコンポーネントが、前記入力引数のイミュータブルパーミッションを評価することにより、前記入力引数がイミュータブルであると決定する、請求項３に記載のコンピュータ可読記憶媒体。
【請求項７】
前記アノテーションコンポーネントが、前記入力引数をイミュータブルであるように制約する、前記実行可能コンポーネントの実行コンテキストを評価することにより、前記入力引数がイミュータブルであると決定する、請求項３に記載のコンピュータ可読記憶媒体。
【請求項８】
前記実行可能コンポーネントが、前記返される参照を、読み込み可能であるように、ただし潜在的には他のエンティティにより書き込み可能でもあるように制約すると宣言され、前記表明属性が、前記返される参照がイミュータブルであることである、請求項１に記載のコンピュータ可読記憶媒体。
【請求項９】
前記実行可能コンポーネントが、前記返される参照を、読み込み可能であるように制約すると宣言されない、請求項１に記載のコンピュータ可読記憶媒体。
【請求項１０】
コンピューティングシステムのアノテーションコンポーネントが、少なくとも、特定のオブジェクトグラフを参照する参照を返す実行可能コンポーネントを評価するための、および、前記実行可能コンポーネントにより返される前記参照をアノテートするための方法であって、
実行可能コンポーネントに対応するコードを評価する動作と、
実行の際に前記実行可能コンポーネントにより返されることになる返される参照を識別する動作と、
前記実行可能コンポーネントへの何らかの入力引数が存在するかどうかを決定する動作と、
前記実行可能コンポーネントへの１つまたは複数の入力引数が存在する場合の、前記入力引数が、イミュータブルであるか、オブジェクトグラフであって、前記オブジェクトグラフ内を指し示す外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを表すかのいずれかであるかどうかを決定する動作と、
前記実行可能コンポーネントへの入力引数が存在しないこと、または、各々の入力引数が、イミュータブルであるか、外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを表すかのいずれかであることのいずれかである場合の、表明属性を前記返される参照に割り当てる動作であって、前記表明属性が、１）前記返される参照により参照される前記特定のオブジェクトグラフへの外部参照が存在しないこと、および、２）前記オブジェクトグラフの外側のいずれのオブジェクトへも、前記オブジェクトグラフの内部のミュータブル参照が存在しないことを表明する、割り当てる動作と
を含む、方法。
【発明の詳細な説明】
【背景技術】
【０００１】
[0001]  コンピューティングシステムは、ソフトウェアプログラムを実行することにより高度の機能性を得る。プログラムは、ハードドライブ、コンパクトディスク、ｔｈｕｍｂｄｒｉｖｅ、フラッシュメモリ等々でなど、何らかの永続的な形式で維持されるコンピュータ実行可能命令からなる。実行の間、そのようなコンピュータ実行可能命令は、揮発性メモリ内にロードされ、コンピューティングシステムにタスクを実行させる、コンピューティングシステムの１つまたは複数のプロセッサにより実行される場合が多い。
【０００２】
[0002]  複数のプロセッサまたは複数のプロセッサコアを有するコンピューティングシステムは、複数の同時に実行するタスクにプログラムを区分することが多い。そのような同時実行は、応答性および処理効率を向上させることが可能であるが、同時実行によって、コンピューティングシステム内で（「共有状態」として知られている）同じデータにアクセスすることを試行する異なるタスクが結果として生じ得る。
【０００３】
[0003]  これに対して、共有状態へのアクセスが制約されないと、検出、再現、および解決するのが困難である問題につながる場合がある。これらの問題の中には、データ競合がある。データ競合は、タスクがメモリ内のオブジェクトの無効状態を察知することが可能であり、一方で別のタスクが、同じ時にそのオブジェクトの状態をミューテートしている状況である。同時性の有益性を活用し、一方でデータ競合を回避することは、歴史的に解決するのが困難な問題であった。
【発明の概要】
【課題を解決するための手段】
【０００４】
[0004]  本明細書で説明する少なくとも１つの実施形態は、実行可能コンポーネントからの返される参照のアノテーションに関する。返される参照は、特定のオブジェクトグラフを参照する。１）実行可能コンポーネントへの入力引数が存在しないこと、または、２）各々の入力引数が、イミュータブル（immutable）であるか、オブジェクトグラフであって、そのオブジェクトグラフ内を指し示す外部ミュータブル（mutable）参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを表すかのいずれかであることのいずれかである場合、特定の属性が、返される参照に割り当てられる。特定の属性は、１）返される参照により参照される特定のオブジェクトグラフへの（または、特定のオブジェクトグラフの内部のいずれのオブジェクトへも）外部参照が存在しないこと、および、２）オブジェクトグラフの外側のいずれのオブジェクトへも、オブジェクトグラフの内部のミュータブル参照が存在しないことを表明する。したがって返される参照は、どのようなアクセスパーミッションでも、返される参照に割り当てられたパーミッションの範囲内で、その返される参照に自由に割り当てられる。実例として、返される参照が、書き込み可能（writable）と宣言されるならば、返される参照は、返される参照が、任意のパーミッションを割り当てられ得る、および／または、分離型（isolated）メモリロケーションに割り当てられ得ることを表すように、特定の属性によってアノテートされ得るが、そのような割り当てによって、返される参照は特定の属性を失うことになる。このように、本明細書で説明する原理は、それへの外部参照が存在しない参照の適正な検出およびアノテーションを考慮に入れたものである。
【０００５】
[0005]  この概要は、請求する主題の主要な特徴または本質的な特徴を識別することは意図されず、この概要は、請求する主題の範囲を決定する一助として使用されることもまた意図されない。
【０００６】
[0006]  上記で列挙した、および他の、利点および特徴が得られ得る様式を説明するために、様々な実施形態のより詳細な説明を、添付の図面を参照することにより行う。これらの図面は、単なる見本の実施形態を図示するものであり、したがって本発明の範囲に関して限定的であると考えるべきではないことを理解して、実施形態を、付随する図面の使用によって、追加的な特異性および細部とともに、説明および解説する。
【図面の簡単な説明】
【０００７】
【図１】[0007]本明細書で説明する一部の実施形態が用いられ得るコンピューティングシステムを抽象的に例示する図である。
【図２】[0008]オブジェクトグラフの分離およびミュータビリティを追跡するフレームワーク、ならびにアノテーションコンポーネントを含む環境を例示する図である。
【図３】[0009]図２のアノテーションコンポーネントなどのアノテーションコンポーネントが、少なくとも、特定のオブジェクトグラフを参照する参照を返す実行可能コンポーネントを評価するための、および、実行可能コンポーネントにより返される参照をアノテートするための方法のフローチャートを例示する図である。
【図４】[0010]実行可能コンポーネントが入力引数を受け取り、返される参照を生成する環境を例示する図である。
【発明を実施するための形態】
【０００８】
[0011]  本明細書で説明する実施形態によって、実行可能コンポーネントから返される参照のアノテーションを説明する。返される参照は、特定のオブジェクトグラフを参照する。１）実行可能コンポーネントへの入力引数が存在しないこと、または、２）各々の入力引数が、イミュータブルであるか、オブジェクトグラフであって、そのオブジェクトグラフ内を指し示す外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを表すかのいずれかであること、のいずれかである場合、特定の属性が、返される参照に割り当てられる。特定の属性は、１）返される参照により参照される特定のオブジェクトグラフへの（または、特定のオブジェクトグラフの内部のいずれのオブジェクトへも）外部参照が存在しないこと、および、２）オブジェクトグラフの外側のいずれのオブジェクトへも、オブジェクトグラフの内部のミュータブル参照が存在しないことを表明する。したがって返される参照は、どのようなアクセスパーミッションでも、返される参照に割り当てられたパーミッションの範囲内で、その返される参照に自由に割り当てられる。実例として、返される参照が、書き込み可能と宣言されるならば、返される参照は、返される参照が、したがって任意のパーミッションを割り当てられ得る、および／または、分離型メモリロケーションに割り当てられ得ることを表すように、特定の属性によってアノテートされ得るが、そのような割り当てによって、返される参照は特定の属性を失うことになる。このように、本明細書で説明する原理は、それへの外部参照が存在しない参照の適正な検出を考慮に入れたものである。コンピューティングシステムのある程度の導入の論考を、図１に関して説明する。次いでアノテーションの動作の原理を、図２〜図４に関して説明する。
【０００９】
[0012]  コンピューティングシステムは、今ではますます多種多様の形式をとっている。コンピューティングシステムは例えば、ハンドヘルドデバイス、電気器具、ラップトップコンピュータ、デスクトップコンピュータ、メインフレーム、分散型コンピューティングシステム、さらには、従来はコンピューティングシステムとは考えられていなかったデバイスであり得る。本説明では、および特許請求の範囲では、用語「コンピューティングシステム」は、少なくとも１つの物理的な、および有形のプロセッサと、プロセッサにより実行され得るコンピュータ実行命令を有することが可能な物理的な、および有形のメモリとを含む、任意のデバイスまたはシステム（またはそれらの組み合わせ）を含むと幅広く定義される。メモリは、任意の形式をとり得るものであり、コンピューティングシステムの性質および形式に依存し得る。コンピューティングシステムは、ネットワーク環境を介した分散型である場合があり、複数の構成物のコンピューティングシステムを含み得る。
【００１０】
[0013]  図１に例示するように、その大部分の基本構成において、コンピューティングシステム１００は典型的には、少なくとも１つの処理ユニット１０２およびメモリ１０４を含む。メモリ１０４は、揮発性、不揮発性、またはその２つの何らかの組み合わせであり得る物理的システムメモリであり得る。用語「メモリ」は本明細書では、物理的記憶媒体などの不揮発性大容量記憶装置を指すためにもまた使用され得る。コンピューティングシステムが分散型である場合、処理、メモリ、および／または記憶能力は同様に分散型であり得る。本明細書では用語「実行可能モジュール」または「実行可能コンポーネント」は、コンピューティングシステム上で実行され得るソフトウェアオブジェクト、ルーティング、またはメソッドを指し得る。本明細書で説明する異なるコンポーネント、モジュール、エンジン、およびサービスは、コンピューティングシステム上で実行するオブジェクトまたはプロセスとして（例えば、別々のスレッドとして）実装され得る。
【００１１】
[0014]  後に続く説明では、実施形態を、１つまたは複数のコンピューティングシステムにより実行される動作に関して説明する。そのような動作がソフトウェアで実装される場合、動作を実行する関連するコンピューティングシステムの１つまたは複数のプロセッサが、コンピュータ実行可能命令を実行したことに応答してコンピューティングシステムの動作を指図する。例えばそのようなコンピュータ実行可能命令は、コンピュータプログラム製品を形成する１つまたは複数のコンピュータ可読媒体上で実施され得る。そのような動作の例は、データの操作を必然的に含む。コンピュータ実行可能命令（および操作されたデータ）は、コンピューティングシステム１００のメモリ１０４に記憶され得る。コンピューティングシステム１００は、通信チャネル１０８もまた内包し得るものであり、その通信チャネル１０８によってコンピューティングシステム１００は、例えばネットワーク１１０を介して他のメッセージプロセッサと通信することが可能になる。
【００１２】
[0015]  本明細書で説明する実施形態は、下記でより詳細に論考するように、例えば１つまたは複数のプロセッサおよびシステムメモリなどのコンピュータハードウェアを含む、専用または汎用のコンピュータを、備え得る、または利用し得る。本明細書で説明する実施形態は、コンピュータ実行可能命令および／またはデータ構造を搬送または記憶するための、物理的な、および他のコンピュータ可読媒体もまた含む。そのようなコンピュータ可読媒体は、汎用または専用のコンピュータシステムによりアクセスされ得る任意の利用可能な媒体であり得る。コンピュータ実行可能命令を記憶するコンピュータ可読媒体は、物理的記憶媒体である。コンピュータ実行可能命令を搬送するコンピュータ可読媒体は、伝送媒体である。このように例として、および限定としてではなく、本発明の実施形態は、少なくとも２つの明確に異なる種類のコンピュータ可読媒体、すなわち、コンピュータ記憶媒体および伝送媒体を備え得る。
【００１３】
[0016]  コンピュータ記憶媒体は、コンピュータ実行可能命令またはデータ構造の形式での所望のプログラムコード手段を記憶するために使用され得る、および、汎用または専用のコンピュータによりアクセスされ得る、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭもしくは他の光学ディスク記憶装置、磁気ディスク記憶装置もしくは他の磁気記憶デバイス、または、任意の他の媒体を含む。
【００１４】
[0017]  「ネットワーク」は、コンピュータシステムおよび／またはモジュールおよび／または他の電子デバイスの間での電子データの移送を可能にする、１つまたは複数のデータリンクとして定義される。情報が、ネットワークまたは別の通信接続（ハードワイヤード、ワイヤレス、または、ハードワイヤードもしくはワイヤレスの組み合わせのいずれか）を介して、コンピュータに転送または提供されるとき、コンピュータは当然のことながら、接続を伝送媒体とみなす。伝送媒体は、コンピュータ実行可能命令またはデータ構造の形式での所望のプログラムコード手段を搬送するために使用され得る、および、汎用または専用のコンピュータによりアクセスされ得る、ネットワークおよび／またはデータリンクを含み得る。上記のものの組み合わせもまた、コンピュータ可読媒体の範囲内に含めるべきである。
【００１５】
[0018]  さらに、様々なコンピュータシステムコンポーネントに達する際に、コンピュータ実行可能命令またはデータ構造の形式でのプログラムコード手段は、伝送媒体からコンピュータ記憶媒体に（またはその逆に）自動的に転送され得る。例えば、ネットワークまたはデータリンクを介して受信される、コンピュータ実行可能命令またはデータ構造は、ネットワークインターフェースモジュール（例えば「NIC」）の内部のＲＡＭにバッファリングされ得るものであり、次いで、コンピュータシステムＲＡＭに、および／または、コンピュータシステムでのより揮発性でないコンピュータ記憶媒体に最終的に転送され得る。このように、コンピュータ記憶媒体が、伝送媒体をもまた（さらには、主として）利用するコンピュータシステムコンポーネントに含まれ得ることを理解されたい。
【００１６】
[0019]  コンピュータ実行可能命令は例えば、プロセッサで実行されるときに、汎用コンピュータ、専用コンピュータ、または専用処理デバイスに、ある決まった機能または機能の群を実行させる、命令およびデータを含む。コンピュータ実行可能命令は例えば、バイナリ、アセンブリ言語などの中間フォーマット命令、さらにはソースコードであり得る。主題は構造的特徴および／または方法論的動作に対しての具体的な文言で説明されているが、添付の特許請求の範囲において定義される主題は、説明された特徴または上記で説明された動作に必ずしも限定されないことを理解されたい。むしろ、説明された特徴および動作は、特許請求の範囲を実装する例の形式として開示されるものである。
【００１７】
[0020]  当業者であれば、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、メッセージプロセッサ、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースの、またはプログラマブルな家電、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、携帯電話、ＰＤＡ、ページャ、ルータ、スイッチ等々を含む、多くのタイプのコンピュータシステム構成によってネットワークコンピューティング環境で本発明が実践され得ることを十分認識するであろう。本発明は分散型システム環境でもまた実践され得るものであり、その環境では、ネットワークによって（ハードワイヤードデータリンク、ワイヤレスデータリンクによって、または、ハードワイヤードデータリンクおよびワイヤレスデータリンクの組み合わせによってのいずれかで）リンクされる、ローカルおよびリモートのコンピュータシステムが、両方ともタスクを実行する。分散型システム環境ではプログラムモジュールは、ローカルおよびリモートの両方のメモリ記憶デバイス内に設けられ得る。
【００１８】
[0021]  図２は、本明細書で説明する原理が動作することが可能である環境２００を例示する。環境２００は、オブジェクトグラフの分離およびミュータビリティを追跡するフレームワーク２１０を含む。フレームワーク２１０は、オブジェクトグラフへの様々な参照２２１を、参照へのアクセスを制御することにより組織化する。参照は、ローカル変数、メソッドパラメータ、オブジェクトフィールド、または、オブジェクトグラフへの任意の他の参照であり得る。例示される実施形態では参照２２１は、参照２２１Ａから２２１Ｅまでを含むように例示されるが、省略符号２２１Ｆは、フレームワーク２１０が任意の数の参照２２０へのアクセスを管理することが可能であることを記号的に表す。
【００１９】
[0022]  フレームワーク２１０は、参照２２１へのアクセスを、参照にパーミッションを割り当てることにより管理する。「パーミッション」は、参照がミューテートされ得るかどうかに関する何らかのプロパティを指示する参照に関するアノテーションである。そのようなパーミッションが、図２でのパーミッション２１１により抽象的に表される。パーミッションは、読み込み可能パーミッション（readable permission）２１１Ａ、書き込み可能パーミッション２１１Ｂ、および、イミュータブルパーミッション２１１Ｃを含む。「読み込み可能」パーミッション２１１Ａは、対応するオブジェクト（およびそのフィールドのすべて、およびそのフィールドのフィールドのすべて等々）が読み込まれ得るのみであることを意味する。「書き込み可能」パーミッション２１１Ｂは、対応するオブジェクトが書き込まれ得ることを意味する。「イミュータブル」パーミッション２１１Ｃは、読み込み可能パーミッション２１１Ａに類似するが、他のどのものも、このオブジェクトへの書き込み可能参照を有さないことをさらに保証する。イミュータブルパーミッション２１１Ｃは、このオブジェクトへの書き込み可能参照が決して再び存在しないことになることをさらに保証し得る。このようにイミュータブルパーミッション２１１Ｃは、対応するオブジェクトが決して書き込まれないことになり、同様に、そのフィールドのすべて、およびそのフィールドのフィールドのすべて等々が決して書き込まれないことになることを意味する。オブジェクト内のすべてのスタティックフィールドは、フレームワーク２１０によりイミュータブルパーミッション２１１Ｃを有するものとして扱われる。
【００２０】
[0023]  フレームワーク２１０は、メモリロケーションを分離型であるとアノテートする、分離型メモリマネージャ２１２もまた含む。記憶ロケーションに関する「分離型」アノテーションは、ロケーションが、外部で一意的である値を記憶することを意味する。すなわち、そのロケーションに記憶されるいずれのオブジェクトに対しても、システム内のそのオブジェクトへの外部参照は存在せず、そしてまた、オブジェクトのフィールドのいずれへも、または、そのフィールドのいずれのフィールド等々へも、何らの参照も存在しない。実例として分離型メモリマネージャ２１２は、分離型メモリロケーション２２２を管理する。分離型メモリロケーションは、２つの分離型メモリロケーション２２２Ａおよび２２２Ｂを含むように例示されるが、省略符号２２２Ｃは、分離型メモリロケーション２２２が任意の数の分離型メモリロケーションを含み得ることを表す。
【００２１】
[0024]  アノテーションコンポーネント２０１が、フレームワーク２１０上に築造され、本明細書でさらに説明するように動作する。あるいは、または加えて、アノテーションコンポーネント２０１は、フレームワーク２１０の部分として動作し得る。アノテーションコンポーネント２０１は、図２の参照２２１の１つなどの参照を返す実行可能コンポーネントを評価するように構成される。図３は、アノテーションコンポーネントが、少なくとも、特定のオブジェクトグラフを参照する参照を返す実行可能コンポーネントを評価するための、および、実行可能コンポーネントにより返される参照をアノテートするための方法３００のフローチャートを例示する。図３の方法３００は図２のアノテーションコンポーネント２０１により実行され得るので、方法３００を、図２および図３の両方を度々参照して説明する。
【００２２】
[0025]  方法３００は、実行可能コンポーネントを評価して（動作３１１）、実行可能コンポーネントを実行する結果として生じることになる１つまたは複数の返される参照を識別する（動作３１２）工程を含む。方法３００の残りは、返される参照を評価して、特定の属性が、返される参照に割り当てられ得るかどうかを決定する工程を必然的に含む。一部の事例では、方法の残りは、実行可能コンポーネントが宣言されるコードを最初に評価することにより実行され得る。他の事例では、実行コンポーネントが呼び出されるコードが、返される参照の主要な特性が宣言コードによって識別され得ない場合に評価される。
【００２３】
[0026]  図４は、実行可能コンポーネント４０１が入力引数４１１および４１２を受け取り、返される参照４２１および４２２を生成する環境４００を例示する。しかしながら省略符号４１３が、実行可能コンポーネント４０１への任意の数の入力引数（０、１、または２以上でさえある）が存在し得ることを表す。省略符号４２３は、実行可能コンポーネント４０１の実行から結果として生じる、任意の正の数の（１つまたは複数の）返される参照が存在し得ることを表す。アノテーションコンポーネント２０１は、実行可能コンポーネント４０１を宣言する、または呼び出すコードを評価することが可能である。
【００２４】
[0027]  実行可能コードに関係する宣言コードが評価されているか、それとも実行可能コードに関係する呼び出しコードが評価されているかに関係なく、実行可能コンポーネントへの何らかの入力引数が存在するか否かが決定される（判断ブロック３１３）。入力引数が少しも存在しないならば（判断ブロック３１３での「いいえ」）、表明属性が、返される参照に割り当てられ得る（動作３１５）。表明属性は、１）返される参照により参照される特定のオブジェクトグラフへの（または、特定のオブジェクトグラフの内部のいずれのオブジェクトへも）外部参照が存在しないこと、および、２）オブジェクトグラフの外側のいずれのオブジェクトへも、オブジェクトグラフの内部のミュータブル参照が存在しないことを表明する。本説明では、および特許請求の範囲では、属性は、その属性が、１つまたは複数の主張のセットが真であることを表すとシステムにより解釈可能である場合、１つまたは複数の主張のセットを「表明する」。
【００２５】
[0028]  実例として、以下のコード例を考えてみる。
ｐｕｂｌｉｃ  ｃｌａｓｓ  ＭｙＣｌａｓｓ
｛
ｉｎｔ  ｍ＿ｘ；
ｐｕｂｌｉｃ  ＭｙＣｌａｓｓ（）
｛
ｍ＿ｘ  ＝  ０；
｝
｝
【００２６】
[0029]  メソッドＭｙＣｌａｓｓはコンストラクタである。一般的にはコンストラクタは、書き込み可能値を返す。この宣言を（例えば、ランタイムの前にでも）評価することにより、表現式「ｎｅｗ  ＭｙＣｌａｓｓ（）」が、外側世界から完全に分離されている値を返すことが察知され得る。コンストラクタへの入力引数は存在しない（判断ブロック３１３での「いいえ」）。したがって、新しく創出されるオブジェクトのフィールドに記憶されるいずれの値も、２つの場所のうちの１つから生ずるものであり、すなわち、１）それらの値は、オブジェクトのコンストラクタの内側で新しく創出される、または、２）それらの値は、スタティックフィールドから発生する。コンストラクタは、自由にメソッドを呼び出し、フィールド内に返り値を記憶するが、いずれのメソッド呼び出しの返り値も、それ自体は他動的に、それらの２つの場所のうちの１つから生ずる。
【００２７】
[0030]  本明細書で説明する原理は、フレームワーク２１０がイミュータブルスタティックを実装するか、それともミュータブルスタティックを実装するかに関係なく作用する。イミュータブルスタティックの事例では、フレームワーク２１０は、スタティックフィールドがイミュータブルであることを確実にする。したがって、イミュータブルスタティックフィールドから生ずる新しく創出されるフィールドは、表明属性により表明される保証を同じように有し得る。換言すれば、そのような新しく生成されるフィールドは、１）新しく創出されるフィールドにより参照される特定のオブジェクトグラフへの（または、特定のオブジェクトグラフの内部のいずれのオブジェクトへも）外部参照を有さず、および、２）オブジェクトグラフの外側のいずれのオブジェクトへも、オブジェクトグラフの内部のミュータブル参照が存在しないということである。
【００２８】
[0031]  ミュータブルスタティックを実装するフレームワークの事例では、原理はやはり、実行可能コンポーネントが（プログラマによって、または、自動的にコンパイラによってのいずれかで）ミュータブルスタティックを使用してアノテートされる場合に適用される。このことは、メソッドの出力が、属性を割り当てる資格を得ないように、メソッドへの書き込み可能引数としてモデリングされ得る。
【００２９】
[0032]  実例として、メンタルモデルは以下のようになる。
ｖｏｉｄ  ＵｓｅｓＭｕｔａｂｌｅＳｔａｔｉｃｓ（writable Statics s）  ｛
／／  Ｔｈｅ  ｓｔａｔｉｃ  ｖａｒｉａｂｌｅ  ｉｓ  ｊｕｓｔ  ａｎ  ｏｒｄｉｎａｒｙ  ｗｒｉｔａｂｌｅ
／／  ｒｅｆｅｒｅｎｃｅ．  Ｔｈｅ  ｃｏｍｐｉｌｅｒ  ｍａｙ  ｐｌｕｍｂ  ｉｔ  ｔｈｒｏｕｇｈ
／／  ｆｏｒ  ｙｏｕ，  ｏｒ  ａ  ｄｅｖｅｌｏｐｅｒ  ｍｉｇｈｔ  ｄｏ  ｉｔ  ｔｈｒｏｕｇｈ
／／  ａ  ｓｅｒｉｅｓ  ｏｆ  ａｎｎｏｔａｔｉｏｎｓ  （either opt-in or opt-out）．
ｓ．Ｔｙｐｅ．ｓｔａｔｉｃＶａｒｉａｂｌｅ  ＝  ４２；
｝
【００３０】
[0033]  このように動作３１５では、アノテーションコンポーネント２０１は、これらの新しくコンストラクトされる、エイリアスが作られない値をモデリングするために使用される、特殊な表明属性を割り当てる。表現式「ｎｅｗ  ＭｙＣｌａｓｓ（）」は、表明属性を有するものとして扱われる。一部の実施形態ではこの表明属性は、「フレッシュ」の値を有するパーミッションタイプである。その実施形態では、コンストラクタは入力を有さないので、返り値のパーミッション（通常は「書き込み可能」にすぎない）が、「書き込み可能」から「フレッシュ」に昇格させられる。フレッシュ参照は、任意のパーミッション−読み込み可能、書き込み可能、またはイミュータブルとともにロケーションに記憶され得るが、そのようにされた後で、フレッシュパーミッションは失われる。さらにそのフレッシュ参照は、分離型ロケーションにもまた記憶され得るものであり、そのことにより、その「フレッシュ」パーミッションを失う。ロケーションが、フレッシュと特色付けされることにはならないことに留意されたい。したがって、値がロケーションに記憶された後で、その値はエイリアスが作られ得るものであり、そのため、もはやフレッシュではない。したがってこのようにして、表明属性（例えば、フレッシュパーミッションステータス）は失われ得る。
【００３１】
[0034]  図３に返って、実行可能コンポーネントへの１つまたは複数の入力引数が存在するならば（判断ブロック３１３での、はい）、そのことは、入力引数が、イミュータブルであるか、オブジェクトグラフであって、そのオブジェクトグラフ内を指し示す外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを表すかのいずれかであるかどうかを決定する工程になる（判断ブロック３１４）。入力引数が存在し、それらの入力引数のすべてが、イミュータブルである、またはそうではない場合、これらの判定基準を満たすわけではないならば（判断ブロック３１４での「いいえ」）、表明属性（例えば、フレッシュパーミッション）は割り当てられない（動作３１６）。
【００３２】
[0035]  これに対して、実行可能コンポーネントへの入力引数のすべてが、イミュータブルであるか、オブジェクトグラフであって、そのオブジェクトグラフ内を指し示す外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを参照するかのいずれかであるならば（判断ブロック３１４での「はい」）、表明属性（例えば、フレッシュパーミッション）が、この次第で同様に割り当てられ得る（動作３１５）。
【００３３】
[0036]  コンストラクタが、イミュータブルであるいくつかの入力引数を取り入れる、以下のコード例を考えてみる。
ｐｕｂｌｉｃ  ｃｌａｓｓ  ＭｙＣｌａｓｓ２
｛
ｉｎｔ  ｍ＿ｘ；
ｓｔｒｉｎｇ  ｍ＿ｙ；
ｉｍｍｕｔａｂｌｅ  ＭｙＣｌａｓｓ  ｍ＿ｚ；
ｐｕｂｌｉｃ  ＭｙＣｌａｓｓ２（int x, string y, immutable MyClass z）
｛
ｍ＿ｘ  ＝  ｘ；
ｍ＿ｙ  ＝  ｙ；
ｍ＿ｚ  ＝  ｚ；
｝
｝
【００３４】
[0037]  この事例では、同じ分析が適用される。ＭｙＣｌａｓｓ２のいずれの新しくコンストラクトされるインスタンスも、外側世界とはいかなるミュータブル状態も共有し得ない。したがって新しくコンストラクトされるＭｙＣｌａｓｓ２オブジェクトは、表明する属性付けされたもの（例えば、フレッシュパーミッション）が割り当てられ得る。このことは、ＭｙＣｌａｓｓ２コンストラクタの宣言の分析によってランタイムの前に決定され得る。
【００３５】
[0038]  次に、コンストラクタが、常にイミュータブルであるとは限らないいくつかの引数を取る事例を考えてみる。
ｐｕｂｌｉｃ  ｃｌａｓｓ  ＭｙＣｌａｓｓ３
｛
ｉｎｔ  ｍ＿ｘ；
ｓｔｒｉｎｇ  ｍ＿ｙ；
ｒｅａｄａｂｌｅ  ＭｙＣｌａｓｓ  ｍ＿ｚ；
ｐｕｂｌｉｃ  ＭｙＣｌａｓｓ３（int x, string y, readable MyClass z）
｛
ｍ＿ｘ  ＝  ｘ；
ｍ＿ｙ  ＝  ｙ；
ｍ＿ｚ  ＝  ｚ；
｝
｝
【００３６】
[0039]  読み込み可能パーミッションは、この参照がミューテーションを可能にしないことを指示するが、別のエンティティはそれでも書き込み可能参照を保持する場合があり、したがって参照のミューテーションが察知される場合があることを想起されたい。例として、最初の２つの入力引数ｘおよびｙは両方ともイミュータブルであるが、第３の入力引数ｍｙＣｌａｓｓは、イミュータブルではなく読み込み可能である。したがって、宣言だけの分析に基づいて、属性が、このコンストラクタによりコンストラクトされる返されるｍｙＣｌａｓｓに割り当てられ得るかどうかは決定され得ない。
【００３７】
[0040]  これに対して、ｍｙＣｌａｓｓのインスタンスの実際の実行のランタイム環境（すなわち、呼び出しコード）を評価する際に、ことによると第３の入力引数は、イミュータブルステータスに高められ得るものであり、その理由は、イミュータブルパーミッションは、追加的な制約が課せられた、ある決まったタイプの読み込み可能パーミッションにすぎないからというものである。実際のランタイム環境では、それらの追加的な制約が察知されるならば、第３の入力引数はイミュータブルとなる。実例として、以下のランタイムコードを考えてみる。
ｐｕｂｌｉｃ  ｖｏｉｄ  Ｒｕｎ２（immutable MyClass myClass）
｛
ｉｍｍｕｔａｂｌｅ  ＭｙＣｌａｓｓ３  ｍｙＣｌａｓｓ３  ＝  ｎｅｗ  ＭｙＣｌａｓｓ３（5, "five", myClass）；
｝
【００３８】
[0041]  この事例では、ｎｅｗ表現式の実際の引数はすべてイミュータブルであることが察知され得る。したがってこの特定のインスタンスでは、返される参照は、同じコンストラクタが非フレッシュ値をしばしば生み出すことになる場合でも、表明属性（例えば、フレッシュパーミッション）が割り当てられ得る。上記の例のすべてでは、返される参照は、入力引数が表明属性（例えば、フレッシュパーミッション）をさらに有するならば、表明属性（例えば、フレッシュパーミッション）が割り当てられ得る。一部の事例ではアノテートコンポーネント２０１自体が、以前の時点で入力引数にフレッシュパーミッションを割り当てた場合がある。
【００３９】
[0042]  ここまでは、これらの例のすべてはコンストラクタを使用していた。実際、同じ分析が随意の実行可能コンポーネントに対して作用する。以下の例を考えてみる。Ｉｎｃｒｅｍｅｎｔのパラメータリストの後の「読み込み可能」アノテーションは、「ｔｈｉｓ」に関する、したがって、すべてのインスタンスフィールドアクセスまたはインスタンスメソッド呼び出しに対するパーミッションが読み込み可能であることを意味することに留意されたい。
ｐｕｂｌｉｃ  ｃｌａｓｓ  Ｃｏｕｎｔｅｒ
｛
ｉｎｔ  ｍ＿ｘ；
ｐｕｂｌｉｃ  Ｃｏｕｎｔｅｒ（）
｛
ｍ＿ｘ  ＝  ０；
｝
ｐｕｂｌｉｃ  ｗｒｉｔａｂｌｅ  Ｃｏｕｎｔｅｒ  Ｉｎｃｒｅｍｅｎｔ（）  ｒｅａｄａｂｌｅ
｛
ｗｒｉｔａｂｌｅ  Ｃｏｕｎｔｅｒ  ｃ２  ＝  ｎｅｗ  Ｃｏｕｎｔｅｒ（）；
ｃ２．ｍ＿ｘ  ＝  ｍ＿ｘ  ＋  １；
ｒｅｔｕｒｎ  ｃ２；
｝
ｐｕｂｌｉｃ  ｖｏｉｄ  Ｔｅｓｔ（）
｛
ｉｍｍｕｔａｂｌｅ  Ｃｏｕｎｔｅｒ  ｃ  ＝  （new Counter（））．Ｉｎｃｒｅｍｅｎｔ（）．Ｉｎｃｒｅｍｅｎｔ（）．Ｉｎｃｒｅｍｅｎｔ（）；
｝
｝
【００４０】
[0043]  「ｎｅｗ  Ｃｏｕｎｔｅｒ（）」への元の呼び出しは、上記で論考したように、Ｃｏｕｎｔｅｒ（）への入力引数が存在しないので、フレッシュオブジェクトを返す。Ｉｎｃｒｅｍｅｎｔ（）への最初の呼び出しは、フレッシュである１つの入力を有するものであり、その理由は、その入力がＣｏｕｎｔｅｒ（）からの返される値であるからである。したがって、Ｉｎｃｒｅｍｅｎｔ（）の返り値のパーミッションは「書き込み可能」であるので、返り値は安全に「フレッシュ」に昇格させられ得る。この論理が、順番に各々の呼び出しに適用される。１つのものの「フレッシュ」出力が、次のものの「フレッシュ」入力になる。Ｉｎｃｒｅｍｅｎｔ（）への最終の呼び出しは「フレッシュ」値を返し、その「フレッシュ」値は次いで、「イミュータブル」に変換され得る。
【００４１】
[0044]  以下の表現式は、読み込み可能値を返す。
ｐｕｂｌｉｃ  ｒｅａｄａｂｌｅ  Ｃｏｕｎｔｅｒ  Ｉｎｃｒｅｍｅｎｔ（）  ｒｅａｄａｂｌｅ
｛
ｗｒｉｔａｂｌｅ  Ｃｏｕｎｔｅｒ  ｃ２  ＝  ｎｅｗ  Ｃｏｕｎｔｅｒ（）；
ｃ２．ｍ＿ｘ  ＝  ｍ＿ｘ  ＋  １；
ｒｅｔｕｒｎ  ｃ２；
｝
【００４２】
[0045]  この事例では、同じ分析が適用されるが、返り値をフレッシュに昇格させることは安全でない。そのようにすることによって、その返り値はミューテートされることが可能になることになる。読み込み可能値を、書き込み可能値または分離型値に変換することは危険である。これに対して、返される値は、読み込み可能またはイミュータブルのパーミッションが割り当てられ得る。イミュータブルパーミッションは、常に読み込み可能に低下させられ得るので、読み込み可能値を返すメソッドは、仮定的にイミュータブルオブジェクトの何らかのフィールドを返している場合がある。この事例では、その返り値をフレッシュに昇格させることによって、イミュータブルデータがミューテートされることが可能になることになり、そのことは矛盾するものである。代わりに、異なる昇格規則が適用されるものであり、出力は、「フレッシュ」パーミッションではなく「イミュータブル」パーミッションを有するものとして扱われる。この昇格は前のように安全であり、すべての入力がイミュータブルまたはフレッシュであるならば、いずれのミュータブル状態も外側世界と共有することは可能ではなく、そのため、返り値（すでにミューテートされ得ない）はイミュータブルとして安全に扱われ得る。
【００４３】
[0046]  したがって、本明細書で説明した原理によって、実行可能オブジェクトからの返される参照が、外部参照がオブジェクトにアクセスすることが可能であるかどうかを表明する属性を受け取ることが可能になる。
【００４４】
[0047]  本発明は、その趣旨または本質的な特性から逸脱することなく、他の具体的な形式で実施され得る。説明した実施形態は、すべての事項において単に例示的であり制約的ではないと考えるべきである。したがって本発明の範囲は、上述の説明によってではなく、添付の特許請求の範囲によって指示される。特許請求の範囲の同等性の趣意および領域の範囲内であるすべての変更は、特許請求の範囲の範囲内に包容されることになる。
【図１】
0006272336.tif 000002
【図２】
0006272336.tif 000003
【図３】
0006272336.tif 000004
【図４】
0006272336.tif 000005