(58)【調査した分野】(Int.Cl.,DB名)
前記アノテーションコンポーネントが、前記入力引数が前記表明属性をさらに有すると決定することにより、前記入力引数が、外部ミュータブル参照を有さないオブジェクトグラフを参照すると決定する、請求項3に記載のコンピュータ可読記憶媒体。
前記アノテーションコンポーネントが、前記入力引数のイミュータブルパーミッションを評価することにより、前記入力引数がイミュータブルであると決定する、請求項3に記載のコンピュータ可読記憶媒体。
前記アノテーションコンポーネントが、前記入力引数をイミュータブルであるように制約する、前記実行可能コンポーネントの実行コンテキストを評価することにより、前記入力引数がイミュータブルであると決定する、請求項3に記載のコンピュータ可読記憶媒体。
前記実行可能コンポーネントが、前記返される参照を、読み込み可能であるように、ただし潜在的には他のエンティティにより書き込み可能でもあるように制約すると宣言され、前記表明属性が、前記返される参照がイミュータブルであることである、請求項1に記載のコンピュータ可読記憶媒体。
コンピューティングシステムのアノテーションコンポーネントが、少なくとも、特定のオブジェクトグラフを参照する参照を返す実行可能コンポーネントを評価するための、および、前記実行可能コンポーネントにより返される前記参照をアノテートするための方法であって、
実行可能コンポーネントに対応するコードを評価する動作と、
実行の際に前記実行可能コンポーネントにより返されることになる返される参照を識別する動作と、
前記実行可能コンポーネントへの何らかの入力引数が存在するかどうかを決定する動作と、
前記実行可能コンポーネントへの1つまたは複数の入力引数が存在する場合の、前記入力引数が、イミュータブルであるか、オブジェクトグラフであって、前記オブジェクトグラフ内を指し示す外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを表すかのいずれかであるかどうかを決定する動作と、
前記実行可能コンポーネントへの入力引数が存在しないこと、または、各々の入力引数が、イミュータブルであるか、外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを表すかのいずれかであることのいずれかである場合の、表明属性を前記返される参照に割り当てる動作であって、前記表明属性が、1)前記返される参照により参照される前記特定のオブジェクトグラフへの外部参照が存在しないこと、および、2)前記オブジェクトグラフの外側のいずれのオブジェクトへも、前記オブジェクトグラフの内部のミュータブル参照が存在しないことを表明する、割り当てる動作と
を含む、方法。
【発明を実施するための形態】
【0008】
[0011] 本明細書で説明する実施形態によって、実行可能コンポーネントから返される参照のアノテーションを説明する。返される参照は、特定のオブジェクトグラフを参照する。1)実行可能コンポーネントへの入力引数が存在しないこと、または、2)各々の入力引数が、イミュータブルであるか、オブジェクトグラフであって、そのオブジェクトグラフ内を指し示す外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを表すかのいずれかであること、のいずれかである場合、特定の属性が、返される参照に割り当てられる。特定の属性は、1)返される参照により参照される特定のオブジェクトグラフへの(または、特定のオブジェクトグラフの内部のいずれのオブジェクトへも)外部参照が存在しないこと、および、2)オブジェクトグラフの外側のいずれのオブジェクトへも、オブジェクトグラフの内部のミュータブル参照が存在しないことを表明する。したがって返される参照は、どのようなアクセスパーミッションでも、返される参照に割り当てられたパーミッションの範囲内で、その返される参照に自由に割り当てられる。実例として、返される参照が、書き込み可能と宣言されるならば、返される参照は、返される参照が、したがって任意のパーミッションを割り当てられ得る、および/または、分離型メモリロケーションに割り当てられ得ることを表すように、特定の属性によってアノテートされ得るが、そのような割り当てによって、返される参照は特定の属性を失うことになる。このように、本明細書で説明する原理は、それへの外部参照が存在しない参照の適正な検出を考慮に入れたものである。コンピューティングシステムのある程度の導入の論考を、
図1に関して説明する。次いでアノテーションの動作の原理を、
図2〜
図4に関して説明する。
【0009】
[0012] コンピューティングシステムは、今ではますます多種多様の形式をとっている。コンピューティングシステムは例えば、ハンドヘルドデバイス、電気器具、ラップトップコンピュータ、デスクトップコンピュータ、メインフレーム、分散型コンピューティングシステム、さらには、従来はコンピューティングシステムとは考えられていなかったデバイスであり得る。本説明では、および特許請求の範囲では、用語「コンピューティングシステム」は、少なくとも1つの物理的な、および有形のプロセッサと、プロセッサにより実行され得るコンピュータ実行命令を有することが可能な物理的な、および有形のメモリとを含む、任意のデバイスまたはシステム(またはそれらの組み合わせ)を含むと幅広く定義される。メモリは、任意の形式をとり得るものであり、コンピューティングシステムの性質および形式に依存し得る。コンピューティングシステムは、ネットワーク環境を介した分散型である場合があり、複数の構成物のコンピューティングシステムを含み得る。
【0010】
[0013]
図1に例示するように、その大部分の基本構成において、コンピューティングシステム100は典型的には、少なくとも1つの処理ユニット102およびメモリ104を含む。メモリ104は、揮発性、不揮発性、またはその2つの何らかの組み合わせであり得る物理的システムメモリであり得る。用語「メモリ」は本明細書では、物理的記憶媒体などの不揮発性大容量記憶装置を指すためにもまた使用され得る。コンピューティングシステムが分散型である場合、処理、メモリ、および/または記憶能力は同様に分散型であり得る。本明細書では用語「実行可能モジュール」または「実行可能コンポーネント」は、コンピューティングシステム上で実行され得るソフトウェアオブジェクト、ルーティング、またはメソッドを指し得る。本明細書で説明する異なるコンポーネント、モジュール、エンジン、およびサービスは、コンピューティングシステム上で実行するオブジェクトまたはプロセスとして(例えば、別々のスレッドとして)実装され得る。
【0011】
[0014] 後に続く説明では、実施形態を、1つまたは複数のコンピューティングシステムにより実行される動作に関して説明する。そのような動作がソフトウェアで実装される場合、動作を実行する関連するコンピューティングシステムの1つまたは複数のプロセッサが、コンピュータ実行可能命令を実行したことに応答してコンピューティングシステムの動作を指図する。例えばそのようなコンピュータ実行可能命令は、コンピュータプログラム製品を形成する1つまたは複数のコンピュータ可読媒体上で実施され得る。そのような動作の例は、データの操作を必然的に含む。コンピュータ実行可能命令(および操作されたデータ)は、コンピューティングシステム100のメモリ104に記憶され得る。コンピューティングシステム100は、通信チャネル108もまた内包し得るものであり、その通信チャネル108によってコンピューティングシステム100は、例えばネットワーク110を介して他のメッセージプロセッサと通信することが可能になる。
【0012】
[0015] 本明細書で説明する実施形態は、下記でより詳細に論考するように、例えば1つまたは複数のプロセッサおよびシステムメモリなどのコンピュータハードウェアを含む、専用または汎用のコンピュータを、備え得る、または利用し得る。本明細書で説明する実施形態は、コンピュータ実行可能命令および/またはデータ構造を搬送または記憶するための、物理的な、および他のコンピュータ可読媒体もまた含む。そのようなコンピュータ可読媒体は、汎用または専用のコンピュータシステムによりアクセスされ得る任意の利用可能な媒体であり得る。コンピュータ実行可能命令を記憶するコンピュータ可読媒体は、物理的記憶媒体である。コンピュータ実行可能命令を搬送するコンピュータ可読媒体は、伝送媒体である。このように例として、および限定としてではなく、本発明の実施形態は、少なくとも2つの明確に異なる種類のコンピュータ可読媒体、すなわち、コンピュータ記憶媒体および伝送媒体を備え得る。
【0013】
[0016] コンピュータ記憶媒体は、コンピュータ実行可能命令またはデータ構造の形式での所望のプログラムコード手段を記憶するために使用され得る、および、汎用または専用のコンピュータによりアクセスされ得る、RAM、ROM、EEPROM、CD−ROMもしくは他の光学ディスク記憶装置、磁気ディスク記憶装置もしくは他の磁気記憶デバイス、または、任意の他の媒体を含む。
【0014】
[0017] 「ネットワーク」は、コンピュータシステムおよび/またはモジュールおよび/または他の電子デバイスの間での電子データの移送を可能にする、1つまたは複数のデータリンクとして定義される。情報が、ネットワークまたは別の通信接続(ハードワイヤード、ワイヤレス、または、ハードワイヤードもしくはワイヤレスの組み合わせのいずれか)を介して、コンピュータに転送または提供されるとき、コンピュータは当然のことながら、接続を伝送媒体とみなす。伝送媒体は、コンピュータ実行可能命令またはデータ構造の形式での所望のプログラムコード手段を搬送するために使用され得る、および、汎用または専用のコンピュータによりアクセスされ得る、ネットワークおよび/またはデータリンクを含み得る。上記のものの組み合わせもまた、コンピュータ可読媒体の範囲内に含めるべきである。
【0015】
[0018] さらに、様々なコンピュータシステムコンポーネントに達する際に、コンピュータ実行可能命令またはデータ構造の形式でのプログラムコード手段は、伝送媒体からコンピュータ記憶媒体に(またはその逆に)自動的に転送され得る。例えば、ネットワークまたはデータリンクを介して受信される、コンピュータ実行可能命令またはデータ構造は、ネットワークインターフェースモジュール(例えば「NIC」)の内部のRAMにバッファリングされ得るものであり、次いで、コンピュータシステムRAMに、および/または、コンピュータシステムでのより揮発性でないコンピュータ記憶媒体に最終的に転送され得る。このように、コンピュータ記憶媒体が、伝送媒体をもまた(さらには、主として)利用するコンピュータシステムコンポーネントに含まれ得ることを理解されたい。
【0016】
[0019] コンピュータ実行可能命令は例えば、プロセッサで実行されるときに、汎用コンピュータ、専用コンピュータ、または専用処理デバイスに、ある決まった機能または機能の群を実行させる、命令およびデータを含む。コンピュータ実行可能命令は例えば、バイナリ、アセンブリ言語などの中間フォーマット命令、さらにはソースコードであり得る。主題は構造的特徴および/または方法論的動作に対しての具体的な文言で説明されているが、添付の特許請求の範囲において定義される主題は、説明された特徴または上記で説明された動作に必ずしも限定されないことを理解されたい。むしろ、説明された特徴および動作は、特許請求の範囲を実装する例の形式として開示されるものである。
【0017】
[0020] 当業者であれば、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、メッセージプロセッサ、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースの、またはプログラマブルな家電、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、携帯電話、PDA、ページャ、ルータ、スイッチ等々を含む、多くのタイプのコンピュータシステム構成によってネットワークコンピューティング環境で本発明が実践され得ることを十分認識するであろう。本発明は分散型システム環境でもまた実践され得るものであり、その環境では、ネットワークによって(ハードワイヤードデータリンク、ワイヤレスデータリンクによって、または、ハードワイヤードデータリンクおよびワイヤレスデータリンクの組み合わせによってのいずれかで)リンクされる、ローカルおよびリモートのコンピュータシステムが、両方ともタスクを実行する。分散型システム環境ではプログラムモジュールは、ローカルおよびリモートの両方のメモリ記憶デバイス内に設けられ得る。
【0018】
[0021]
図2は、本明細書で説明する原理が動作することが可能である環境200を例示する。環境200は、オブジェクトグラフの分離およびミュータビリティを追跡するフレームワーク210を含む。フレームワーク210は、オブジェクトグラフへの様々な参照221を、参照へのアクセスを制御することにより組織化する。参照は、ローカル変数、メソッドパラメータ、オブジェクトフィールド、または、オブジェクトグラフへの任意の他の参照であり得る。例示される実施形態では参照221は、参照221Aから221Eまでを含むように例示されるが、省略符号221Fは、フレームワーク210が任意の数の参照220へのアクセスを管理することが可能であることを記号的に表す。
【0019】
[0022] フレームワーク210は、参照221へのアクセスを、参照にパーミッションを割り当てることにより管理する。「パーミッション」は、参照がミューテートされ得るかどうかに関する何らかのプロパティを指示する参照に関するアノテーションである。そのようなパーミッションが、
図2でのパーミッション211により抽象的に表される。パーミッションは、読み込み可能パーミッション(readable permission)211A、書き込み可能パーミッション211B、および、イミュータブルパーミッション211Cを含む。「読み込み可能」パーミッション211Aは、対応するオブジェクト(およびそのフィールドのすべて、およびそのフィールドのフィールドのすべて等々)が読み込まれ得るのみであることを意味する。「書き込み可能」パーミッション211Bは、対応するオブジェクトが書き込まれ得ることを意味する。「イミュータブル」パーミッション211Cは、読み込み可能パーミッション211Aに類似するが、他のどのものも、このオブジェクトへの書き込み可能参照を有さないことをさらに保証する。イミュータブルパーミッション211Cは、このオブジェクトへの書き込み可能参照が決して再び存在しないことになることをさらに保証し得る。このようにイミュータブルパーミッション211Cは、対応するオブジェクトが決して書き込まれないことになり、同様に、そのフィールドのすべて、およびそのフィールドのフィールドのすべて等々が決して書き込まれないことになることを意味する。オブジェクト内のすべてのスタティックフィールドは、フレームワーク210によりイミュータブルパーミッション211Cを有するものとして扱われる。
【0020】
[0023] フレームワーク210は、メモリロケーションを分離型であるとアノテートする、分離型メモリマネージャ212もまた含む。記憶ロケーションに関する「分離型」アノテーションは、ロケーションが、外部で一意的である値を記憶することを意味する。すなわち、そのロケーションに記憶されるいずれのオブジェクトに対しても、システム内のそのオブジェクトへの外部参照は存在せず、そしてまた、オブジェクトのフィールドのいずれへも、または、そのフィールドのいずれのフィールド等々へも、何らの参照も存在しない。実例として分離型メモリマネージャ212は、分離型メモリロケーション222を管理する。分離型メモリロケーションは、2つの分離型メモリロケーション222Aおよび222Bを含むように例示されるが、省略符号222Cは、分離型メモリロケーション222が任意の数の分離型メモリロケーションを含み得ることを表す。
【0021】
[0024] アノテーションコンポーネント201が、フレームワーク210上に築造され、本明細書でさらに説明するように動作する。あるいは、または加えて、アノテーションコンポーネント201は、フレームワーク210の部分として動作し得る。アノテーションコンポーネント201は、
図2の参照221の1つなどの参照を返す実行可能コンポーネントを評価するように構成される。
図3は、アノテーションコンポーネントが、少なくとも、特定のオブジェクトグラフを参照する参照を返す実行可能コンポーネントを評価するための、および、実行可能コンポーネントにより返される参照をアノテートするための方法300のフローチャートを例示する。
図3の方法300は
図2のアノテーションコンポーネント201により実行され得るので、方法300を、
図2および
図3の両方を度々参照して説明する。
【0022】
[0025] 方法300は、実行可能コンポーネントを評価して(動作311)、実行可能コンポーネントを実行する結果として生じることになる1つまたは複数の返される参照を識別する(動作312)工程を含む。方法300の残りは、返される参照を評価して、特定の属性が、返される参照に割り当てられ得るかどうかを決定する工程を必然的に含む。一部の事例では、方法の残りは、実行可能コンポーネントが宣言されるコードを最初に評価することにより実行され得る。他の事例では、実行コンポーネントが呼び出されるコードが、返される参照の主要な特性が宣言コードによって識別され得ない場合に評価される。
【0023】
[0026]
図4は、実行可能コンポーネント401が入力引数411および412を受け取り、返される参照421および422を生成する環境400を例示する。しかしながら省略符号413が、実行可能コンポーネント401への任意の数の入力引数(0、1、または2以上でさえある)が存在し得ることを表す。省略符号423は、実行可能コンポーネント401の実行から結果として生じる、任意の正の数の(1つまたは複数の)返される参照が存在し得ることを表す。アノテーションコンポーネント201は、実行可能コンポーネント401を宣言する、または呼び出すコードを評価することが可能である。
【0024】
[0027] 実行可能コードに関係する宣言コードが評価されているか、それとも実行可能コードに関係する呼び出しコードが評価されているかに関係なく、実行可能コンポーネントへの何らかの入力引数が存在するか否かが決定される(判断ブロック313)。入力引数が少しも存在しないならば(判断ブロック313での「いいえ」)、表明属性が、返される参照に割り当てられ得る(動作315)。表明属性は、1)返される参照により参照される特定のオブジェクトグラフへの(または、特定のオブジェクトグラフの内部のいずれのオブジェクトへも)外部参照が存在しないこと、および、2)オブジェクトグラフの外側のいずれのオブジェクトへも、オブジェクトグラフの内部のミュータブル参照が存在しないことを表明する。本説明では、および特許請求の範囲では、属性は、その属性が、1つまたは複数の主張のセットが真であることを表すとシステムにより解釈可能である場合、1つまたは複数の主張のセットを「表明する」。
【0025】
[0028] 実例として、以下のコード例を考えてみる。
public class MyClass
{
int m_x;
public MyClass()
{
m_x = 0;
}
}
【0026】
[0029] メソッドMyClassはコンストラクタである。一般的にはコンストラクタは、書き込み可能値を返す。この宣言を(例えば、ランタイムの前にでも)評価することにより、表現式「new MyClass()」が、外側世界から完全に分離されている値を返すことが察知され得る。コンストラクタへの入力引数は存在しない(判断ブロック313での「いいえ」)。したがって、新しく創出されるオブジェクトのフィールドに記憶されるいずれの値も、2つの場所のうちの1つから生ずるものであり、すなわち、1)それらの値は、オブジェクトのコンストラクタの内側で新しく創出される、または、2)それらの値は、スタティックフィールドから発生する。コンストラクタは、自由にメソッドを呼び出し、フィールド内に返り値を記憶するが、いずれのメソッド呼び出しの返り値も、それ自体は他動的に、それらの2つの場所のうちの1つから生ずる。
【0027】
[0030] 本明細書で説明する原理は、フレームワーク210がイミュータブルスタティックを実装するか、それともミュータブルスタティックを実装するかに関係なく作用する。イミュータブルスタティックの事例では、フレームワーク210は、スタティックフィールドがイミュータブルであることを確実にする。したがって、イミュータブルスタティックフィールドから生ずる新しく創出されるフィールドは、表明属性により表明される保証を同じように有し得る。換言すれば、そのような新しく生成されるフィールドは、1)新しく創出されるフィールドにより参照される特定のオブジェクトグラフへの(または、特定のオブジェクトグラフの内部のいずれのオブジェクトへも)外部参照を有さず、および、2)オブジェクトグラフの外側のいずれのオブジェクトへも、オブジェクトグラフの内部のミュータブル参照が存在しないということである。
【0028】
[0031] ミュータブルスタティックを実装するフレームワークの事例では、原理はやはり、実行可能コンポーネントが(プログラマによって、または、自動的にコンパイラによってのいずれかで)ミュータブルスタティックを使用してアノテートされる場合に適用される。このことは、メソッドの出力が、属性を割り当てる資格を得ないように、メソッドへの書き込み可能引数としてモデリングされ得る。
【0029】
[0032] 実例として、メンタルモデルは以下のようになる。
void UsesMutableStatics(writable Statics s) {
// The static variable is just an ordinary writable
// reference. The compiler may plumb it through
// for you, or a developer might do it through
// a series of annotations (either opt-in or opt-out).
s.Type.staticVariable = 42;
}
【0030】
[0033] このように動作315では、アノテーションコンポーネント201は、これらの新しくコンストラクトされる、エイリアスが作られない値をモデリングするために使用される、特殊な表明属性を割り当てる。表現式「new MyClass()」は、表明属性を有するものとして扱われる。一部の実施形態ではこの表明属性は、「フレッシュ」の値を有するパーミッションタイプである。その実施形態では、コンストラクタは入力を有さないので、返り値のパーミッション(通常は「書き込み可能」にすぎない)が、「書き込み可能」から「フレッシュ」に昇格させられる。フレッシュ参照は、任意のパーミッション−読み込み可能、書き込み可能、またはイミュータブルとともにロケーションに記憶され得るが、そのようにされた後で、フレッシュパーミッションは失われる。さらにそのフレッシュ参照は、分離型ロケーションにもまた記憶され得るものであり、そのことにより、その「フレッシュ」パーミッションを失う。ロケーションが、フレッシュと特色付けされることにはならないことに留意されたい。したがって、値がロケーションに記憶された後で、その値はエイリアスが作られ得るものであり、そのため、もはやフレッシュではない。したがってこのようにして、表明属性(例えば、フレッシュパーミッションステータス)は失われ得る。
【0031】
[0034]
図3に返って、実行可能コンポーネントへの1つまたは複数の入力引数が存在するならば(判断ブロック313での、はい)、そのことは、入力引数が、イミュータブルであるか、オブジェクトグラフであって、そのオブジェクトグラフ内を指し示す外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを表すかのいずれかであるかどうかを決定する工程になる(判断ブロック314)。入力引数が存在し、それらの入力引数のすべてが、イミュータブルである、またはそうではない場合、これらの判定基準を満たすわけではないならば(判断ブロック314での「いいえ」)、表明属性(例えば、フレッシュパーミッション)は割り当てられない(動作316)。
【0032】
[0035] これに対して、実行可能コンポーネントへの入力引数のすべてが、イミュータブルであるか、オブジェクトグラフであって、そのオブジェクトグラフ内を指し示す外部ミュータブル参照を有さず、外部オブジェクトを参照する内部的ミュータブル参照を有さない、オブジェクトグラフを参照するかのいずれかであるならば(判断ブロック314での「はい」)、表明属性(例えば、フレッシュパーミッション)が、この次第で同様に割り当てられ得る(動作315)。
【0033】
[0036] コンストラクタが、イミュータブルであるいくつかの入力引数を取り入れる、以下のコード例を考えてみる。
public class MyClass2
{
int m_x;
string m_y;
immutable MyClass m_z;
public MyClass2(int x, string y, immutable MyClass z)
{
m_x = x;
m_y = y;
m_z = z;
}
}
【0034】
[0037] この事例では、同じ分析が適用される。MyClass2のいずれの新しくコンストラクトされるインスタンスも、外側世界とはいかなるミュータブル状態も共有し得ない。したがって新しくコンストラクトされるMyClass2オブジェクトは、表明する属性付けされたもの(例えば、フレッシュパーミッション)が割り当てられ得る。このことは、MyClass2コンストラクタの宣言の分析によってランタイムの前に決定され得る。
【0035】
[0038] 次に、コンストラクタが、常にイミュータブルであるとは限らないいくつかの引数を取る事例を考えてみる。
public class MyClass3
{
int m_x;
string m_y;
readable MyClass m_z;
public MyClass3(int x, string y, readable MyClass z)
{
m_x = x;
m_y = y;
m_z = z;
}
}
【0036】
[0039] 読み込み可能パーミッションは、この参照がミューテーションを可能にしないことを指示するが、別のエンティティはそれでも書き込み可能参照を保持する場合があり、したがって参照のミューテーションが察知される場合があることを想起されたい。例として、最初の2つの入力引数xおよびyは両方ともイミュータブルであるが、第3の入力引数myClassは、イミュータブルではなく読み込み可能である。したがって、宣言だけの分析に基づいて、属性が、このコンストラクタによりコンストラクトされる返されるmyClassに割り当てられ得るかどうかは決定され得ない。
【0037】
[0040] これに対して、myClassのインスタンスの実際の実行のランタイム環境(すなわち、呼び出しコード)を評価する際に、ことによると第3の入力引数は、イミュータブルステータスに高められ得るものであり、その理由は、イミュータブルパーミッションは、追加的な制約が課せられた、ある決まったタイプの読み込み可能パーミッションにすぎないからというものである。実際のランタイム環境では、それらの追加的な制約が察知されるならば、第3の入力引数はイミュータブルとなる。実例として、以下のランタイムコードを考えてみる。
public void Run2(immutable MyClass myClass)
{
immutable MyClass3 myClass3 = new MyClass3(5, "five", myClass);
}
【0038】
[0041] この事例では、new表現式の実際の引数はすべてイミュータブルであることが察知され得る。したがってこの特定のインスタンスでは、返される参照は、同じコンストラクタが非フレッシュ値をしばしば生み出すことになる場合でも、表明属性(例えば、フレッシュパーミッション)が割り当てられ得る。上記の例のすべてでは、返される参照は、入力引数が表明属性(例えば、フレッシュパーミッション)をさらに有するならば、表明属性(例えば、フレッシュパーミッション)が割り当てられ得る。一部の事例ではアノテートコンポーネント201自体が、以前の時点で入力引数にフレッシュパーミッションを割り当てた場合がある。
【0039】
[0042] ここまでは、これらの例のすべてはコンストラクタを使用していた。実際、同じ分析が随意の実行可能コンポーネントに対して作用する。以下の例を考えてみる。Incrementのパラメータリストの後の「読み込み可能」アノテーションは、「this」に関する、したがって、すべてのインスタンスフィールドアクセスまたはインスタンスメソッド呼び出しに対するパーミッションが読み込み可能であることを意味することに留意されたい。
public class Counter
{
int m_x;
public Counter()
{
m_x = 0;
}
public writable Counter Increment() readable
{
writable Counter c2 = new Counter();
c2.m_x = m_x + 1;
return c2;
}
public void Test()
{
immutable Counter c = (new Counter()).Increment().Increment().Increment();
}
}
【0040】
[0043] 「new Counter()」への元の呼び出しは、上記で論考したように、Counter()への入力引数が存在しないので、フレッシュオブジェクトを返す。Increment()への最初の呼び出しは、フレッシュである1つの入力を有するものであり、その理由は、その入力がCounter()からの返される値であるからである。したがって、Increment()の返り値のパーミッションは「書き込み可能」であるので、返り値は安全に「フレッシュ」に昇格させられ得る。この論理が、順番に各々の呼び出しに適用される。1つのものの「フレッシュ」出力が、次のものの「フレッシュ」入力になる。Increment()への最終の呼び出しは「フレッシュ」値を返し、その「フレッシュ」値は次いで、「イミュータブル」に変換され得る。
【0041】
[0044] 以下の表現式は、読み込み可能値を返す。
public readable Counter Increment() readable
{
writable Counter c2 = new Counter();
c2.m_x = m_x + 1;
return c2;
}
【0042】
[0045] この事例では、同じ分析が適用されるが、返り値をフレッシュに昇格させることは安全でない。そのようにすることによって、その返り値はミューテートされることが可能になることになる。読み込み可能値を、書き込み可能値または分離型値に変換することは危険である。これに対して、返される値は、読み込み可能またはイミュータブルのパーミッションが割り当てられ得る。イミュータブルパーミッションは、常に読み込み可能に低下させられ得るので、読み込み可能値を返すメソッドは、仮定的にイミュータブルオブジェクトの何らかのフィールドを返している場合がある。この事例では、その返り値をフレッシュに昇格させることによって、イミュータブルデータがミューテートされることが可能になることになり、そのことは矛盾するものである。代わりに、異なる昇格規則が適用されるものであり、出力は、「フレッシュ」パーミッションではなく「イミュータブル」パーミッションを有するものとして扱われる。この昇格は前のように安全であり、すべての入力がイミュータブルまたはフレッシュであるならば、いずれのミュータブル状態も外側世界と共有することは可能ではなく、そのため、返り値(すでにミューテートされ得ない)はイミュータブルとして安全に扱われ得る。
【0043】
[0046] したがって、本明細書で説明した原理によって、実行可能オブジェクトからの返される参照が、外部参照がオブジェクトにアクセスすることが可能であるかどうかを表明する属性を受け取ることが可能になる。
【0044】
[0047] 本発明は、その趣旨または本質的な特性から逸脱することなく、他の具体的な形式で実施され得る。説明した実施形態は、すべての事項において単に例示的であり制約的ではないと考えるべきである。したがって本発明の範囲は、上述の説明によってではなく、添付の特許請求の範囲によって指示される。特許請求の範囲の同等性の趣意および領域の範囲内であるすべての変更は、特許請求の範囲の範囲内に包容されることになる。