Bộ Sưu Tập Rác Trong C++0x - nói dối e blog

Bộ Sưu Tập Rác Trong C++0x

Gần đây, blog của tác giả g9 đã chia sẻ một bài viết rất thú vị về chủ đề trình thu gom rác (garbage collector - GC) trong tiêu chuẩn C0x. Đây là bài đầu tiên bằng tiếng Việt mà tôi được đọc về tính năng GC trong C0x.

Hai năm trở lại đây, tôi đặc biệt quan tâm đến công nghệ GC :D và đã áp dụng nó trong các dự án thực tế suốt 2 năm qua. Dù dự án chuyển từ C++ sang C, cách triển khai mô-đun GC có thay đổi nhưng bản chất thì không. Tôi luôn hoan nghênh việc tích hợp GC vào C++, quan điểm này đã được tôi chia sẻ rõ ràng trong một bài blog trước đây.

Tôi vẫn nhớ như in hai năm trước, khi có cơ hội trực tiếp đặt câu hỏi với ông Bjarne Stroustrup về định hướng phát triển C++, tôi đã mạnh dạn bày tỏ mong muốn có GC trong C++. Vì từng tự tay xây dựng vài mô-đun GC cho C++, tôi có những yêu cầu cụ thể về mặt ngôn ngữ. Tiếc rằng trình độ tiếng Anh lúc đó quá kém, tôi không thể diễn đạt rõ ý :( Ông Stroustrup tỏ ra khá bối rối vì không hiểu hết những gì tôi trình bày. Cuối cùng, ngài ấy chỉ khuyên cộng đồng lập trình Việt Nam nên tích cực tham gia vào quá trình chuẩn hóa ngôn ngữ. Thực tế đáng buồn là lâu nay, hội đồng tiêu chuẩn C++ dường như chưa có đại diện nào đến từ Việt Nam.

Nếu C++ là công cụ bạn sử dụng hàng ngày, hãy mạnh dạn lên tiếng về những cải tiến bạn mong muốn cho công cụ đó.

Thực ra yêu cầu của tôi rất đơn giản: C++ cần bổ sung cơ chế mô tả giới hạn về kiểu dữ liệu trong cấu trúc dữ liệu. Chỉ cần phục vụ quản lý bộ nhớ, thông tin kiểu chỉ cần phân biệt được đâu là con trỏ, đâu là dữ liệu nguyên thủy là đủ. Các kiểu dữ liệu cụ thể có thể bỏ qua.

Tôi từng đề xuất ý tưởng: giống như bảng vtable, mỗi lớp nên có thêm một bảng nữa để ghi chú vị trí các con trỏ trong đối tượng (lưu lại độ lệch offset). Do bố cục đối tượng trong C++ khá phức tạp, việc này nếu không làm ở cấp trình biên dịch sẽ cực kỳ khó khăn. Với thông tin này, GC có thể dễ dàng duyệt qua bộ nhớ. Theo bài viết kia, C0x dường như dùng các từ khóa như gc_strictgc_relax để đánh dấu các khối nhớ có chứa con trỏ hay không, thay vì mô tả chi tiết đến từng trường dữ liệu. Cách tiếp cận này tương tự các thư viện GC cho C hiện có. Tôi đoán đây là giải pháp dành cho các kiểu POD, còn với lớp thông thường của C, chúng ta có thể làm tốt hơn nhiều vì trình biên dịch nắm rõ toàn bộ thông tin kiểu.

Tuy nhiên, vấn đề duyệt stack vẫn còn tồn tại, dù đã được cải thiện đáng kể. Với sự hỗ trợ của template trong C++, chúng ta có thể sáng tạo ra nhiều cú pháp “đường mật” (syntax sugar) để xử lý phần này ;-p

Cuối cùng, xin nói thêm về hiệu năng của GC. Quan niệm cho rằng GC không hiệu quả bằng quản lý bộ nhớ thủ công là một hiểu lầm phổ biến. Nếu không chỉ dựa vào suy đoán mà thực sự tự tay xây dựng một mô-đun GC và phân tích hiệu năng, bạn sẽ thấy GC hoàn toàn có thể mang lại hiệu suất vượt trội. Về chủ đề này, tôi đã từng tranh luận rất nhiều, đến mức thấy “ngán ngẩm” vì quá quen thuộc. Hôm nay xin phép không đi sâu thêm.

0%