Một ngôn ngữ sẽ trông như thế nào trong đó chính xác là GC có thể thực hiện như một thư viện?


8

Giả sử bạn có một số ngôn ngữ lập trình với quản lý bộ nhớ thủ công. Ngôn ngữ này cần có những tính năng gì để có thể triển khai bộ sưu tập rác chính xác như một thư viện chứ không phải là cấu trúc ngôn ngữ cơ bản?

Theo một GC chính xác, ý tôi là một trong đó chỉ các con trỏ tới heap được chuyển qua để xác định biến nào là hoặc không tồn tại.

Một số cân nhắc bổ sung:

  • C và C ++ có trình thu gom rác Boehm, nhưng tôi không tính điều này vì nó không phải là một GC chính xác. Trình thu thập Boehm giả định rằng mọi thứ trên ngăn xếp có thể là một con trỏ, hoàn toàn dựa trên các yêu cầu căn chỉnh bộ nhớ, là một con trỏ. Ví dụ, bất kỳ số nguyên knào (k % 4) == 0nhìn ở mức bit như con trỏ, vì các con trỏ phải được căn chỉnh 4 byte.
  • magpie biến đổi mã C hiện có để sử dụng trình thu gom rác chính xác. Mã C được tạo ra có rất nhiều sơ khai để thu gom rác, tức là công cụ để đăng ký bất kỳ con trỏ ngăn xếp nào vào đống với bộ thu. Tôi không tính điều này bởi vì không ai có thể mong đợi viết mã theo cách đó; đó là mục tiêu biên dịch cho các ngôn ngữ khác.

Tôi tưởng tượng rằng một ngôn ngữ như vậy sẽ cần phải có:

  1. Macro hoặc một số hình thức siêu lập trình, để đóng gói tất cả các mã bổ sung cần thiết để thực hiện những việc như đăng ký gốc GC.
  2. Một số cơ chế phản chiếu cho phép bạn kiểm tra các cấu trúc hoặc công đoàn; bạn cần xác định thành viên nào là con trỏ.
  3. Một số cơ chế phản chiếu cho phép bạn kiểm tra bố cục khung ngăn xếp. Điều này nghe có vẻ khó hơn 2.

Tôi hy vọng điều này không quá mơ hồ hoặc dựa trên ý kiến ​​nhưng tôi đã tự hỏi về nó trong một thời gian.


ý tưởng thú vị / "thử nghiệm suy nghĩ" nhưng một phần của khía cạnh quan trọng của các ngôn ngữ được thu gom rác là các tham chiếu con trỏ đến bộ nhớ không được phân bổ là không thể, một cái gì đó không thể được thi hành bằng "hầu hết" (tất cả?) ngôn ngữ không được thu gom rác và tất cả con trỏ / logic bộ nhớ / tham chiếu được quản lý cao bởi ngôn ngữ. Vì vậy, bất kỳ câu trả lời sẽ phải xem xét khía cạnh quan trọng này. thực ra nó có thể không phải là câu trả lời mà bạn muốn, nhưng nghĩ rằng việc triển khai GC như một thư viện đơn thuần trên ngôn ngữ không phải là một kịch bản không thể tưởng tượng được.
vzn

Câu trả lời:


1

Tôi tin rằng điều này là có thể, hoặc ít nhất là gần như có thể, trong một ngôn ngữ như Rust, mặc dù có lẽ không nhất thiết theo nghĩa bạn đang nghĩ.

Rust thực sự có một thư viện GC , mặc dù tôi không thể nói nó chính xác đến mức nào. Nhưng ý tưởng là, có một loại cụ thể Gc<T>cho các con trỏ được thu gom rác đến các giá trị của loại T. Vì vậy, siêu lập trình mà bạn đang nói không xảy ra

Điều khiến cho điều này trở nên chính xác là hệ thống sở hữu của Rust: do gõ tuyến tính affine, mọi vị trí trong bộ nhớ đều có nhiều nhất một con trỏ tới nó, trừ khi nó được khai báo sử dụng một unsafekhối (được sử dụng để thực hiện những thứ như trình thu gom rác) . Vì vậy, nếu bạn có một con trỏ không được bọc trongGc loại, nó sẽ bị hủy ngay khi nó vượt ra khỏi phạm vi. Vì vậy, không thể coi một cái gì đó là một con trỏ không phải: hoặc nó được bao bọc trong Gcloại, hoặc nó thuộc sở hữu đơn lẻ và tự động giải quyết.

Mỗi loại có một dropphương thức ngầm được gọi là khi nó vượt ra khỏi phạm vi, nó sẽ giải quyết những thứ mà nó trỏ đến. Điều nàydrop là phương pháp nhận thức là gì và không phải là một con trỏ, mà còn giúp với độ chính xác.

Ngôn ngữ được gõ mạnh, gõ tĩnh và trừ khi bạn đặc biệt ở trong một unsafekhối, bạn không thể chuyển mọi thứ sang các loại khác, do đó, có thể biết tĩnh một loại bộ nhớ đã cho.

Đây không phải là một biến áp thả vào cho phép bạn xử lý mã Non-GC như Rác được thu thập. Các lập trình viên chỉ định cụ thể những giá trị được thu thập. Nhưng với điều đó, tôi nghĩ rằng nó có khả năng đáp ứng các tiêu chí của bạn.


1

Tôi nghĩ có thể thực hiện trình thu gom rác trong C ++ mà không cần thay đổi ngôn ngữ. Nhưng để sử dụng trình thu gom rác, người ta phải hạn chế lập trình viên sử dụng các cấu trúc ngôn ngữ tùy ý. Cụ thể, tất cả các yêu cầu cấp phát bộ nhớ phải được thực hiện thông qua các API phân bổ được cung cấp bởi trình thu gom rác và tất cả các truy cập phải được thực hiện thông qua các tham chiếu được quản lý bởi trình thu gom rác.

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.