線形型を持つプログラミング言語のデータ構造


15

線形型をサポートするプログラミング言語を扱っていると仮定します(線形型の用語は、多くても1回しか使用できません)。これにより、いくつかの計算効果(突然変異、オペランドの型の変更など)を、言語にとって問題のある方法で処理できます。言語の型システムは「永遠の真理」のみで動作します。

多くのデータ構造は帰納的タイプで特徴付けることができます(リストとツリーは標準的な例です)。線形誘導型をミックスに追加すると、可変データ構造も処理できます。

ただし、線形型のプログラミング言語で共有および循環参照を示すデータ構造をどのように表現するかは明確ではありません(そのようなデータ構造の例は、隣接リストまたはその他の循環リストで表されるDAGおよび他のグラフです)。できますか?それが不可能な場合、そのようなデータ構造に対応するために、どのように言語を拡張する必要がありますか?

私がこれまでに見つけた最も複雑な例は、二重にリンクされたリストです。他の例はありますか?

回答:


20

線形性は、一意のステートフル表現を特定するのに十分な制約ではないため、質問に対する答えは、状態に関する線形論理の解釈方法によって異なります。これは通常、解釈方法に反映されます!Aモダリティ。

参照の意図したセマンティクスが、すべてのポインターが一意の値であると言う場合(つまり、オブジェクトへの参照は最大で1つ)、DAGとグラフ構造は表現できません。同じオブジェクト。この場合には、は、マップおよび Aが必要なため、タイプAの新しい値を作成する計算でなければなりません。!AAδA:!A!A!AϵA:!AA

ただし、が共有を表すと仮定します。次に、マップおよびを使用して、オブジェクトを参照カウントでガベージコレクション できます。この場合、共有があるため、値を変更しても常に安全であると仮定するために線形性を使用することはできません。ただし、プログラムですべてのメモリ割り当てが明示的に行われ、ヒープにサイクルがないことを確認できます。!AδA:!A!A!AϵA:!AA

線形型のほとんどの実用的な実装では、これら2つの解釈のどちらも使用しません。代わりに、参照は自由に複製可能なエンティティと見なされ、直線的に追跡するのは実際には機能です。機能はランタイム値ではありません。これらは、参照へのアクセス許可を表すことを目的とした純粋に概念的なエンティティです。アイデアは、許可を渡すスタイルでプログラムするということです。したがって、同じオブジェクトへの参照が多数ある場合でも、状態の一部の読み取りまたは変更は、アクセスできる機能を持っている場合にのみ発生します。また、機能は線形であるため、変更できるのは自分だけであることがわかります。

new:α.αc:ι.cap(c)ref(α,c)get:α,c:ι.cap(c)ref(α,c)αcap(c)ref(α,c)set:α,c:ι.cap(c)ref(α,c)αcap(c)ref(α,c)copy:α,c:ι.ref(α,c)ref(α,c)ref(α,c)

上記のAPIでは、は範囲、コンパイル時インデックスの一部のドメイン、およびは型の範囲です。型はによってインデックス付けされた機能であり、型は、機能によってアクセスされるへの参照の型です。参照に対しておよびを呼び出すには、機能が必要です。また、を呼び出すと、新しい参照と共通のインデックスを共有する新しい機能が作成されます。ただし、cιαcap(c)cref(α,c)αcgetsetcnewcopy-参照を作成するために機能にアクセスする必要はありません。そのため、参照しない限り誰でも参照をコピーできます。


考えさせる答えをありがとう。私は興味がありますが、エイリアスと共有の間に(技術的な)区別はありますか?線形(最大で1つの参照)から、最大でn個の参照による共有へと無制限に徐々に移行できるシステムはありますか?

1
1.エイリアスと共有は同義語です。2.はい、ケーパビリティスタイルの解釈に、ボーイランドの部分的な許可が追加されています。理論については能力計算に関するPottierの最近の研究、実装についてはAldrichとBierhofのPluralに関する研究も参照してください。
ニールクリシュナスワミ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.