Cấu trúc dữ liệu trong ngôn ngữ lập trình với các loại tuyến tính


15

Giả sử chúng ta đang làm việc với một ngôn ngữ lập trình có hỗ trợ cho các loại tuyến tính (thuật ngữ của loại tuyến tính có thể được sử dụng nhiều nhất một lần, có thể nói). Điều này cho phép xử lý một số hiệu ứng tính toán (như đột biến, thậm chí thay đổi loại toán hạng) theo cách gây rắc rối cho các ngôn ngữ, các hệ thống loại chỉ hoạt động dựa trên "sự thật vĩnh cửu".

Nhiều cấu trúc dữ liệu có thể được đặc trưng với các loại quy nạp (danh sách và cây là ví dụ chính tắc). Nếu chúng ta thêm các kiểu quy nạp tuyến tính vào hỗn hợp, chúng ta cũng có thể xử lý các cấu trúc dữ liệu có thể thay đổi.

Tuy nhiên, tôi không rõ cách biểu diễn các cấu trúc dữ liệu thể hiện chia sẻ và tham chiếu theo chu kỳ trong ngôn ngữ lập trình với các loại tuyến tính (ví dụ về các cấu trúc dữ liệu đó là DAG và các biểu đồ khác, được biểu thị bằng danh sách kề hoặc một cái gì đó khác, danh sách tuần hoàn). Chúng ta có thể làm điều đó? Nếu không thể, chúng ta nên mở rộng ngôn ngữ theo cách nào để phù hợp với cấu trúc dữ liệu đó?

Ví dụ liên quan nhất mà tôi tìm thấy cho đến nay là một danh sách liên kết đôi. Có những ví dụ khác?

Câu trả lời:


20

Tuyến tính không phải là một ràng buộc đủ để xác định một biểu diễn trạng thái duy nhất và vì vậy câu trả lời cho câu hỏi của bạn phụ thuộc vào cách bạn diễn giải logic tuyến tính theo trạng thái. Điều này thường sẽ được phản ánh trong cách bạn phải giải thích phương thức.!A

Nếu ngữ nghĩa dự định của các tham chiếu của bạn nói rằng tất cả các con trỏ là các giá trị duy nhất (nghĩa là có nhiều nhất một tham chiếu đến một đối tượng) thì các cấu trúc đồ thị và đồ thị không thể biểu thị được, vì lý do tautological mà một dag có thể chứa nhiều tham chiếu đến cùng một đối tượng. Trong trường hợp này , phải là một tính toán tạo ra giá trị mới của loại A , vì bạn muốn bản đồ δ A : ! Một ! Một ! Aϵ A :!AAδA:!A!A!A .ϵA:!AA

Tuy nhiên, giả sử rằng bạn muốn để đại diện cho chia sẻ . Sau đó, các đối tượng có thể được thu gom rác với việc đếm tham chiếu, với các bản đồ δ A : ! Một ! Một ! Aϵ A : ! Một Một có thể được thực hiện như hoạt động mà chỉ đụng đếm tham khảo. Trong trường hợp này, bạn không thể sử dụng tuyến tính để cho rằng luôn an toàn để thay đổi giá trị, vì có chia sẻ. Nhưng bạn có thể đảm bảo rằng tất cả việc cấp phát bộ nhớ đều rõ ràng trong chương trình của bạn và không có chu kỳ nào trong heap.!AδA:!A!A!AϵA:!AMột

Hầu hết các triển khai thực tế của các loại tuyến tính sử dụng cả hai cách giải thích này. Thay vào đó, các tài liệu tham khảo được xem như các thực thể có thể sao chép tự do và những gì chúng tôi theo dõi tuyến tính thực tế là khả năng . Khả năng không phải là giá trị thời gian chạy; chúng hoàn toàn là các thực thể khái niệm nhằm thể hiện sự cho phép truy cập một tài liệu tham khảo. Ý tưởng là bạn lập trình theo kiểu cho phép và vì vậy ngay cả khi có nhiều tham chiếu đến cùng một đối tượng, việc đọc hoặc sửa đổi một trạng thái chỉ có thể xảy ra nếu bạn cũng có khả năng truy cập nó. Và vì khả năng là tuyến tính, bạn biết rằng chỉ có bạn mới có thể thay đổi nó.

new:α.αc:ι.cmộtp(c)ref(α,c)get:α,c:ι.cmộtp(c)ref(α,c)αcmộtp(c)ref(α,c)Set:α,c:ι.cmộtp(c)ref(α,c)αcmộtp(c)ref(α,c)copy:α,c:ι.ref(α,c)ref(α,c)ref(α,c)

Trong API được phác thảo ở trên, phạm vi trên ι , một số miền của các chỉ số thời gian biên dịch và phạm vi α trên các loại. Chúng ta có một loại c a p ( c ) là một khả năng được lập chỉ mục bởi c và một loại r e f ( α , c ) , là một loại tham chiếu đến α được truy cập bởi một khả năng c . Gọi g e ts e t trên một tham chiếu yêu cầu khả năng c và gọi n ecιαcmộtp(c)cref(α,c)αcgetSetc tạo một tham chiếu mới và một khả năng mới chia sẻ một chỉ mục chung. Tuy nhiên, c o p y -ing một tài liệu tham khảo không yêu cầu quyền truy cập vào bất kỳ khả năng, vì vậy bất cứ ai có thể sao chép một tài liệu tham khảo miễn là họ không nhìn vào bên trong nó.newcopy


Cảm ơn bạn cho một câu trả lời kích thích tư duy. Mặc dù vậy, tôi quan tâm, có sự phân biệt (kỹ thuật) giữa răng cưa và chia sẻ không? Có bất kỳ hệ thống nào có thể dần dần chuyển từ tuyến tính (nhiều nhất một tham chiếu) sang chia sẻ bởi tối đa n tham chiếu đến chia sẻ một cách không hạn chế?

1
1. Bí danh và chia sẻ là từ đồng nghĩa. 2. Có, các diễn giải theo kiểu khả năng, được tăng cường với các quyền phân đoạn của Boyland cho phép điều này. Xem thêm công trình gần đây của Pottier về tính toán khả năng cho lý thuyết và công việc của Aldrich và Bierhof về số nhiều để thực hiện.
Neel Krishnaswami
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.