Microsoft、Microsoft Research、ワシントン大学の著名人らがC#の新たな派生の導入について研究している。具体的には、言語レベルでの可読性と参照不変性の概念の導入を試みている。これにより、各参照は4つの許可修飾子のうちの一つを持ち、変数やパラメータを修飾することが可能になる。
C#における一般的な参照は “writable” とみなされる。これにより、参照先に対してメソッドや setter プロパティを利用した任意の変更が可能となる。
次の修飾子は “readable” だ。readable は、オブジェクトの閲覧のみを可能とする。これは、オブジェクトの変更不能を意味するものではなく、特定の参照を変更できないことを意味している。
任意の参照によりオブジェクトが変更できない場合、そのオブジェクトへの参照は “immutable” として扱われる。“immutable 参照は 読み込み専用参照、もしくは不変参照として別名付けされ、他の種類の参照には別名付けされない。あるオブジェクトから到達可能なすべての参照が全て immutable な参照は、同様に immutable 参照である。”
最後の許可修飾子は“isolated”と呼ばれ、“外面的に一意なオブジェクト郡への外部参照” を可能にする。これはやや複雑な概念である。変更可能なオブジェクト群で構成されたグラフを想像してみよう。ただし、これは任意の方法でお互いに参照できるが、グラフの外部からは直接参照できないものとする。例外はオブジェクトの集合の根を表す一つのオブジェクトへの参照だ。研究論文にある図 1は、この概念を分かりやすく説明してる。
研究論文の大半は、オブジェクトを writable、isolated、immutable 状態を相互に変換する方法について注力している。この概念(isolated の概念)は、複雑でimmutableなオブジェクトのグラフを構築する際に非常に重要な概念となる。従来の関数型言語では、immutable オブジェクト群によるグラフはボトムアップで構築している。言語によっては、このボトムアップ型構築法が可能であれば、内部サイクルを複雑にすることができる。また、グラフ構築の処理中に葉ノードが修正される場合等は、潜在的な性能劣化の要因となることが懸念される。
提案されたモデルでは、他のOOPスタイルの様な可変グラフから、オブジェクト群によるグラフが最初に生成される。isolated として扱われる一つの変数によってグラフの根は参照される。“isolated T” から“immutable T”への効率的なキャスト関数を用いることで、こうした変数は “recover immutability” として利用することができる(ただし isolated と immutable は変数の型における修飾子であり、それが参照するオブジェクト参照に対する修飾子ではない点に注意すること)。
主要な理由の一つは、より安全な並列処理を可能にすることだ。コンパイラは、それが与えたオブジェクトに対して競合状態を引き起こすことなく安全にアクセスできるかどうか知るために許可修飾子を使うことができる。デッドロックを完全に抑止することはできないが、ロックが求められる頻度を減らすために使われる。
本設計は、コンパイラやランタイム改善の新たな機会を設けている。
例として、並列GCでは immutable データに対する弱参照障壁として利用可能だ。コンパイラは更なる code motion とキャッシュを行うことができ、MSIL-to-native パスは不変なデータをバイナリに凍結することができる。
Uniqueness and Reference Immutability for Safe Parallelism は Colin S. Gordon氏、Matthew J. Parkinson氏、Jared Parsons氏、Aleks Bromfield氏、Joe Duffy氏によって執筆されている。