Làm thế nào khác nhau là thu gom rác trong các ngôn ngữ thuần túy?


26

Trong một ngôn ngữ thuần túy như Haskell, tất cả dữ liệu là bất biến và không có cấu trúc dữ liệu hiện tại có thể được thay đổi theo bất kỳ cách nào. Ngoài ra, nhiều thuật toán về dữ liệu bất biến và các mẫu lập trình chức năng tạo ra lượng rác lớn ( mapví dụ: tạo các danh sách trung gian).

Những chiến lược và kỹ thuật nào để người thu gom rác sử dụng khi đối mặt với sự thuần khiết mà họ sẽ không làm? Điều gì hoạt động rất tốt trong một ngôn ngữ không tinh khiết của GC không trong bối cảnh thuần túy? Những vấn đề mới nào khác mà ngôn ngữ thuần túy tạo ra cho các GC?


1
bạn có thể muốn đọc wiki này.haskell.org/GHC/Memory_Quản lý
Mateusz K.

Câu trả lời:


13

Việc triển khai ghc hiện tại sử dụng một chiến lược chỉ hoạt động vì ngôn ngữ là chức năng thuần túy và dữ liệu là bất biến: bởi vì không có biến nào có thể được thay đổi để tham chiếu bất cứ điều gì mới hơn, các đối tượng chỉ giữ tham chiếu đến các đối tượng cũ hơn, vì vậy nó chạy trình thu gom rác thế hệ ; vì một đối tượng được gọi bởi một thế hệ cao hơn không thể bị xóa cho đến khi thế hệ đó là GCd, nó thúc đẩy các đối tượng cho các thế hệ cao hơn một cách háo hức; và vì không có gì thay đổi các tham chiếu trong khi GC đang quét chúng, nên nó có thể chạy song song.

Đây là một bài báo với nhiều chi tiết hơn .


4
Quảng cáo háo hức dựa vào sự lười biếng, việc cập nhật một thunk trong thế hệ cũ có thể tạo ra một con trỏ vào thế hệ mới, nhưng thunks chỉ bị biến đổi một lần, vì vậy nó đủ để thúc đẩy đối tượng trẻ một cách háo hức. Các tài liệu tham khảo từ già đến trẻ khác (ví dụ, từ các mảng có thể thay đổi) được theo dõi bằng cách sử dụng các bộ nhớ nhớ của bộ phận Cameron, cũng được sử dụng trong trường hợp quảng cáo háo hức thất bại.
Jon Purdy

1

Trong một ngôn ngữ thuần túy như Haskell, tất cả dữ liệu là bất biến và không có cấu trúc dữ liệu hiện tại nào có thể thay đổi theo bất kỳ cách nào

Thật ra điều đó không đúng. Các ngôn ngữ thuần túy sử dụng đánh giá không nghiêm ngặt (lười biếng) vì vậy việc đánh giá tiềm năng tất cả các biểu hiện phụ được hoãn lại. Các biểu thức không được đánh giá thường được phân bổ thành một "thunk". Khi được yêu cầu, biểu thức được ước tính và thunk được biến đổi thành giá trị kết quả.

Những chiến lược và kỹ thuật nào để người thu gom rác sử dụng khi đối mặt với sự thuần khiết mà họ sẽ không làm?

Điều duy nhất tôi có thể nghĩ là lỗ đen . Tôi không nhớ là đã thấy bất cứ điều gì mới về phía GC trong các tài liệu nghiên cứu của Haskell.

Điều gì hoạt động rất tốt trong một ngôn ngữ không tinh khiết của GC không trong bối cảnh thuần túy?

Các rào cản viết GC. Các ngôn ngữ không tinh khiết có xu hướng viết các con trỏ vào heap nhiều hơn vì vậy chúng có xu hướng để các rào cản viết của chúng được tối ưu hóa mạnh mẽ hơn.

Các thuật toán GC khác như vùng đánh dấu khả thi hơn nhiều trong bối cảnh ngôn ngữ không tinh khiết vì chúng có thể có tỷ lệ phân bổ thấp hơn nhiều so với ngôn ngữ thuần túy.

Những vấn đề mới nào khác mà ngôn ngữ thuần túy tạo ra cho các GC?

Ngôn ngữ thuần túy rất hiếm vì vậy có rất ít dữ liệu về cách các chương trình thuần sử dụng bộ nhớ và do đó, bạn đang bắt đầu ở một vị trí tồi tệ hơn khi cố gắng viết một GC cho ngôn ngữ thuần túy.


"Khi được yêu cầu, biểu thức được ước tính và thunk được biến đổi thành giá trị kết quả." Đó là một chi tiết triển khai nội bộ liên quan đến người dùng Haskell. Không có cách nào để quan sát đột biến, vì vậy đó không phải là đột biến theo quan điểm của người dùng.
Jack

Ngoài ra, ngôn ngữ thuần túy hoàn toàn có thể nghiêm ngặt - xem Idris để biết ví dụ.
Jack
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.