Tập 40: Compiler biết nói thật hơn — Diagnostics tôn trọng người dùng
Trong những ngày đầu tiên của dự án, khi parser hay checker của DUY gặp lỗi, nó chỉ in ra một thông báo ngắn ngủi: "Syntax error" hoặc "Type mismatch". Đối với một lập trình viên đang cố gắng học một ngôn ngữ mới, những thông báo kiểu đó không khác gì một lời đuổi khách kiêu ngạo. Nó bắt họ phải tự mò mẫm trong hàng trăm dòng code để đoán xem compiler đang không hài lòng ở đâu.
Sprint 40 đặt ra một mục tiêu quan trọng: compiler phải học cách nói thật và nói rõ.
Error[E0012]: Use of moved value 'buffer'
--> src/main.duy:12:8
|
8 | let buffer = make_buffer();
| ------ value moved here
...
12 | read(buffer);
| ^^^^^^ value used here after move
Hiện thực hóa diagnostics có cấu trúc đòi hỏi compiler phải bảo tồn thông tin vị trí (source spans) xuyên suốt toàn bộ pipeline. Từ lexer, parser, checker cho đến IR, mỗi nút AST và mỗi lệnh IR đều phải mang theo DNA của nó: chỉ số file, số dòng, số cột của đoạn source code ban đầu.
Khi xảy ra lỗi, diagnostics engine sử dụng thông tin này để trích xuất dòng code vi phạm, in kèm khung ngữ cảnh (code frames), vẽ các dấu trỏ chính xác dưới token lỗi, và hiển thị các mã lỗi (error codes) được chuẩn hóa để người dùng có thể tra cứu tài liệu.
Việc này ngốn rất nhiều bộ nhớ và làm phức tạp các cấu trúc dữ liệu của compiler. Nhưng đó là chi phí bắt buộc phải trả để thể hiện sự tôn trọng với lập trình viên. Khi tôi nhìn thấy một thông báo lỗi đầu tiên được vẽ đẹp đẽ trên terminal, chỉ ra chính xác dòng code tôi gõ nhầm và gợi ý giải pháp sửa đổi, tôi biết rằng DUY đã vượt qua ranh giới của một công cụ nghiên cứu cá nhân. Nó đã bắt đầu có linh hồn của một sản phẩm chuyên nghiệp, sẵn sàng đồng hành cùng các lập trình viên trên những chặng đường gian nan phía trước.

Bình luận (0)
Đang tải bình luận...