Giả sử bạn đang biên dịch một ngôn ngữ chức năng sang C di động, và giả sử cũng vì nhiều lý do bạn muốn thu thập rác chính xác hơn là bảo quản rác. Không có cách di động (có lẽ không có cách nào cả trong trường hợp chung) cho bộ thu gom rác để tìm ra cái gì và không phải là một con trỏ trên ngăn xếp C. Dường như với tôi có hai giải pháp cho vấn đề này:Biên dịch các ngôn ngữ chức năng thành C
Ngăn xếp bóng. Làm cho mỗi chức năng C duy trì thông tin sổ kế toán về những gì là và không phải là một con trỏ. Đây là phương pháp được đề xuất bởi ví dụ: LLVM.
Tận dụng lợi thế của việc bạn đang biên dịch ngôn ngữ chức năng, có nghĩa là mã mainline không có tác dụng phụ. Khi bộ cấp phát phát hiện ra khỏi bộ nhớ, thay vì gọi bộ thu gom rác, nó hủy bỏ hoạt động hiện tại với một longjmp quay trở lại vòng lặp chính, gọi trình thu gom rác (trong một ngữ cảnh nơi tập hợp các biến có thể chứa con trỏ trước) sau đó khởi động lại hoạt động.
Dường như với tôi rằng, nếu bạn đang đối phó với một ngôn ngữ chức năng thuần túy nơi tiếp cận thứ hai được áp dụng, nó phải có hiệu quả hơn so với phương pháp đầu tiên, cũng như dễ dàng hơn để trộn với viết tay C.
Có vấn đề gì tôi đang xem không? Bất kỳ tham chiếu đến thảo luận hiện có hoặc thực hiện các kỹ thuật này?
Có thể không hữu ích, nhưng tôi đã thử lần đầu tiên khi viết đánh dấu quét cho trình thông dịch chương trình của tôi. Hiệu suất bị hút, vì vậy tôi đã kết thúc với một ngăn xếp hoàn toàn ảo bên ngoài ngăn xếp của thời gian chạy C, chủ yếu là sự chồng chéo chồng chéo thời gian chạy là hầu như không thể. Hiệu suất cũng bị hút nhưng nó dễ dàng hơn để gỡ lỗi mà không có gdb/ddd. Tôi quyết định làm như thế này là thông dịch viên và giải quyết nó khi tôi đã đến giai đoạn trình biên dịch thực hiện (mà không bao giờ đã hoàn thành thường). – Deleted
Bạn dự định khởi động lại hoạt động hiện tại như thế nào? Lưu các điểm kiểm tra theo thời gian, sau đó khôi phục lại điểm tốt nhất (như thế nào?) –
@ n.m .: phần quan trọng của câu hỏi trong khía cạnh đó là "mã không có tác dụng phụ". Người hỏi là giả định một ngôn ngữ chức năng thuần túy, vì vậy không có trạng thái nào được sửa đổi. Không cần phải "lấy" một trạm kiểm soát, và khi bạn chuyển sang trạng thái trước đó, bạn không cần phải "hoàn tác" bất kỳ thay đổi nào vì ngôn ngữ không có khả năng thực hiện thay đổi. Về nguyên tắc, vị trí của bạn trong mã cho bạn biết mọi thứ bạn cần biết về trạng thái của chương trình. –