Điều cuối cùng chúng ta đang nói ở đây là thời gian biên dịch so với thời gian chạy.
Biên dịch lỗi thời gian, nếu bạn nghĩ về nó, cuối cùng sẽ giúp trình biên dịch có thể xác định những vấn đề bạn gặp phải trong chương trình trước khi nó chạy. Đây rõ ràng không phải là trình biên dịch "ngôn ngữ tùy ý", nhưng tôi sẽ sớm quay lại với nó. Trình biên dịch, trong tất cả sự khôn ngoan vô hạn của nó, tuy nhiên không liệt kê mọi vấn đề có thể được xác định bởi trình biên dịch. Điều này phụ thuộc một phần vào trình biên dịch được viết tốt như thế nào, nhưng lý do chính cho điều này là rất nhiều thứ được xác định khi chạy .
Lỗi thời gian chạy, như bạn đã quen thuộc với tôi chắc chắn như tôi, là bất kỳ loại lỗi nào xảy ra trong quá trình thực thi chương trình. Điều này bao gồm chia cho số không, ngoại lệ con trỏ null, vấn đề phần cứng và nhiều yếu tố khác.
Bản chất của lỗi thời gian chạy có nghĩa là bạn không thể lường trước các lỗi đã nói tại thời gian biên dịch. Nếu bạn có thể, họ gần như chắc chắn sẽ được kiểm tra tại thời điểm biên dịch. Nếu bạn có thể đảm bảo một số bằng 0 tại thời điểm biên dịch, thì bạn có thể thực hiện một số kết luận logic nhất định, chẳng hạn như chia bất kỳ số nào cho số đó sẽ dẫn đến lỗi số học gây ra bởi chia cho 0.
Như vậy, theo một cách rất thực tế, kẻ thù của chương trình đảm bảo hoạt động đúng của chương trình đang thực hiện kiểm tra thời gian chạy trái ngược với kiểm tra thời gian biên dịch. Một ví dụ về điều này có thể là thực hiện chuyển động sang loại khác. Nếu điều này được cho phép, bạn, lập trình viên, về cơ bản sẽ ghi đè khả năng của trình biên dịch để biết liệu đó có phải là điều an toàn không. Một số ngôn ngữ lập trình đã quyết định rằng điều này có thể chấp nhận được trong khi những ngôn ngữ khác ít nhất sẽ cảnh báo bạn vào thời gian biên dịch.
Một ví dụ điển hình khác có thể cho phép null là một phần của ngôn ngữ, vì ngoại lệ con trỏ null có thể xảy ra nếu bạn cho phép null. Một số ngôn ngữ đã loại bỏ hoàn toàn vấn đề này bằng cách ngăn chặn các biến không được khai báo rõ ràng để có thể giữ các giá trị null được khai báo mà không được gán ngay một giá trị (lấy ví dụ về Kotlin). Mặc dù bạn không thể loại bỏ lỗi thời gian chạy ngoại lệ con trỏ null, bạn có thể ngăn nó xảy ra bằng cách loại bỏ tính chất động của ngôn ngữ. Trong Kotlin, bạn có thể buộc khả năng giữ các giá trị null tất nhiên, nhưng không cần phải nói rằng đây là một "người mua hãy cẩn thận" ẩn dụ vì bạn phải nói rõ ràng như vậy.
Về mặt khái niệm, bạn có thể có một trình biên dịch có thể kiểm tra lỗi trong mọi ngôn ngữ không? Có, nhưng nó có thể sẽ là một trình biên dịch cồng kềnh và không ổn định, trong đó bạn nhất thiết phải cung cấp ngôn ngữ được biên dịch trước. Nó cũng không thể biết nhiều điều về chương trình của bạn, ngoài các trình biên dịch cho các ngôn ngữ cụ thể biết một số điều nhất định về nó, chẳng hạn như vấn đề tạm dừng như bạn đã đề cập. Hóa ra, rất nhiều thông tin có thể thú vị để tìm hiểu về một chương trình là không thể lượm lặt được. Điều này đã được chứng minh, vì vậy nó không có khả năng thay đổi bất cứ lúc nào sớm.
Trở về điểm chính của bạn. Phương pháp không tự động luồng an toàn. Có một lý do thực tế cho điều này, đó là các phương thức an toàn của luồng cũng chậm hơn ngay cả khi các luồng không được sử dụng. Rust quyết định rằng họ có thể loại bỏ các vấn đề thời gian chạy bằng cách làm cho luồng phương thức an toàn theo mặc định và đó là lựa chọn của họ. Nó đi kèm với một chi phí mặc dù.
Có thể về mặt toán học có thể chứng minh tính đúng đắn của một chương trình, nhưng sẽ là một lời cảnh báo rằng bạn sẽ có các tính năng thời gian chạy bằng không trong ngôn ngữ. Bạn sẽ có thể đọc ngôn ngữ này và biết những gì nó làm mà không có bất ngờ. Ngôn ngữ có thể trông rất toán học trong tự nhiên, và đó có thể không phải là ngẫu nhiên ở đó. Nhắc nhở thứ hai là lỗi thời gian chạy vẫn xảy ra, có thể không liên quan gì đến chính chương trình. Do đó, chương trình có thể được chứng minh là đúng, giả sử một loạt các giả định về máy tính của nó đang được chạy trên là chính xác và không thay đổi, trong đó tất nhiên luôn không xảy ra anyway và thường xuyên.