Ngoài tất cả các câu trả lời tuyệt vời cho đến nay:
Bạn có một "thiên vị quan sát". Bạn không quan sát lỗi và do đó bạn cho rằng không có lỗi nào.
Tôi đã từng nghĩ như bạn. Sau đó, tôi bắt đầu viết trình biên dịch chuyên nghiệp, và để tôi nói với bạn, có rất nhiều lỗi trong đó!
Bạn không thấy các lỗi vì bạn viết mã giống như 99,999% của tất cả các phần còn lại của mã mà mọi người viết. Bạn có thể viết mã hoàn toàn bình thường, đơn giản, chính xác rõ ràng gọi các phương thức và chạy các vòng lặp và không làm bất cứ điều gì lạ mắt hoặc kỳ lạ, bởi vì bạn là một nhà phát triển bình thường giải quyết các vấn đề kinh doanh bình thường.
Bạn không thấy bất kỳ lỗi trình biên dịch nào vì các lỗi trình biên dịch không nằm trong các kịch bản mã thông thường đơn giản dễ phân tích; các lỗi nằm trong phân tích mã lạ mà bạn không viết.
Mặt khác, tôi có sự thiên vị quan sát ngược lại. Tôi thấy mã điên cả ngày mỗi ngày, và vì vậy với tôi các trình biên dịch dường như bị đầy lỗi.
Nếu bạn ngồi xuống với đặc tả ngôn ngữ của bất kỳ ngôn ngữ nào và thực hiện bất kỳ triển khai trình biên dịch nào cho ngôn ngữ đó và thực sự cố gắng xác định xem trình biên dịch có thực hiện chính xác thông số kỹ thuật đó hay không, tập trung vào các trường hợp góc tối, bạn sẽ sớm tìm thấy trình biên dịch lỗi khá thường xuyên. Để tôi cho bạn một ví dụ, đây là lỗi trình biên dịch C # tôi tìm thấy đúng năm phút trước.
static void N(ref int x){}
...
N(ref 123);
Trình biên dịch đưa ra ba lỗi.
- Một đối số ref hoặc out phải là một biến có thể gán.
- Kết quả phù hợp nhất cho N (ref int x) có đối số không hợp lệ.
- Thiếu "ref" trong đối số 1.
Rõ ràng thông báo lỗi đầu tiên là chính xác và thông báo lỗi thứ ba là một lỗi. Thuật toán tạo lỗi đang cố gắng tìm ra lý do tại sao đối số đầu tiên không hợp lệ, nó nhìn vào nó, thấy rằng đó là một hằng số và không quay lại mã nguồn để kiểm tra xem nó có được đánh dấu là "ref" hay không; thay vào đó, nó giả định rằng không ai đủ ngu ngốc để đánh dấu một hằng số là ref và quyết định rằng ref phải bị thiếu.
Không rõ thông báo lỗi thứ ba chính xác là gì, nhưng đây không phải là thông báo. Trong thực tế, không rõ liệu thông báo lỗi thứ hai có đúng hay không. Nên giải quyết quá tải không thành công, hay "ref 123" nên được coi là đối số ref của loại đúng? Bây giờ tôi sẽ phải suy nghĩ một chút và nói chuyện với nhóm xử lý để chúng tôi có thể xác định hành vi chính xác là gì.
Bạn chưa bao giờ thấy lỗi này bởi vì có lẽ bạn sẽ không bao giờ làm điều gì ngớ ngẩn đến mức cố gắng vượt qua 123 bằng ref. Và nếu bạn đã làm như vậy, có lẽ bạn sẽ không nhận thấy rằng thông báo lỗi thứ ba là vô nghĩa, vì thông báo đầu tiên là chính xác và đủ để chẩn đoán vấn đề. Nhưng tôi cố gắng làm những thứ như vậy, bởi vì tôi đang cố gắng phá vỡ trình biên dịch. Nếu bạn đã thử, bạn cũng sẽ thấy các lỗi.