2011-01-05 50 views
17

Các kỹ thuật thu gom rác thải khi biên soạn một ngôn ngữ thu gom rác thải thành C là gì? Tôi biết hai:Thu gom rác khi biên dịch sang C

  1. duy trì một chồng bóng mà tiết kiệm tất cả các rễ một cách rõ ràng trong một cấu trúc dữ liệu

  2. sử dụng một bộ thu rác bảo thủ như

Kỹ thuật đầu tiên Boehm là chậm, bởi vì bạn phải duy trì ngăn xếp bóng. Có khả năng mỗi khi một hàm được gọi, bạn cần phải lưu các biến cục bộ trong một cấu trúc dữ liệu.

Kỹ thuật thứ hai cũng chậm và vốn không đòi lại tất cả rác do sử dụng bộ thu gom rác bảo thủ.

Câu hỏi của tôi là: trạng thái của bộ sưu tập rác khi biên dịch thành C. Lưu ý rằng tôi không có nghĩa là cách thuận tiện để thu gom rác khi lập trình trong C (đây là mục tiêu của bộ thu rác Boehm) , chỉ là một cách để thực hiện thu gom rác khi biên dịch thành C.

+2

Đây là một điều khó chịu. Đó cũng là lý do tại sao ví dụ: LLVM và C-- là phổ biến (chúng cho phép thu gom rác mà không phải xử lý nó một cách mau chóng). – delnan

+0

Hệ thống kiểu trong ngôn ngữ gốc có dựa trên DAG hoặc đồ thị chung không? DAG chỉ cần đếm tham chiếu (do hậu quả của việc tuần hoàn). –

+0

Đồ thị chung, thật không may. Tôi cũng nghĩ về đếm tham chiếu, nhưng điều đó dường như không giải quyết được mọi thứ bởi vì bạn vẫn cần một cách để đi qua rễ để thu thập chu kỳ ... – Jules

Trả lời

6

Có khả năng mỗi lần hàm được gọi, bạn cần phải lưu các biến cục bộ trong cấu trúc dữ liệu.

Không, bạn không - bạn có thể để biến cục bộ trên ngăn xếp C và vẫn lặp qua chúng: đặt tất cả biến tham chiếu vào mảng và thêm con trỏ vào danh sách được liên kết mà bạn nối một nút khi nhập một khung ngăn xếp mới.

Mockup:

struct vm 
{ 
    struct scope *root; 
}; 

struct scope 
{ 
    struct scope *prev, *next; 
    size_t size; 
    struct ref *refs; 
}; 

void foo(struct vm *vm, struct scope *caller) 
{ 
    struct ref local_refs[42]; 
    struct scope scope = { 
     caller, NULL, sizeof local_refs/sizeof *local_refs, local_refs }; 

    caller->next = &scope; 

    // ... 

    caller->next = NULL; 
} 

Tuy nhiên, bạn sẽ phải nhảy qua một số hoops lớn nếu bạn muốn hỗ trợ continuations/nhảy phi địa phương. Trong trường hợp đó, sẽ dễ dàng phân bổ mọi thứ hơn.

+0

Loại kỹ thuật này hữu ích nhất khi bạn sử dụng C làm ngôn ngữ đích cho trình biên dịch cho một số ngôn ngữ khác, do lỗi của nó và yêu cầu cẩn thận theo dõi mọi thứ –

+0

Cảm ơn, đó là một kỹ thuật thú vị. Tuy nhiên điều này không có nghĩa là các biến cục bộ không tồn tại trong sổ đăng ký, rất có thể thậm chí còn chậm hơn so với lưu người dân địa phương khi thực hiện cuộc gọi? – Jules

+0

@Jules: trình biên dịch vẫn còn miễn phí để lưu trữ bất kỳ giá trị cục bộ nào trong sổ đăng ký để tính toán, nhưng bạn nói đúng, nó phải đồng bộ hóa các giá trị trên gọi hàm; Tôi sẽ phải suy nghĩ về cách sử dụng aproptiate của 'const' và' limits' có thể cải thiện tình hình bằng cách nói với trình biên dịch rằng hàm được gọi sẽ không sửa đổi người dân địa phương ... – Christoph