C-- -> ### C--
Vài ngày đầu năm nay tâm trạng không ổn định, khó tập trung vào các dự án. Trong lúc suy nghĩ lung tung, một vấn đề vẫn luôn ám ảnh tôi là làm thế nào để các ngôn ngữ tĩnh (static language) xây dựng được cơ chế thu gom rác (GC) hiệu quả. Việc ép buộc thêm thư viện GC cho C/C++ rõ ràng vượt quá khả năng vốn có của ngôn ngữ này. Dù tồn tại những giải pháp như “A garbage collector for C and C++”, nhưng cách tiếp cận này chủ yếu dựa trên suy đoán con trỏ, chưa thực sự hoàn hảo.
Ngôn ngữ D đã tích hợp GC, nhưng cách triển khai lại không giống với những gì tôi hình dung. Qua việc nghiên cứu nhiều tài liệu về D, tôi vẫn chưa nắm rõ cơ chế hoạt động bên trong. Gần đây, tôi nảy ra ý tưởng thử tiếp cận theo hướng khác: liệu có thể tự xây dựng một frontend tương tự như C++ từng làm với C không?
Điều khiến tôi trăn trở nhất chính là việc C không cho phép kiểm soát cách bố trí biến cục bộ (dữ liệu trên ngăn xếp). Đây là trở ngại lớn nhất khi quét các root object trong GC. Trong khi đó, việc tìm kiếm con trỏ trong biến toàn cục và cấu trúc do người dùng định nghĩa hoàn toàn có thể giải quyết dễ dàng thông qua dữ liệu và mã sinh ra từ frontend.
Tôi đã phác thảo một phương án sử dụng cấu trúc hai ngăn xếp: một ngăn xếp hệ thống chỉ chứa địa chỉ trả về của hàm, và một ngăn xếp dữ liệu do chúng ta kiểm soát hoàn toàn. Frontend sẽ sinh ra cấu trúc nội bộ cho các biến cục bộ của từng hàm. Về mặt vật lý, hai ngăn xếp này có thể gộp chung nhưng cách triển khai sẽ có chút khác biệt.
Nhờ đồng nghiệp gợi ý, tôi tìm hiểu về C– - một ngôn ngữ hợp ngữ có hỗ trợ GC. Đọc kỹ bài báo “C–: a portable assembly language that supports garbage collection”, tôi nhận ra nhiều điểm phân tích về giới hạn của C rất đúng với những gì mình đang suy nghĩ. Nếu thực sự triển khai frontend như vậy, việc chuyển dịch sang C– sẽ khả thi hơn nhiều so với C.
Tiếc rằng hiện tại áp lực công việc quá lớn, nên ý tưởng này đành gác lại như một thí nghiệm tư duy thú vị.