2015-02-08 21 views
8

Đọc basic introduction:Tại sao Rust kiểm tra các giới hạn mảng khi chạy, khi nào (hầu hết) các kiểm tra khác xảy ra tại thời gian biên dịch?

If you try to use a subscript that is not in the array, you will get an error: array access is bounds-checked at run-time.

Tại sao giới hạn mảng Rust kiểm tra trong thời gian chạy, khi có vẻ như hầu hết các kiểm tra khác xảy ra tại thời gian biên dịch?

+0

bản sao có thể có của [Tại sao trình biên dịch Rust cho phép lập chỉ mục ngoài giới hạn?] (Http://stackoverflow.com/questions/24898579/why-does-rust-compiler-allow-index-out-of-bounds) – Shepmaster

Trả lời

17

Vì việc kiểm tra chỉ mục tại thời điểm biên dịch là không khả thi. Lý do về các giá trị có thể có của các biến tùy ý là ở đâu đó giữa cứng và không thể ngay cả đối với các chương trình nhỏ. Không ai muốn phải:

  1. chính thức chứng minh rằng chỉ số không thể nằm ngoài giới hạn, và
  2. mã hóa mà bằng chứng vào loại hệ thống

... cho mỗi đơn slice/Vec/etc. truy cập. Vì đó là những gì bạn phải làm để thực hiện kiểm tra giới hạn tại thời gian biên dịch. Về cơ bản, bạn cần nhập văn bản phụ thuộc. Ngoài việc có thể làm cho việc kiểm tra kiểu không thể xác định được (và nhận được một chương trình kiểm tra kiểu khó hơn), kiểu suy luận trở thành không thể nói chung (và bị hạn chế nhiều hơn trong trường hợp tốt nhất), các kiểu phức tạp hơn và dài dòng hơn, và sự phức tạp của ngôn ngữ tăng lên đáng kể. Các chỉ số đó nằm trong giới hạn chỉ có thể được chứng minh mà không cần nỗ lực lập trình bổ sung đáng kể trong các trường hợp rất đơn giản.

Hơn nữa, có rất ít động lực để thoát khỏi kiểm tra giới hạn. Thời gian sống kéo trọng lượng của họ bằng cách loại bỏ hoàn toàn nhu cầu thu gom rác thải --- đó là một tính năng rất lớn, xâm lấn với thông lượng không lường trước được, không gian và độ trễ. Kiểm tra giới hạn thời gian chạy là rất không xâm lấn, có một chi phí nhỏ và nổi tiếng, và có thể được chọn lọc trong các phần quan trọng về hiệu năng ngay cả khi toàn bộ phần còn lại của chương trình sử dụng nó một cách tự do.

+1

Đó là một phạm vi để đề xuất kiểm tra giới hạn thời gian chạy là "rất không xâm lấn". Tác động sẽ liên quan đến sự phức tạp của các thuật toán đang hoạt động trên mảng. Đối với các biện pháp như thời gian chạy, về cơ bản việc thêm kiểm tra giới hạn trên mỗi truy cập mảng là một hệ số không đổi. – Rob

+0

@Rob Một yếu tố không đổi về thời gian chạy của một số thao tác không bao giờ thay đổi độ phức tạp của thuật toán. Nó có thể rất tốt có tác động không thể chấp nhận trong thời gian chạy (không tiệm cận). Nhưng * như tôi đã nói *, đối với bất kỳ truy cập mảng nào, lập trình viên có thể chọn không tham gia kiểm tra giới hạn, và nếu có, hiệu suất tương đương với C. Kiểm tra giới hạn không ảnh hưởng đến bất kỳ phần nào của chương trình không sử dụng nó. Và * rằng * là những gì tôi có ý nghĩa bởi không xâm lấn (tôi đề cập đến tác động hiệu suất ở những nơi khác trong cùng một câu.) – delnan

+1

Tôi đã không đề nghị sẽ có bất kỳ sự thay đổi phức tạp về thuật toán. Có thể chọn không tham gia tính năng thời gian chạy không làm cho tính năng này không xâm lấn. – Rob

Các vấn đề liên quan