Tôi không có kế hoạch viết một trình biên dịch trong tương lai gần; Tuy nhiên, tôi khá hứng thú với các công nghệ biên dịch và làm thế nào công cụ này có thể được làm tốt hơn.
Bắt đầu với các ngôn ngữ được biên dịch, hầu hết các trình biên dịch có hai mức lỗi: cảnh báo và lỗi, đầu tiên là phần lớn thời gian không gây tử vong mà bạn nên sửa và các lỗi cho thấy hầu hết thời gian không thể tạo ra máy- (hoặc byte-) mã từ đầu vào.
Mặc dù, đây là một định nghĩa khá yếu. Trong một số ngôn ngữ như Java, một số cảnh báo đơn giản là không thể thoát khỏi mà không sử dụng lệnh @SuppressWarning
này. Ngoài ra, Java coi các vấn đề không nghiêm trọng nhất định là lỗi (ví dụ: mã không thể truy cập được trong Java gây ra lỗi vì một lý do tôi muốn biết).
C # không có cùng một vấn đề, nhưng nó có một vài vấn đề. Có vẻ như quá trình biên dịch xảy ra trong một số lần vượt qua và việc vượt qua thất bại sẽ khiến các đường chuyền tiếp theo không được thực thi. Do đó, số lỗi bạn nhận được khi bản dựng của bạn thất bại thường bị đánh giá thấp. Trong một lần chạy, nó có thể cho biết bạn có hai lỗi, nhưng một khi bạn sửa chúng, có thể bạn sẽ gặp 26 lỗi mới.
Việc đào sâu vào C và C ++ chỉ đơn giản cho thấy sự kết hợp tồi tệ trên các điểm yếu chẩn đoán biên dịch của Java và C # (mặc dù có thể chính xác hơn khi nói rằng Java và C # chỉ đi theo một nửa vấn đề). Một số cảnh báo thực sự phải là lỗi (ví dụ: khi không phải tất cả các đường dẫn mã đều trả về giá trị) và vẫn là cảnh báo bởi vì, tôi cho rằng, tại thời điểm họ viết tiêu chuẩn, công nghệ trình biên dịch không đủ tốt để tạo ra các loại này kiểm tra bắt buộc. Trong cùng một hướng, trình biên dịch thường kiểm tra nhiều hơn so với tiêu chuẩn nói, nhưng vẫn sử dụng mức lỗi cảnh báo "tiêu chuẩn" cho các phát hiện bổ sung. Và thông thường, trình biên dịch sẽ không báo cáo tất cả các lỗi mà họ có thể tìm thấy ngay lập tức; nó có thể mất một vài biên dịch để loại bỏ tất cả chúng. Chưa kể các lỗi khó hiểu về trình biên dịch C ++ muốn nhổ,
Bây giờ thêm rằng nhiều hệ thống xây dựng có thể cấu hình để báo cáo lỗi khi trình biên dịch phát ra cảnh báo, chúng tôi chỉ nhận được một hỗn hợp lạ: không phải tất cả các lỗi đều gây tử vong nhưng một số cảnh báo nên; không phải tất cả các cảnh báo đều xứng đáng nhưng một số được loại bỏ rõ ràng mà không đề cập thêm về sự tồn tại của chúng; và đôi khi tất cả các cảnh báo trở thành lỗi.
Các ngôn ngữ không được biên dịch vẫn có phần báo cáo lỗi nhảm nhí. Typose trong Python sẽ không được báo cáo cho đến khi mã thực sự được chạy và bạn không bao giờ có thể thực sự mắc nhiều lỗi một lần vì tập lệnh sẽ ngừng thực thi sau khi gặp mã.
PHP, về phía nó, có một loạt các mức độ lỗi ít nhiều đáng kể và các ngoại lệ. Các lỗi phân tích được báo cáo cùng một lúc, các cảnh báo thường rất tệ, họ nên hủy bỏ tập lệnh của bạn (nhưng không mặc định), các thông báo thực sự thường hiển thị các vấn đề logic nghiêm trọng, một số lỗi thực sự không đủ tệ để dừng tập lệnh của bạn nhưng vẫn và, như thường lệ với PHP, có một số điều thực sự kỳ lạ ở đó (tại sao chúng ta cần một mức độ lỗi cho các lỗi nghiêm trọng không thực sự gây tử vong?, E_RECOVERABLE_E_ERROR
tôi đang nói chuyện với bạn).
Dường như với tôi rằng mỗi lần thực hiện báo cáo lỗi trình biên dịch tôi có thể nghĩ là bị hỏng. Đó là một sự xấu hổ thực sự, vì làm thế nào tất cả các lập trình viên giỏi nhấn mạnh vào tầm quan trọng của việc xử lý lỗi một cách chính xác và chưa thể có các công cụ của riêng họ để làm như vậy.
Bạn nghĩ gì nên là cách đúng để báo cáo lỗi trình biên dịch?