Struktury danych w języku programowania z typami liniowymi

15

Załóżmy, że mamy do czynienia z językiem programowania obsługującym typy liniowe (terminy typu liniowego mogą być użyte najwyżej raz, że tak powiem). Pozwala to na traktowanie niektórych efektów obliczeniowych (takich jak mutacja, a nawet zmiana rodzaju operandu) w sposób problematyczny dla języków, których systemy typów działają tylko na „wiecznych prawdach”.

Wiele struktur danych można scharakteryzować za pomocą typów indukcyjnych (listy i drzewa są przykładami kanonicznymi). Jeśli dodamy do mieszanki liniowe typy indukcyjne, możemy również obsługiwać zmienne struktury danych.

Jednak nie jest dla mnie jasne, jak reprezentować struktury danych, które wykazują współdzielenie i odwołania cykliczne w języku programowania z typami liniowymi (przykładami takich struktur danych są DAG i inne wykresy, reprezentowane przez listy przyległości lub coś innego, listy cykliczne). Czy możemy to zrobić? Jeśli nie jest to możliwe, w jaki sposób powinniśmy rozszerzyć język, aby uwzględnić takie struktury danych?

Najbardziej zaangażowanym przykładem, jaki do tej pory znalazłem, jest podwójnie połączona lista. Czy są inne przykłady?

Bjørn Kjos-Hanssen
źródło

Odpowiedzi:

20

Liniowość nie jest wystarczającym ograniczeniem, aby określić unikalną reprezentację stanową, więc odpowiedź na twoje pytanie zależy od tego, jak interpretujesz logikę liniową w kategoriach stanu. Zazwyczaj znajdzie to odzwierciedlenie w sposobie interpretowania Modalność.!A

Jeśli planowana semantyka odniesień mówi, że wszystkie wskaźniki są unikatowymi wartościami (tzn. Istnieje co najwyżej jedno odniesienie do obiektu), wówczas dags i struktury grafów nie są wyrażalne, z tego rodzaju tautologicznego powodu, że dag może zawierać wiele odniesień do ten sam obiekt. W tym przypadku Musi być obliczenia , które tworzy nową wartość typu A , ponieważ chcesz Maps!AAI.δA:!A!A!AϵA:!AA

Załóżmy jednak, że chcesz reprezentować udostępnianie . Następnie obiekty można zbierać w pomocą liczenia referencji za pomocą map i można realizować jako operacje, które po prostu podważają referencje. W takim przypadku nie można użyć liniowości, aby założyć, że mutacja wartości zawsze jest bezpieczna, ponieważ istnieje współdzielenie. Możesz jednak upewnić się, że cała alokacja pamięci jest jawna w twoim programie i że nie ma żadnych cykli na stercie.!AδA:!A!A!AϵA:!AA

W najbardziej praktycznych implementacjach typów liniowych nie stosuje się żadnej z tych dwóch interpretacji. Zamiast tego referencje są postrzegane jako dowolnie powielane jednostki, a to, co śledzimy liniowo, to w rzeczywistości możliwości . Możliwości nie są wartościami środowiska wykonawczego; są to podmioty czysto koncepcyjne, które mają reprezentować pozwolenie na dostęp do odniesienia. Chodzi o to, że programujesz w stylu przekazywania uprawnień, a więc nawet jeśli istnieje wiele odniesień do tego samego obiektu, odczyt lub modyfikacja elementu stanu może nastąpić tylko wtedy, gdy masz również dostęp do niego. A ponieważ zdolność jest liniowa, wiesz, że tylko Ty możesz to zmienić.

nmiw:α.αdo:ι.dozap(do)rmifa(α,do)solmit:α,do:ι.dozap(do)rmifa(α,do)αdozap(do)rmifa(α,do)smit:α,do:ι.dozap(do)rmifa(α,do)αdozap(do)rmifa(α,do)doopy:α,do:ι.rmifa(α,do)rmifa(α,do)rmifa(α,do)

W zarysowanym powyżej interfejsie API, zakresy powyżej ι , niektóre dziedziny wskaźników czasu kompilacji i zakresy α ponad typami. Mamy typ c a p ( c ), który jest zdolnością indeksowaną przez c , oraz typ r e f ( α , c ) , który jest rodzajem odniesień do α, do którego dostęp uzyskuje zdolność c . Wywołanie g e t i s e t na referencji wymaga zdolności c , a wywołanie n edoιαdozap(do)dormifa(α,do)αdosolmitsmitdo tworzy nowe odniesienie i nową możliwość współużytkowania wspólnego indeksu. Jednakże, c o P r -nia odniesienie nie wymaga dostępu do jakiegokolwiek możliwości, to każdy może kopiować odniesienia, jak długo nie wyglądają w środku.nmiwdoopy

Neel Krishnaswami
źródło
Dziękuję za prowokującą odpowiedź. Jestem jednak zainteresowany, czy istnieje (techniczne) rozróżnienie między aliasingiem a udostępnianiem? Czy istnieją systemy, które mogą stopniowo przechodzić od liniowego (co najwyżej jednego odniesienia) do współdzielonego przez co najwyżej n odniesień do wspólnego w nieograniczony sposób?
1
1. Aliasing i udostępnianie są synonimami. 2. Tak, pozwalają na to interpretacje w stylu zdolności, powiększone o uprawnienia cząstkowe Boylanda . Zobacz także ostatnią pracę Pottiera nad kalkulacjami zdolności do teorii oraz pracę Aldricha i Bierhofa nad liczbą mnogą do implementacji.
Neel Krishnaswami,