JP6255420B2 - 不変オブジェクトタイプ - Google Patents

不変オブジェクトタイプ Download PDF

Info

Publication number
JP6255420B2
JP6255420B2 JP2015551764A JP2015551764A JP6255420B2 JP 6255420 B2 JP6255420 B2 JP 6255420B2 JP 2015551764 A JP2015551764 A JP 2015551764A JP 2015551764 A JP2015551764 A JP 2015551764A JP 6255420 B2 JP6255420 B2 JP 6255420B2
Authority
JP
Japan
Prior art keywords
computer
instance
immutable
object type
executable instructions
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2015551764A
Other languages
English (en)
Other versions
JP2016502219A (ja
JP2016502219A5 (ja
Inventor
ジェイ. ダフィー,ジョン
ジェイ. ダフィー,ジョン
ポーター パーソンズ,ジェアード
ポーター パーソンズ,ジェアード
シンズ,マイケル
ダニエル ブロムフィールド,アレクサンダー
ダニエル ブロムフィールド,アレクサンダー
ジェイ. クワリナ,クシシュトフ
ジェイ. クワリナ,クシシュトフ
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Original Assignee
Microsoft Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of JP2016502219A publication Critical patent/JP2016502219A/ja
Publication of JP2016502219A5 publication Critical patent/JP2016502219A5/ja
Application granted granted Critical
Publication of JP6255420B2 publication Critical patent/JP6255420B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking
    • G06F8/437Type checking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Computing Systems (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)
  • Storage Device Security (AREA)

Description

コンピューティングシステムは、ソフトウェアプログラムを実行することによって高度な機能を得る。プログラムは、ハードドライブ、コンパクトディスク、サムドライブ、フラッシュメモリなどの何らかの永続的な形で維持されるコンピュータ実行可能命令からなる。実行中、こうしたコンピュータ実行可能命令は、しばしばランダムアクセスメモリ内にロードされ、コンピューティングシステムの1つまたは複数のプロセッサによって実行されて、コンピューティングシステムにタスクを実行させることができる。
オブジェクト指向プログラミングでは、これらのコンピュータ実行可能命令は、機能呼び出しを介して対話し、1つまたは複数のプロパティを有し得るオブジェクトに編成される。管理コードは、タイプセーフを提供する管理環境内で実行するが、メモリ管理および例外処理も提供することができる。管理コードでは、オブジェクトは無限の寿命を有し、記憶に制限はなく、アクセス制限の方法は間接的であるかまたは追加のリソースを伴う。
システムレベルプログラミングは、システム全体を通じて、(オブジェクト)などのリソースへのアクセスおよびその寿命を厳しく効率的に管理することに基づいている。この厳しい管理を提供する1つの一般的な方法は、アプリケーションプログラムインターフェース(API)を使用して、リソースの寿命およびアクセスを管理することである。
本明細書で説明する少なくともいくつかの実施形態は、システムプログラミングにおける安全性を向上させる言語拡張に関する。言語拡張に従い、タイプ全体が、そのタイプのすべてのインスタンスが不変である場合に、不変であるものと宣言され得る。不変タイプ宣言により、そのタイプのいずれのインスタンスも不変であるものとして自動的に扱われ、インスタンスのすべての直接または間接的に到達可能なメンバ(たとえばフィールド、メソッド、プロパティ)も、不変であるものとして自動的に扱われることになる。さらに、インスタンスのフィールド割り当てを可能にするいずれの構築時間基準も、作成者(creator)がインスタンスにアクセスできるようになる時点を超えて存続し続けることはできない。したがって、このインスタンス、およびその同じタイプの任意の他のインスタンスは、構築時点から不変となる。
こうしたすべてのインスタンスを不変として分類できることは、通常はリソースアクセスの安全性により許可されないはずのアクションが、不変な特徴によって許可されるため、有益である。たとえば、複数の構成要素および複数のスレッドがインスタンス上の相反するアクションを何らかの形で実行してもリスクがないため、それらの構成要素およびスレッド間でインスタンスを共有することができる。
本概要は、請求する主題の主要な特徴または必須の特徴を識別することを意図しておらず、請求する主題の範囲を決定する際の一助として用いることを意図している。
前述および他の利点および特徴が得られる方法を説明するために、様々な実施形態について、添付の図面を参照しながらより具体的に説明する。これらの図面は単なる例示的な実施形態を示しているため、本発明の範囲を限定するものとはみなされないことを理解し、添付の図面を用いることで、追加の具体性および細部と共に実施形態を記述および説明する。
本明細書で説明するいくつかの実施形態が採用可能なコンピューティングシステムを、抽象的に示す図である。 本明細書で説明する実施形態が採用可能な例示の環境を表す管理コードシステムを、抽象的に示す図である。 本明細書で説明する原理に従った、不変タイプ宣言が実行可能なソースコードのオーサリング環境を含む環境を示す図である。 本明細書で説明する実施形態に従った、オブジェクトタイプの複数のインスタンスが不変であることを保証するための方法の、フローチャートを示す図である。
本明細書で説明する実施形態によれば、タイプ全体を不変として宣言することができる、システムプログラミングにおける安全性を向上させる言語拡張について説明される。不変タイプ宣言により、そのタイプのいずれのインスタンスも不変であるものとして自動的に扱われ、インスタンスのすべての直接または間接的に到達可能なメンバ(たとえばフィールド、メソッド、プロパティ)も、不変であるものとして自動的に扱われることになる。さらに、インスタンスのフィールド割り当てを可能にするいずれの構築時間基準も、作成者がインスタンスにアクセスできるようになる時点を超えて存続し続けることはできない。したがって、このインスタンス、およびその同じタイプの任意の他のインスタンスは、構築時点から不変となる。こうしたすべてのインスタンスを不変として分類できることは、通常はリソースアクセスの安全性により許可されないアクションが、不変な特徴によって許可されるため、有益である。たとえば、複数の構成要素および複数のスレッドがインスタンス上の相反するアクションを何らかの形で実行してもリスクがないため、それらの構成要素およびスレッド間でインスタンスを共有することができる。
図1に関して、コンピューティングシステムのいくつかの導入的考察について説明する。次に図2に関して、管理コードシステムの原理について説明する。最後に図3および4に関して、不変タイプを宣言するための言語拡張の原理について説明する。
現在、コンピューティングシステムは、益々多様な形を取るようになってきている。たとえばコンピューティングシステムは、ハンドヘルドデバイス、電化製品、ラップトップコンピュータ、デスクトップコンピュータ、メインフレーム、分散型コンピューティングシステム、あるいは、従来はコンピューティングシステムとみなされなかったデバイスとすることができる。本説明および特許請求の範囲において、「コンピューティングシステム」という用語は、広義には、少なくとも1つの物理的かつ有形のプロセッサ、および、プロセッサによる実行が可能なコンピュータ実行可能命令を有することが可能な物理的かつ有形のメモリを含む、任意のデバイスまたはシステム(あるいはそれらの組み合わせ)を含むこととして定義される。メモリは、任意の形を取ることが可能であり、コンピューティングシステムの性質および形に依存することが可能である。コンピューティングシステムは、ネットワーク環境を介して分散可能であり、複数の構成コンピューティングシステムを含むことが可能である。
図1に示されるように、そのほとんどの基本構成において、コンピューティングシステム100は、典型的には少なくとも1つの処理ユニット102およびメモリ104を含む。メモリ104は、揮発性、不揮発性、またはその2つの何らかの組み合わせとすることができる、物理システムメモリとすることができる。「メモリ」という用語は、本明細書では、物理記憶媒体などの不揮発性大容量ストレージを指すために使用することもできる。コンピューティングシステムが分散される場合、処理、メモリ、および/または記憶の機能も、同様に分散させることができる。本明細書で使用される場合、「実行可能モジュール」または「実行可能構成要素」という用語は、コンピューティングシステム上で実行可能なソフトウェアオブジェクト、ルーティング、または方法を指すことができる。本明細書で説明する異なる構成要素、モジュール、エンジン、およびサービスは、コンピューティングシステム上で(たとえば別々のスレッドとして)実行する、オブジェクトまたはプロセスとして実装することができる。
以下の説明では、1つまたは複数のコンピューティングシステムによって実行される動作を参照しながら、実施形態について説明する。こうした動作がソフトウェア内に実装される場合、動作を実行する関連付けられたコンピューティングシステムの1つまたは複数のプロセッサは、コンピュータ実行可能命令を実行させることに応答して、コンピューティングシステムの操作を指示する。たとえば、こうしたコンピュータ実行可能命令は、コンピュータプログラム製品を形成する1つまたは複数のコンピュータ可読媒体上に具体化され得る。こうした操作の例には、データの操作が含まれる。コンピュータ実行可能命令(および操作されたデータ)は、コンピューティングシステム100のメモリ104に記憶することができる。コンピューティングシステム100は、たとえばネットワーク110を介してコンピューティングシステム100に他のメッセージプロセッサと通信させることが可能な通信チャネル108を含むこともできる。
本明細書で説明する実施形態は、以下でより詳細に考察するように、たとえば1つまたは複数のプロセッサおよびシステムメモリなどのコンピュータハードウェアを含む、特定用途向けまたは汎用のコンピュータを備えるかまたは使用することができる。本明細書で説明する実施形態は、コンピュータ実行可能命令および/またはデータ構造を搬送または記憶するための、物理的およびその他のコンピュータ可読媒体も含む。こうしたコンピュータ可読媒体は、汎用または特定用途向けのコンピュータシステムがアクセス可能な、任意の使用可能媒体とすることができる。コンピュータ実行可能命令を記憶するコンピュータ可読媒体は、物理記憶媒体である。コンピュータ実行可能命令を搬送するコンピュータ可読媒体は、伝送媒体である。したがって、限定ではなく例として、本発明の実施形態は、コンピュータ記憶媒体および伝送媒体という、少なくとも2つの明確に異なる種類のコンピュータ可読媒体を含むことができる。
コンピュータ記憶媒体は、RAM、ROM、EEPROM、CD−ROMまたは他の光ディスクストレージ、磁気ディスクストレージまたは他の磁気記憶デバイス、あるいは、コンピュータ実行可能命令またはデータ構造の形の望ましいプログラムコード手段を記憶するために使用可能であり、汎用または特定用途向けのコンピュータによるアクセスが可能な、任意の他の媒体を含む。
「ネットワーク」は、コンピュータシステムおよび/またはモジュールおよび/または他の電子デバイスの間での電子データの移送を可能にする、1つまたは複数のデータリンクとして定義される。情報がネットワークまたは他の通信接続(ハードワイヤード、ワイヤレス、あるいはハードワイヤードまたはワイヤレスの組み合わせのいずれか)を介してあるコンピュータに転送または提供される場合、コンピュータは接続を伝送媒体として正しくみなす。伝送媒体は、コンピュータ実行可能命令またはデータ構造の形の望ましいプログラムコード手段を搬送するために使用可能であり、汎用または特定用途向けのコンピュータによるアクセスが可能な、ネットワークおよび/またはデータリンクを含むことができる。上記の組み合わせも、コンピュータ可読媒体の範囲に含まれるものとする。
さらに、様々なコンピュータシステム構成要素に到達すると、コンピュータ実行可能命令またはデータ構造の形のプログラムコード手段は、伝送媒体からコンピュータ記憶媒体に(またはその逆に)自動的に転送することができる。たとえば、ネットワークまたはデータリンクを介して受信されるコンピュータ実行可能命令またはデータ構造は、ネットワークインターフェースモジュール(たとえば「NIC」)内のRAMにバッファリング可能であり、その後最終的に、コンピュータシステムRAMおよび/またはコンピュータシステムの揮発性の低いコンピュータ記憶媒体に転送可能である。したがって、コンピュータ記憶媒体は、伝送媒体も(あるいはこれを主に)使用するコンピュータシステム構成要素内に含めることができることを理解されたい。
コンピュータ実行可能命令は、たとえば、プロセッサで実行された場合、汎用コンピュータ、特定用途向けコンピュータ、または特定用途向け処理デバイスに、ある機能または機能グループを実行させる、命令およびデータを含む。コンピュータ実行可能命令は、たとえば2進数、アセンブリ言語などの中間形式命令、あるいはソースコードとすることができる。これまで、構造的な特徴および/または方法論的な動作に特有の言い回しで主題について説明してきたが、添付の特許請求の範囲で定義される主題は、必ずしも上記で説明した特徴または動作に限定されるものではないことを理解されよう。むしろ、説明した特徴および動作は、特許請求の範囲を実装する例示的な形として開示されている。
当業者であれば、本発明が、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、メッセージプロセッサ、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースまたはプログラム可能な家庭用電化製品、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、携帯電話、PDA、ページャ、ルータ、スイッチなどを含む、多くのタイプのコンピュータシステム構成を備えるネットワークコンピューティング環境で実施可能であることを理解されよう。本発明は、ネットワークを介して(ハードワイヤードデータリンク、ワイヤレスデータリンク、またはハードワイヤードおよびワイヤレスのデータリンクの組み合わせによって)リンクされているローカルおよびリモートのコンピュータシステムがどちらもタスクを実行する、分散システム環境でも実施可能である。分散システム環境では、プログラムモジュールをローカルおよびリモートの両方のメモリ記憶デバイス内に配置することができる。
図2は、本明細書で説明する原理が動作可能な環境200を示す。環境200は、オブジェクトグラフの隔離および変更可能性を追跡するフレームワーク210を含む。フレームワーク210は、リファレンスへのアクセスを制御することによって、オブジェクトグラフに対する様々なリファレンス221を編成する。リファレンスは、ローカル変数、メソッドパラメータ、オブジェクトフィールド、またはオブジェクトグラフへの任意の他のリファレンスとすることができる。図示された実施形態では、リファレンス221はリファレンス221Aから221Eを含むものとして示されているが、省略記号221Fは、フレームワーク210が任意数のリファレンス220へのアクセスを管理できることを象徴的に表している。
フレームワーク210は、リファレンスに許可を割り当てることによって、リファレンス221へのアクセスを管理する。「許可」は、リファレンスを変更することができるかどうかに関する何らかのプロパティを示す、リファレンス上の注釈である。こうした許可は、図2では許可211によって抽象的に表されている。許可は、読み取り可能許可211A、書き込み可能許可211B、および不変(イミュータブル)許可211Cを含む。
「読み取り可能」許可211Aは、対応するオブジェクト(ならびに、その直接および間接的に到達可能なメンバのすべて)が、読み取りのみ可能であることを意味する。
「書き込み可能」許可211Bは、対応するオブジェクトが書き込み可能であることを意味する。
「不変」許可211Cは、読み取り可能許可211Aと同様であるが、このオブジェクトに対して書き込み可能なリファレンスを有する者がいないことをさらに保証する。不変許可211Cは、このオブジェクトに対する書き込み可能リファレンスが二度と存在しないことをさらに保証できる。したがって、不変許可211Cは、対応するオブジェクトが今後一切書き込まれないこと(ならびに、その直接および間接的に到達可能なメンバのすべてが今後一切書き込まれないこと)、ならびに、そのフィールドのすべて、およびそのフィールドのフィールドのすべて、なども同様に、今後一切書き込まれないことを意味する。オブジェクト内のすべての静的フィールドは、フレームワーク210によって不変許可211Cを有するとして扱われる。
「フレッシュ」許可211Dは、1)戻されたリファレンスによって参照される特定のオブジェクトグラフ(または特定のオブジェクトグラフ内の任意のオブジェクト)に対する外部リファレンスが存在しないこと、および、2)オブジェクトグラフ外部のいずれのオブジェクトに対しても、オブジェクトグラフ内に変更可能リファレンスが存在しないこと、を表す。「未構築」許可211Eについては、以下でより詳細に説明する。
フレームワーク210は、メモリ位置を隔離されているものとして注釈付けする、隔離メモリマネージャ212も含む。記憶位置に関する「隔離」注釈は、その位置が、外部的に一意な値を記憶することを意味する。すなわち、その位置に記憶されるいずれのオブジェクトについても、システム内にその位置に対する外部リファレンスは存在せず、その位置に記憶されるオブジェクトの直接または間接的に到達可能ないずれのメンバに対するいずれのリファレンスも存在しない。たとえば、隔離メモリマネージャ212は、隔離メモリ位置222を管理する。隔離メモリ位置は、2つの隔離メモリ位置222Aおよび222Bを含むものとして示されているが、省略記号222Cは、隔離メモリ位置222が任意数の隔離メモリ位置を含み得ることを表す。
注釈構成要素201は、フレームワーク210上に構築される。代替としてまたは加えて、注釈構成要素201はフレームワーク210の一部として動作し得る。注釈構成要素201は、図2のリファレンス221のうちの1つなどのリファレンスを戻す実行可能構成要素を評価するように構成される。
本説明は、いったん構築が完了すると常に不変であるタイプをどのように表すかに関するリファレンス許可に対処する、システムにおける課題を対象とする。これらのタイプのフィールドは不変かつ読み取り専用であり、書き込み可能リファレンスを介しても変更は不可能である。変更の発生が可能なメカニズムが単に存在しない。以下、これらのタイプを「不変タイプ」と呼び、それ以外はすべて「変更可能タイプ」と呼ぶ。
不変タイプは、異なる構成要素および異なるスレッド間で自由に共有可能なデータ片を表すため、システムプログラミングにおいて共通である。1つの構成要素が、別の構成要素に対してその影響が目に見えるような方法でデータを変更し得るほど危険なことはない。
不変タイプの分類における第1の課題は、不変タイプがしばしば、それらのコンストラクタに対して「書き込み可能」として分類される入力パラメータを取ることである。しかしながら、書き込み可能入力はフィールドに、また構築中のインスタンスにも記憶されず、したがって、オブジェクトタイプは全体としてもはや不変とはみなされず、その代わりに変更可能となる。しかしながら、不変タイプは、書き込み可能入力パラメータに基づいて何らかの不変データを計算した後、その最終的な不変値をフィールドとして記憶することができる。したがって不変タイプは、対応するインスタンスが構築された時点から、その不変な特徴を保持する。
コンストラクタへの入力が不変またはフレッシュな入力のみを含む場合、オブジェクトは「不変」に昇格することができる。しかしながら、この規則によって、結果的にすべての不変オブジェクトが不変として分類されることにはならない。たとえば、以下の疑似コード例について考えてみる。
public class Container

readonly immutable string m_name;
readonly immutable string m_address;
public Container(writable Student student)

m_name=student.Name;
m_address=student.Address;

この例で、Containerは実際には構築後は不変であるが、タイプContainerは、書き込み可能であると宣言される、Studentと呼ばれる入力パラメータを含む。したがって、規則(コンストラクタへの入力が不変許可またはフレッシュ許可を伴う入力パラメータのみを含む場合、オブジェクトは「immutable」に昇格可能であること)は、このタイプが書き込み可能入力を含んでいるため、不変に昇格するには不適格であるものとみなす。これにより、読み取り可能の最大許可が可能となる。
第2の課題は、不変タイプおよび非不変タイプに対して共通のストレージを定義することである。プログラミングにおいて、記憶された値を元の状態で取り出せるような、任意のオブジェクト用のストレージとすることが可能な場所を定義することが有利である。これは、記憶位置が変更可能タイプおよび不変タイプを受け入れる必要がある場合、両方のタイプに対して作用する可能な許可は存在しないため、失敗に終わる。以下の疑似コードについて考えてみる。
writable Student student=...;
immutable string name=...;
???object storage;
if(condition){
storage=name;

else{
storage=student;
この例では、「student」および「name」の両方からの割り当てが可能であり、それらを元の許可と共に取り出すことが可能な、「記憶」場所に関する許可を選別する方法はない。あらゆる許可に問題がある。たとえば、不変リファレンスを「writable」としてマーク付けされたリファレンスに記憶することはできないため、「書き込み可能」許可は「name」が割り当てられないようにする。書き込み可能リファレンスを不変な場所に記憶することはできないため、「不変」許可は「student」が割り当てられないようにする。割り当てた値および取り出した値は、それらがもともと所有していたものとは異なる許可を有することになるため、「読み取り可能」許可は「storage」が割り当てられないように、および取り出されないようにする。
本明細書で説明する原理は、不変タイプの概念を導入することによって、これらの問題を解決する。これは、タイプのすべてのインスタンスが不変であることを示すために、ユーザがタイプ宣言に追加する明示的注釈である。たとえば、本明細書で説明する原理は、不変タイプが宣言される方法に限定されないが、以下の例示の疑似コードについて考えてみる。
immutable class String{
...
図3は、本明細書で説明する原理が採用可能な環境300を示す。(オーサリングプログラムなどの)オーサリングプロセス310は、プログラミングまたは(ソフトウェアなどの)他のプログラミングエンティティに、直前にその例が示された不変タイプ宣言312を含む(ソースコードまたは中間言語コードなどの)コード311を生成させることが可能である。次にコンパイラ320がコード311をコンパイルし、その結果不変タイプ宣言312に遭遇する。
図4は、オブジェクトタイプの複数のインスタンスが不変であることを保証するための方法400のフローチャートを示す。方法400は、オブジェクトタイプが不変(イミュータブル)である旨の宣言にアクセスしたとき(動作401)、コンパイラによって実行可能である。たとえば図3を参照すると、方法400は、コンパイラ320が不変タイプ宣言312にアクセスしたとき実行可能である。
宣言に応答して、コンパイラは、そのオブジェクトタイプの各インスタンスが不変(イミュータブル)として分類される(動作411)ように、コンピュータ実行可能命令を自動的に組み立てる(編成する)。これにより、不変タイプのすべての他のインスタンスを暗黙的に「不変」にする。さらに、そのオブジェクトタイプのインスタンスのすべての直接または間接的に到達可能なメンバが、不変として分類される(動作412)。たとえば、インスタンスによって直接または間接的に到達可能なすべてのタイプ、フィールド、メソッド、およびプロパティには、暗黙的に不変許可のタグが付けられる。加えて、構築時に、そのオブジェクトのインスタンスのフィールド割り当てが可能ないずれのリファレンスも、作成者がインスタンスにアクセスできるようになる時点を超えて存続し続けることはできない(動作413)。例として、コンストラクタにおける「this」の許可には、「未構築」と呼ばれる許可が暗黙的に割り当てられる。この許可は、図2で「未構築」許可211Eとして示されている。
不変タイプの主要なプロパティは、構築中にそれらの状態を変更することが許されることであるが、構築が完了すると、不変タイプから構築されたいずれのインスタンスも、二度と変更することはできない(したがって不変である)。以下の構築後規則が実施され、1)フィールドは不変であるため、それ自体は変更できない、2)不変タイプのすべての構築済みインスタンスは不変であるため、それらのフィールドを再割り当てすることはできない(フィールドの再割り当てまたは変更を試行したいずれのメンバも、コンパイル時に見つけられることになる)
構築時の変更は、「未構築」許可211E(図2を参照)で達成される。この許可によって、フィールドのターゲットリファレンスからの読み取りおよびターゲットリファレンスへの書き込みが可能になる。不変性の不変部分を維持するために、フィールド割り当てを可能にする「this」リファレンスを、コンストラクタより長持ちさせることはできない。リファレンスが、書き込み可能入力で「未構築」許可と共に記憶され、コンストラクタがオブジェクトをさらに変更することを完了した後に使用されることが可能な場合、問題が生じることになる。さらに、コンストラクタが完了するまで、「this」値を、完全に構築されたAddressオブジェクトとして見ることもできない。これによりAddressオブジェクトは、依然として変化している場合であっても、不変を装うことができる。以下の疑似コードについて考えてみる。
public immutable class Address

public Address(out notconstructed Address p)

p=this;
Address address=this;

「this」からの上記割り当てのうちのいずれかが合法的である場合、完全に構築されたAddressインスタンスを変更しているものとみなすことができる。この「未構築」許可はいずれかの割り当てを防止する。この許可はユーザによって宣言可能でないため、任意の記憶位置に表すことはできない。上記の疑似コード例におけるパラメータ宣言は、コンパイラの観点からは単に非合法である。「未構築許可」を、任意の他の許可タイプに(読み取り可能にも)変換することもできない。これにより、記憶する場所を定義することができないため、コンストラクタよりも長持ちしないことが保証される。
これらの制約は、不変タイプがいったん構築を完了すると、常時不変であることを意味する。したがって、構築済み不変タイプのすべてのインスタンスには、暗黙的に不変許可のタグが付けられる。ユーザがタイプに加える、書き込み可能を含むいずれの許可も、タイプシステムによって単純に無視される。変更が単に可能でないため、許可はもはや関係ない。
インスタンスがいかなる変更も生じさせることができないため、不変タイプのインスタンスを、変更のためにマーク付けされた位置に記憶できるようになる。以下の疑似コードについて考えてみる。
string s1=“test”;
immutable string s2=s1;
writable string s3=s1;
writable object o1=s1;
したがって、これが再度不変タイプおよび変更可能タイプに共通のストレージを可能にする。さらに、不変ではない可能性のあるオブジェクトを不変として安全に分類することが可能であり、不変オブジェクトの使用に関してプロセスが互いに干渉し合うことを気にすることなく、異なるプロセス間でインスタンスを安全に共有することができる。
本発明は、その趣旨または必須の特徴から逸脱することなく、他の特有な形で具体化することができる。説明した実施形態は、すべての点で単なる例示であり、制限的でないものとみなされる。したがって本発明の範囲は、前述の説明ではなく添付の特許請求の範囲によって示される。特許請求の範囲と等価の意味および範囲内にあるすべての変更は、その範囲内に包含される。

Claims (9)

  1. オブジェクトタイプの複数のインスタンスが不変であることを保証するための、コンピュータで実装された方法であって、
    ソフトウェアコードにおける宣言であって、オブジェクトタイプへの注釈を含み、かつ、前記オブジェクトタイプが不変であることを指定する宣言にアクセスする動作、および、
    前記宣言へのアクセスに応答して、
    構築されると前記オブジェクトタイプの各インスタンスが不変として分類されるようにするコンピュータ実行可能命令を自動的に組み立てる動作であって、前記コンピュータ実行可能命令は、前記オブジェクトタイプの全てのインスタンスが不変となるように前記オブジェクトタイプに対するユーザにより指定される許可を無視するコンピュータ実行可能命令を含む、動作と、
    前記オブジェクトタイプの前記インスタンスのすべての直接または間接的に到達可能なメンバが、不変として分類されるように、コンピュータ実行可能命令を自動的に組み立てる動作と、
    構築時に、そのオブジェクトの前記インスタンスのフィールド割り当てが可能ないずれのリファレンスも、前記インスタンスの作成者が前記インスタンスにアクセスできるようになる時点を超えて存続し続けることは許可されないように、コンピュータ実行可能命令を自動的に組み立てる動作であって、構築時にそのオブジェクトの前記インスタンスのフィールド割り当てが可能な前記リファレンスの許可には、ユーザにより宣言可能でなく、かつ、任意の他の許可タイプに変換可能でない、許可タイプが割り当てられる、動作と、
    を実行すること、
    を含む、コンピュータで実装された方法。
  2. 前記不変オブジェクトタイプの少なくとも1つのインスタンスが1つまたは複数の書き込み可能入力値を取る、請求項1に記載のコンピュータで実装された方法。
  3. 前記1つまたは複数の書き込み可能入力値は、全ての前記少なくとも1つのインスタンスにおけるフィールドに記憶されない、請求項2に記載のコンピュータで実装された方法。
  4. 前記リファレンスのインスタンスのうちの1つまたは複数のメンバが不変許可でない許可を含む、請求項1に記載のコンピュータで実装された方法。
  5. 前記オブジェクトタイプの前記インスタンスのうちのいずれかを変更可能とするメカニズムが存在しない、請求項1に記載のコンピュータで実装された方法。
  6. フィールド割り当てを可能にする前記リファレンスが、前記オブジェクトタイプのインスタンスを構築するインスタンスコンストラクタのthisリファレンスである、請求項1に記載のコンピュータで実装された方法。
  7. フィールド割り当てを可能にする前記リファレンス上で実行可能な1つまたは複数の動作のセットが、前記リファレンスがフィールドとして記憶されないように制限される、請求項1に記載のコンピュータで実装された方法。
  8. 前記1つまたは複数の動作のセットが読み取りおよび書き込みを含む、請求項1に記載のコンピュータで実装された方法。
  9. コンピューティングシステムの1つまたは複数のプロセッサによって実行された場合、オブジェクトタイプの複数のインスタンスが不変であることを保証するための方法を前記コンピューティングシステムに実行させる、コンピュータ実行可能命令を有するコンピュータ可読記憶媒体であって、前記方法は、
    ソフトウェアコードにおける宣言であって、オブジェクトタイプへの注釈を含み、かつ、前記オブジェクトタイプが不変であることを指定する宣言にアクセスする動作、および、
    前記宣言へのアクセスに応答して、
    構築されると前記オブジェクトタイプの各インスタンスが不変として分類されるようにするコンピュータ実行可能命令を自動的に組み立てる動作であって、前記コンピュータ実行可能命令は、前記オブジェクトタイプの全てのインスタンスが不変となるように前記オブジェクトタイプに対するユーザにより指定される許可を無視するコンピュータ実行可能命令を含む、動作と、
    前記オブジェクトタイプの前記インスタンスのすべての直接または間接的に到達可能なメンバが、不変として分類されるように、コンピュータ実行可能命令を自動的に組み立てる動作と、
    構築時に、そのオブジェクトの前記インスタンスのフィールド割り当てが可能ないずれのリファレンスも、前記インスタンスの作成者が前記インスタンスにアクセスできるようになる時点を超えて存続し続けることは許可されないように、コンピュータ実行可能命令を自動的に組み立てる動作であって、構築時にそのオブジェクトの前記インスタンスのフィールド割り当てが可能な前記リファレンスの許可には、ユーザにより宣言可能でなく、かつ、任意の他の許可タイプに変換可能でない、許可タイプが割り当てられる、動作と、
    を実行すること、
    を含む、コンピュータ可読記憶媒体。
JP2015551764A 2013-01-04 2014-01-03 不変オブジェクトタイプ Active JP6255420B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/734,750 2013-01-04
US13/734,750 US9098269B2 (en) 2013-01-04 2013-01-04 System and method to ensure resource access safety with immutable object types
PCT/US2014/010112 WO2014107539A1 (en) 2013-01-04 2014-01-03 Immutable object types

Publications (3)

Publication Number Publication Date
JP2016502219A JP2016502219A (ja) 2016-01-21
JP2016502219A5 JP2016502219A5 (ja) 2017-01-26
JP6255420B2 true JP6255420B2 (ja) 2017-12-27

Family

ID=50031532

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015551764A Active JP6255420B2 (ja) 2013-01-04 2014-01-03 不変オブジェクトタイプ

Country Status (11)

Country Link
US (2) US9098269B2 (ja)
EP (1) EP2941699A1 (ja)
JP (1) JP6255420B2 (ja)
KR (1) KR102100531B1 (ja)
CN (1) CN105144098B (ja)
AU (2) AU2014204049B2 (ja)
BR (1) BR112015015790A2 (ja)
CA (1) CA2896593C (ja)
MX (1) MX2015008715A (ja)
RU (1) RU2666237C2 (ja)
WO (1) WO2014107539A1 (ja)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9098269B2 (en) * 2013-01-04 2015-08-04 Microsoft Technology Licensing, Llc System and method to ensure resource access safety with immutable object types
US10990425B2 (en) * 2019-05-08 2021-04-27 Morgan Stanley Services Group Inc. Simulated change of immutable objects during execution runtime
US11580199B2 (en) * 2019-09-20 2023-02-14 International Business Machines Corporation Correspondence of external operations to containers and mutation events
US11748129B2 (en) 2020-10-15 2023-09-05 Morgan Stanley Services Group Inc. Simulated change of immutable objects during execution runtime
US11914580B2 (en) 2021-09-30 2024-02-27 Salesforce, Inc. Mechanisms for deploying database clusters
US12019522B2 (en) 2022-01-20 2024-06-25 Pure Storage, Inc. Container recovery layer prioritization

Family Cites Families (65)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5590332A (en) 1995-01-13 1996-12-31 Baker; Henry G. Garbage collection, tail recursion and first-class continuations in stack-oriented languages
US5701458A (en) 1995-09-20 1997-12-23 International Business Machines Corporation System and method for managing arbitrary subsets of access control lists in a computer network
US6009269A (en) * 1997-03-10 1999-12-28 Digital Equipment Corporation Detecting concurrency errors in multi-threaded programs
US6092156A (en) * 1997-11-05 2000-07-18 Unisys Corporation System and method for avoiding deadlocks utilizing split lock operations to provide exclusive access to memory during non-atomic operations
US6510460B1 (en) 1997-12-18 2003-01-21 Sun Microsystems, Inc. Method and apparatus for enforcing locking invariants in multi-threaded systems
US6182277B1 (en) * 1998-04-15 2001-01-30 Oracle Corporation Methods and apparatus for declarative programming techniques in an object oriented environment
US6542891B1 (en) * 1999-01-29 2003-04-01 International Business Machines Corporation Safe strength reduction for Java synchronized procedures
US6438560B1 (en) * 1999-09-16 2002-08-20 International Business Machines Corporation Reuse of immutable objects during object creation
US6681385B1 (en) 1999-10-07 2004-01-20 Microsoft Corporation Method and apparatus for determining the relationships and useful lifetime of objects in a program
US6675378B1 (en) 2000-01-06 2004-01-06 International Business Machines Corporation Object oriented apparatus and method for allocating array objects on an invocation stack
US6925638B1 (en) * 2000-09-21 2005-08-02 International Business Machines Corporation Mutability analysis in Java
US6598141B1 (en) 2001-03-08 2003-07-22 Microsoft Corporation Manipulating interior pointers on a stack during garbage collection
US7058943B2 (en) 2001-05-24 2006-06-06 International Business Machines Corporation Object oriented apparatus and method for allocating objects on an invocation stack in a partial compilation environment
EP1308845A1 (en) 2001-10-23 2003-05-07 Sun Microsystems, Inc. Method and apparatus for scoped memory
US7096456B2 (en) 2001-11-30 2006-08-22 Microsoft Corporation Method and apparatus for providing dynamically scoped variables within a statically scoped computer programming language
JP2003167737A (ja) 2001-11-30 2003-06-13 Nec Corp スタック使用方法
CA2408457A1 (en) 2002-10-17 2004-04-17 Ibm Canada Limited-Ibm Canada Limitee Collection and detection of differences of values of expressions/variables when debugging a computer process
US7603664B2 (en) * 2002-10-22 2009-10-13 Sun Microsystems, Inc. System and method for marking software code
RU2412475C2 (ru) * 2003-08-21 2011-02-20 Майкрософт Корпорейшн Системы и способы расширений и наследования для блоков информации, управляемых системой аппаратно-программного интерфейса
US7219340B2 (en) * 2003-10-23 2007-05-15 Microsoft Corporation Changeable class and pattern to provide selective mutability in computer programming environments
US7511718B2 (en) * 2003-10-23 2009-03-31 Microsoft Corporation Media integration layer
US7669226B2 (en) * 2004-07-30 2010-02-23 International Business Machines Corporation Generic declarative authorization scheme for Java
US7774376B1 (en) 2004-07-30 2010-08-10 Microsoft Corporation Type-system extensions for object-oriented language based on coercive subtyping with restrictions
US7912863B1 (en) 2004-07-30 2011-03-22 Microsoft Corporation Compositional lifting of operations over structural types
JP5021475B2 (ja) 2004-08-03 2012-09-05 マイクロソフト コーポレーション コンテキストポリシー制御によるアプリケーション間の関連付けの制御のためのシステムおよび方法
US7730450B2 (en) * 2004-08-12 2010-06-01 National Instruments Corporation Automatic versioning and data mutation of user-defined data types
KR100577366B1 (ko) 2004-09-25 2006-05-10 삼성전자주식회사 이종의 자바 메소드를 실행하는 방법 및 장치
US20060242104A1 (en) * 2005-04-21 2006-10-26 Microsoft Corporation Systems and methods for manipulating data in a data storage system
US20070056042A1 (en) 2005-09-08 2007-03-08 Bahman Qawami Mobile memory system for secure storage and delivery of media content
CN101046755B (zh) 2006-03-28 2011-06-15 郭明南 一种计算机自动内存管理的系统及方法
GB0608406D0 (en) 2006-04-28 2006-06-07 Ibm Creating references in a scoped memory system
US8245031B2 (en) 2006-07-07 2012-08-14 Sandisk Technologies Inc. Content control method using certificate revocation lists
US7739466B2 (en) * 2006-08-11 2010-06-15 Intel Corporation Method and apparatus for supporting immutable memory
US8132093B2 (en) 2006-08-14 2012-03-06 Microsoft Corporation Instance annotation in object-oriented programming
US8527946B2 (en) * 2007-03-06 2013-09-03 International Business Machines Corporation Declarative object identity using relation types
US20080244516A1 (en) 2007-03-26 2008-10-02 Microsoft Corporation Variable capture in object oriented languages
TW200841173A (en) 2007-04-12 2008-10-16 Arcadyan Technology Corp Tracking method for embedded system
US9785549B2 (en) 2007-04-27 2017-10-10 Microsoft Technology Licensing, Llc Managing object lifetime for native/managed peers
US8281293B2 (en) * 2007-07-24 2012-10-02 International Business Machines Corporation Copy-on-write optimization of immutable objects for objects oriented languages
US8141063B2 (en) 2007-08-30 2012-03-20 International Business Machines Corporation Static analysis of reachable methods and fields in object-oriented applications using object instantiation
US8122068B2 (en) 2007-09-25 2012-02-21 International Business Machines Corporation Memory management using garbage collection of objects in child scoped memory areas
US8438612B2 (en) 2007-11-06 2013-05-07 Varonis Systems Inc. Visualization of access permission status
JP2009129127A (ja) * 2007-11-22 2009-06-11 Fujitsu Ltd プログラムの不変物抽出処理プログラム,処理装置,および処理方法,ならびに該プログラムを記憶する記憶媒体
US8347266B2 (en) * 2007-12-10 2013-01-01 Microsoft Corporation Declarative object identity
CN104123240B (zh) 2008-01-31 2017-07-28 甲骨文国际公司 用于事务缓存的系统和方法
US9026993B2 (en) 2008-06-27 2015-05-05 Microsoft Technology Licensing, Llc Immutable types in imperitive language
US8762969B2 (en) * 2008-08-07 2014-06-24 Microsoft Corporation Immutable parsing
US8095731B2 (en) 2008-11-06 2012-01-10 Oracle International Corporation Mutable object caching
US8676847B2 (en) 2009-04-07 2014-03-18 International Business Machines Corporation Visibility control of resources
US8495329B2 (en) 2009-04-13 2013-07-23 Microsoft Corporation Type system support for memory isolation permissions
US9569282B2 (en) 2009-04-24 2017-02-14 Microsoft Technology Licensing, Llc Concurrent mutation of isolated object graphs
US8473900B2 (en) * 2009-07-01 2013-06-25 Advanced Micro Devices, Inc. Combining classes referenced by immutable classes into a single synthetic class
US8555259B2 (en) 2009-12-04 2013-10-08 International Business Machines Corporation Verifying function performance based on predefined count ranges
JP5724343B2 (ja) * 2009-12-25 2015-05-27 リコーイメージング株式会社 一眼レフカメラのミラーブレーキ機構
US8566544B2 (en) 2009-12-29 2013-10-22 Microsoft Corporation Compiler-enforced agent access restriction
US9424010B2 (en) 2010-08-30 2016-08-23 International Business Machines Corporation Extraction of functional semantics and isolated dataflow from imperative object oriented languages
US8533695B2 (en) 2010-09-28 2013-09-10 Microsoft Corporation Compile-time bounds checking for user-defined types
US8533413B2 (en) * 2010-12-03 2013-09-10 Sap Ag Content modification control using read-only type definitions
US8589951B2 (en) * 2011-01-07 2013-11-19 International Business Machines Corporation Conserving memory by using objects that are selectably mutable during runtime
US8826229B2 (en) * 2011-06-02 2014-09-02 The Mathworks, Inc. Immutable properties in a class
US9684600B2 (en) 2011-11-30 2017-06-20 International Business Machines Corporation Dynamic process/object scoped memory affinity adjuster
US9971578B2 (en) 2012-10-15 2018-05-15 Microsoft Technology Licensing, Llc Reference attribute annotation signifying no external reference
US9229959B2 (en) 2013-01-04 2016-01-05 Microsoft Technology Licensing, Llc Object graph partial immutability and isolation enforcement
US9098269B2 (en) * 2013-01-04 2015-08-04 Microsoft Technology Licensing, Llc System and method to ensure resource access safety with immutable object types
US20140196015A1 (en) 2013-01-04 2014-07-10 Microsoft Corporation Declaration of lifetime of resource reference

Also Published As

Publication number Publication date
EP2941699A1 (en) 2015-11-11
US20140196008A1 (en) 2014-07-10
KR102100531B1 (ko) 2020-04-13
US9740460B2 (en) 2017-08-22
AU2014204049B2 (en) 2018-11-15
JP2016502219A (ja) 2016-01-21
KR20150104156A (ko) 2015-09-14
US9098269B2 (en) 2015-08-04
US20150324175A1 (en) 2015-11-12
WO2014107539A1 (en) 2014-07-10
AU2019200748A1 (en) 2019-02-21
MX2015008715A (es) 2016-03-09
AU2014204049A1 (en) 2015-07-16
AU2019200748B2 (en) 2020-02-27
CN105144098A (zh) 2015-12-09
CA2896593C (en) 2020-09-08
BR112015015790A2 (pt) 2017-07-11
CN105144098B (zh) 2018-11-13
CA2896593A1 (en) 2014-07-10
RU2015126784A (ru) 2017-01-13
RU2666237C2 (ru) 2018-09-06

Similar Documents

Publication Publication Date Title
JP6255420B2 (ja) 不変オブジェクトタイプ
CN108614702B (zh) 字节码优化方法及装置
TW201820131A (zh) 進程管理方法及裝置
KR102093531B1 (ko) 외부 참조를 나타내지 않는 참조 속성 어노테이션
US8813258B2 (en) Selectively exposing base class libraries based on application execution context
US11422932B2 (en) Integrated reference and secondary marking
US20170147943A1 (en) Global data flow optimization for machine learning programs
Boloşteanu et al. Asymmetric secure multi-execution with declassification
US10819752B2 (en) Systems and methods for quantitative assessment of a computer defense technique
EP2941702B1 (en) Object graph partial immutability and isolation enforcement
US20140196015A1 (en) Declaration of lifetime of resource reference
Sisco et al. A Semantics-Based Approach to Concept Assignment in Assembly Code
JP2020197866A (ja) ソフトウェア開発装置およびソフトウェア開発プログラム

Legal Events

Date Code Title Description
A529 Written submission of copy of amendment under article 34 pct

Free format text: JAPANESE INTERMEDIATE CODE: A529

Effective date: 20150820

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20161205

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20161205

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20171107

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20171204

R150 Certificate of patent or registration of utility model

Ref document number: 6255420

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250