Có cần thu gom rác bằng ngôn ngữ dựa trên ngăn xếp không?


16

Sự cần thiết của bộ sưu tập rác (GC) trong ngôn ngữ dựa trên ngăn xếp là gì? Trong một ngôn ngữ như Forth hoặc RPL (trên máy tính HP ), có cần thu gom rác không?

Tôi nghĩ rằng, vì đầu ra được bật ra khỏi ngăn xếp, nên sẽ không có nhu cầu. Tui bỏ lỡ điều gì vậy?

Câu trả lời:


14

GC thường được áp dụng cho bộ nhớ được phân bổ trên heap. Tôi không quen thuộc với Forth hoặc RPL, nhưng nếu không có heap và mọi thứ được lưu trữ trên một ngăn xếp toàn cầu thay vào đó, thì không có gì để GC làm.


2
Mẫu sử dụng bộ nhớ điển hình của các chương trình Forth mà tôi đọc trong những ngày đầu là chúng giống như các chương trình lắp ráp, trong đó chúng sử dụng các địa chỉ dữ liệu toàn cầu tĩnh được sắp xếp trước. Điều này hoạt động vì Forth có khả năng chuyển dữ liệu giữa ngăn xếp và địa chỉ cụ thể. Hơn nữa nó có khả năng tính toán địa chỉ. Do đó, có thể tạo thư viện cấp phát dựa trên khái niệm heap và thư viện cấp phát sẽ cần một số cách để đối phó với kích thước hữu hạn của vùng heap. Nếu một người dùng Forth đi xuống con đường này, họ có thể hình dung được và muốn thực hiện GC.
người đàn ông không gian Cardiff

13

Vâng bạn đã đúng. Nhưng tính dựa trên ngăn xếp chỉ là một phần của toàn bộ câu chuyện. Ví dụ, trình thông dịch mã byte Java cũng dựa trên ngăn xếp (mã được biên dịch hoạt động - vì lý do hiệu quả - khác nhau). Điều này cho chúng ta biết rằng bất kỳ ngôn ngữ nào cũng có thể được chuyển đổi thành ngôn ngữ ngăn xếp.

Vấn đề là các đối tượng bên ngoài ngăn xếp, những người có thể tồn tại lâu hơn thực thi phương thức hiện tại. Miễn là ngôn ngữ không có gì giống mallochoặc new, không có các đối tượng như vậy và bạn không cần deletecũng không có GC.

Một ngôn ngữ thiếu phân bổ bộ nhớ động khá hạn chế về tính hữu dụng của nó.


không chắc chắn tôi đồng ý với dòng cuối cùng, là java bytecode không hữu ích?
jk.

@jk., java bytecode có cấp phát bộ nhớ động.
Peter Taylor

1
Trên thực tế, có một số ngôn ngữ có mục đích chung là dựa trên stack. Hãy xem Factcode.org
Yam Marcovic

1
Thực tế yếu tố là rác được thu thập
Andrea

1

Cần thu gom rác nếu ngôn ngữ sẽ hỗ trợ cấu trúc dữ liệu động vốn có. Điều này gần như là cần thiết nếu bạn muốn làm bất cứ điều gì ngoài mức C. Nếu không có nó, bạn chỉ bị mắc kẹt với các cấu trúc dữ liệu có kích thước cố định và tự quản lý bộ nhớ. Tất nhiên đó là những gì Forth ban đầu làm, nhưng có lẽ đó không phải là thứ bạn muốn làm hôm nay trừ khi bạn chỉ làm mã hóa hệ thống cấp thấp.


1

Không cần thu gom rác nếu ngôn ngữ sử dụng phân bổ tĩnh thay vì phân bổ ngăn xếp. Ví dụ, Fortran 77 với tùy chọn -s (lưu trữ tĩnh) phân bổ tất cả bộ nhớ khi chương trình khởi động, do đó không có phân bổ bộ nhớ nào xảy ra trong thời gian chạy để được giải phóng. Mặc dù cần một số kỷ luật, có thể viết chương trình, đặc biệt là mô phỏng để sử dụng cấp phát bộ nhớ tĩnh. Phân bổ tĩnh loại bỏ bất kỳ rò rỉ bộ nhớ và dẫn đến hiệu suất bộ đệm tuyệt vời vì trình biên dịch có thể sử dụng phân tích tĩnh để xác định những gì sẽ tải vào bộ đệm.

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.