2009-05-06 22 views
5

Có thể cho một ngôn ngữ không phiên dịch để có một bộ sưu tập rác hay không. Các ngôn ngữ được phiên dịch có Interpretor thực hiện dòng Program by line để Interpretor có thể cung cấp thời gian chạy với GC. Nhưng liệu có thể có một bộ sưu tập rác cho bất kỳ ngôn ngữ nào khác mà không cần xây dựng GC trong chính mã của bạn?Ngôn ngữ không phiên dịch có thể có Bộ sưu tập rác không?

+5

Tôi tự hỏi nếu bạn đang giả định một sự phân đôi giả giữa "diễn giải" và "gốc". Java và C#, ví dụ, không phải là "giải thích" cũng không phải "bản địa" - chúng chạy (về cơ bản) trong một máy ảo, nhưng từ một IL. –

+0

Bạn có thể giải thích thêm:? – Geek

+0

Đối với cuộc hội thoại đó, hãy xem các nhận xét về câu trả lời của tôi. –

Trả lời

0

Có.

C++ với việc triển khai con trỏ thông minh sẽ thu thập rác khi số tham chiếu con trỏ thông minh chuyển về 0.

Bạn có bộ sưu tập rác. Bạn đã không tự xây dựng nó.

+1

Tôi nghĩ rằng câu hỏi là về truy tìm bộ sưu tập rác thải, và việc đếm ngược không phải là thay thế. –

+1

Đó không phải là bộ sưu tập rác. Kết nối một số đối tượng theo cách như vậy mà họ có một chu kỳ và họ không bao giờ bị phá hủy trừ khi bạn phá vỡ chu kỳ bằng tay. – sharptooth

+0

@sharptooth: mang nó đi với phần còn lại của thế giới, không phải tôi: http://www.codeproject.com/KB/cpp/automatic_gc_using_sp.aspx –

11

Chỉ thu thập rác yêu cầu các biến con trỏ được đánh dấu theo cách đặc biệt để thời gian chạy có thể xác định chúng và sử dụng để thu thập rác. Nó không có gì để làm với giải thích/biên dịch, nhưng thay vào đó yêu cầu thời gian chạy đặc biệt và lưu trữ dữ liệu bổ sung với mỗi biến.

+0

Các ngôn ngữ được diễn giải tốt sẽ mang lại cho bạn thời gian chạy. Atleast nó dễ dàng hơn cho các phiên dịch để làm việc như một thời gian chạy và chạy một bộ thu rác quá. Bất kỳ ngôn ngữ bản địa nào sẽ có hệ điều hành như là thời gian chạy? Và do đó không có GC? – Geek

+1

GC và giải thích không liên quan với nhau. Vâng, ngôn ngữ thông dịch có khả năng dễ dàng hơn để thu thập rác, nhưng các ngôn ngữ không diễn giải cũng có thể làm được điều này. Các hệ điều hành thường không có hỗ trợ nhúng để thu gom rác, nhưng nhiều thời gian chạy ngôn ngữ có. – sharptooth

+2

Và thậm chí không đánh dấu các biến con trỏ theo cách đặc biệt, bạn có thể có cái gọi là GC bảo thủ xử lý tất cả nội dung bộ nhớ dưới dạng con trỏ tiềm năng. Xem GC của Boehm trong câu trả lời khác. –

6

Vâng, ngôn ngữ .NET (phát ra IL - C#, VB.NET, MC++, v.v.) không được giải thích (đặc biệt nếu bạn sử dụng NGEN) - và có bộ sưu tập rác đầy đủ.

Tương tự như vậy, Java.

+0

Java được phiên dịch là bạn của tôi. Ngay cả khi nó là với HotSpot. – Geek

+0

Không - nó có thể không phải là "bản địa", nhưng điều đó không làm cho nó "giải thích" - ít nhất, không theo định nghĩa bình thường. –

+0

Tôi không quên câu trả lời của bạn "ít nhất, không theo định nghĩa bình thường"? Nó được diễn giải. ?? – Geek

0

Mục tiêu-C 2 hiện có bộ sưu tập rác và có sẵn các thư viện thu gom rác cho C++.

Tôi nghĩ rằng nó có thể miễn là có nó ngôn ngữ cho phép bạn kiểm tra các đối tượng để bạn có thể đi qua cây đối tượng.

+1

Bạn có thể giải thích cách nó hoạt động. Điều này giống như gắn một GC Thread cùng với chương trình của bạn phải không? – Geek

+1

Chủ đề riêng biệt không liên quan đến GC - điều đó chỉ xảy ra là cách Java thực hiện.Hầu hết C++ (và Objective-C) xử lý nó tại thời gian xóa khi đếm số đếm tới 0. –

+1

Mục tiêu-C 2 có bộ sưu tập rác thật; thời gian chạy đi qua cây đối tượng. Số lượt truy cập bị bỏ qua khi thu thập rác được bật. Tôi tin rằng đó là một phần của vòng lặp sự kiện, nhưng tôi không chắc chắn. –

2

C++ 0x mới bao gồm các tính năng giúp thực hiện thu thập rác dễ dàng hơn. Xem ví dụ này interview.

3

Haskell có thu gom rác thải, cho dù nó được biên dịch sang mã nguồn gốc hoặc giải thích.

Các vấn đề liên quan