Bộ sưu tập rác không có thẻ cho các ngôn ngữ hướng đối tượng


7

Tôi đang tìm kiếm một kỹ thuật thu gom rác tốt cho ngôn ngữ của mình và tìm thấy bài báo này , trong đó Benjamin Goldberg mô tả một kỹ thuật thu gom rác cho các ngôn ngữ được gõ mạnh, loại bỏ nhu cầu về thông tin loại trong thời gian chạy.

Tóm lại, điều này được thực hiện bằng cách đặt một con trỏ tới hàm thu gom rác ngay sau khi gọi hàm, trực tiếp trong mã được biên dịch. Sau đó, họ mở rộng điều này để hỗ trợ đa hình tham số giống ML.

Bây giờ câu hỏi của tôi : Đã có bất kỳ công việc nào về cách kỹ thuật này có thể được thực hiện bằng ngôn ngữ hướng đối tượng, trong đó nhiều chức năng được thực hiện thông qua các cuộc gọi gián tiếp sử dụng con trỏ trong một bảng ảo?


Bạn thấy vấn đề là gì? Điều quan trọng là mỗi thực thể biết danh tính lưu trữ riêng của mình.
babou

Có, nhưng trong kịch bản của tôi, nó không được biết vào thời gian biên dịch mà hàm được gọi, và do đó gc_routine (thuật ngữ từ bài báo) để gọi trong quá trình thu gom rác không được biết vào thời gian biên dịch. Tôi đang tìm kiếm một giải pháp cho vấn đề này mà không cần dùng đến phương pháp giải thích.
MathiasVP

Tôi đã cố gắng trả lời câu hỏi của bạn, như đã đưa ra chính xác hơn trong bình luận, nhưng tôi tự hỏi liệu đó có thực sự là vấn đề bạn có trong đầu không. Bình luận được chào đón.
babou

có vẻ như bạn chỉ cần đơn giản thời gian chạy trong hệ thống gc phù hợp với chức năng xác định chức năng. lưu ý rằng có rất nhiều chương trình thu gom rác, đó chỉ là vấn đề tìm một kế hoạch phù hợp với thiết kế ngôn ngữ của bạn ....
vzn

Câu trả lời:


6

Giống như kem Häagen-Dazs , Object Orientation có nhiều hương vị, mặc dù có nhiều hạt và chuối hơn. Do đó, thật nguy hiểm khi trả lời câu hỏi của bạn được nêu trong các điều khoản rất chung chung. Các ngôn ngữ OO cụ thể có thể có các tính năng không mong muốn có thể gây ra sự cố với các phương thức ảo. Tôi sợ rằng cố gắng tưởng tượng loại tính năng nào có thể khiến mọi thứ trở nên sai lầm là một bài tập không có kết quả. Tốt hơn là thử trả lời các câu hỏi chính xác.

Nguyên tắc cơ bản của GC không có thẻ là bất cứ lúc nào, bạn sẽ có thể kiểm tra bộ nhớ bắt đầu từ ngăn xếp và biết loại thực tế của tất cả các khối của bộ nhớ được phân bổ trực tiếp (vì đó chính xác là những gì mà GC sẽ cần làm việc). Điều này cũng ngụ ý, tại mỗi điểm gọi của hàm / phương thức, trạng thái khối kích hoạt hiện tại của người gọi, cho dù trên ngăn xếp hay trên heap, tức là các biến hiện tại của khối và trạng thái khởi tạo của chúng. Thông tin cấu trúc cần thiết có thể được lưu trữ dưới dạng mô tả dữ liệu sẽ được diễn giải hoặc dưới dạng các thói quen gc thực thicho hiệu quả GC tốt hơn. Điểm quan trọng của GC không có thẻ là thông tin này có thể được xác định tĩnh, để được lưu trữ một lần bằng mã thay vì với từng phiên bản của một loại hoặc lớp hoặc kích hoạt chức năng. Khi thông tin này có thể thay đổi linh hoạt, như trường hợp của các loại đa hình, có thể tính toán nó bằng cách truy tìm và gộp thông tin loại tĩnh thông qua chuỗi cuộc gọi động.

Việc một phương thức là ảo và được gọi thông qua một bảng ảo không phải là một vấn đề. Một người gọi không cần biết nó đang gọi là gì vì nó không có tầm quan trọng liên quan đến GC đối với hồ sơ kích hoạt của chính nó . Callee được cho là tự biết (trình biên dịch nhìn thấy nó) và mang theo bất kỳ thông tin nào nó cần. Thông tin có thể không đầy đủ như trong trường hợp đa hình và phải được hoàn thành từ thông tin loại khác có sẵn trong chuỗi cuộc gọi. Trên thực tế, trong một ngôn ngữ như ML, nơi các hàm có thể được truyền dưới dạng tham số hoặc đặt trong các bộ dữ liệu, người gọi có thể không biết chức năng nào thực sự gọi.

Vấn đề là người gọi biết vị trí trong mã của nó, nó gọi callee, để xác định trạng thái của khối kích hoạt trong cuộc gọi. Điều này phụ thuộc tĩnh vào điểm gọi và do đó có thể được suy ra từ địa chỉ trả lại callee , (theo nhiều cách khác nhau tùy thuộc vào các biến thể kỹ thuật được sử dụng bởi các tác giả khác nhau). Do đó, tương ứng gc-routine có thể được tìm thấy theo một cách nào đó từ địa chỉ trả lại. Ví dụ, nó có thể nằm trong mã ngay sau cuộc gọi, nhưng các kỹ thuật tương đương khác có thể được xem xét. Vì vậy, nếu callee bị chặn bởi GC, có thể thực hiện GC cho bản ghi kích hoạt người gọi. Người gọi không làm việc với GC cho callee, chỉ cho bản ghi kích hoạt của chính nó.

Điều có thể là một vấn đề là đảm bảo rằng callee biết loại thực tế của tất cả các giá trị được truyền cho nó (như trong đa hình). Chính xác hơn, phải có thể tìm thấy thông tin đó khi GC xảy ra và phải xử lý bản ghi kích hoạt của phương thức thực tế đang truy cập thông qua ảo.

Tôi tin rằng việc chính xác hơn về vấn đề cuối cùng này phụ thuộc vào các tính năng thực tế và cấu trúc classe / object của ngôn ngữ OO, trong tổ chức đánh máy của nó.

Nhưng, vì người gọi không cần biết callee, tôi không thấy rằng các cuộc gọi gián tiếp có thể là một vấn đề.

Một điểm khác (trả lời bình luận của OP) là vấn đề ở đây không phải là liệu GC được thực hiện từ mã được biên dịch hay được giải thích từ các mô tả, mà là nó có cần thẻ động cho thông tin loại hay không.

Gợi ý : để tìm thêm công việc về vấn đề này, hãy sử dụng các công cụ tìm kiếm yêu thích của bạn (và các tài nguyên web khác) và tìm kiếm các tài liệu trích dẫn các bài báo của Goldberg hoặc các tài liệu tham khảo chính của nó. Áp dụng quy trình đệ quy, thêm các từ khóa không thường xuyên như hướng đối tượng hoặc ảo .

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.