Trước khi giải quyết danh tính, hãy xác định ý nghĩa của chúng ta bằng cách bình đẳng chính xác hơn một chút. Chúng tôi nói hai điều là bằng nhau khi và chỉ khi chúng tôi không thể phân biệt chúng (xem: Danh tính của những người không hiểu biết ). Điều đó có nghĩa là việc hai thứ có bằng nhau hay không phụ thuộc vào phương tiện chúng ta phải kiểm tra chúng.
Chúng ta hãy nghĩ về điều đó nhiều hơn trong các điều khoản lập trình. Chúng ta hãy để những định kiến của chúng ta ở cửa và giả sử chúng ta đang làm việc trong một ngôn ngữ hoàn toàn mới, trong đó tất cả các biến và giá trị là bất biến. Theo định nghĩa ở trên, hai giá trị A
và B
bằng nhau khi và chỉ khi không có chương trình nào trong ngôn ngữ mang lại kết quả khác nhau khi A
được sử dụng thay thế B
hoặc ngược lại. Giả sử A
và B
là (IEEE 754) nổi và khi được thay thế vào biểu thức _ + 1.0
, kết quả là 1.0
cho cả hai A
và B
. Chắc chắn A
và B
đều bằng không. Họ có bằng nhau không? Điều đó phụ thuộc - ngôn ngữ có cung cấp bất kỳ chức năng nào cho phép tôi xác định dấu của số không? Nếu không, chúng bằng nhau; nếu có, họ có thể không.
Vì vậy, hai giá trị bằng nhau bất cứ khi nào chúng cho cùng một kết quả cho tất cả các kết hợp hoạt động có thể có mà chúng hỗ trợ. Các giá trị bất biến nói riêng không tạo ra các kết quả khác nhau tùy thuộc vào hoạt động nào trước đây được áp dụng cho chúng. Vì lý do đó, chúng tôi không quan tâm nếu hai biến chỉ đến hai bản sao có cùng giá trị hoặc nếu cả hai đều trỏ đến cùng một bản sao.
Điều này có liên quan gì đến tính đột biến? Khả năng tương tác ngụ ý ngôn ngữ của chúng ta có một số khái niệm về một ô nhớ có nội dung có thể bị ghi đè. Giả sử chúng ta thêm hỗ trợ cho các ô nhớ có thể thay đổi vào ngôn ngữ của mình:
ref <value>
tạo một ô nhớ mới , khác biệt với tất cả các ô khác, được khởi tạo <value>
.
<variable> := <value>
ghi đè lên nội dung của một ô tham chiếu.
!<variable>
trả về giá trị hiện được lưu trữ trong một ô tham chiếu.
Bây giờ hãy nghĩ về sự bình đẳng có nghĩa là gì đối với các ô nhớ. Giả sử A = ref 0
và B = A
. Hãy xem xét chương trình này:
A := 1
print(!_)
Thay thế trống cho A
bản in 1
, và thay thế cho B
bản in 1
là tốt. Bây giờ giả sử A = ref 0
và B = ref 0
. Trong trường hợp này, thay thế vào chương trình in trên 1
và 0
, kể từ bây giờ A
và B
trỏ đến các ô nhớ khác biệt.
Vì vậy, vấn đề đối với chúng ta là hai tham chiếu trỏ đến cùng một ô nhớ hay các ô nhớ khác nhau. Vì vấn đề đó, sẽ rất hữu ích khi có một cách hiệu quả và chung để phân biệt hai tài liệu tham khảo. Phương pháp hiện tại của chúng tôi để so sánh các giá trị họ nắm giữ và nếu chúng biến đổi bằng nhau thì một trong số chúng gây rắc rối vì một số lý do:
- Nó phụ thuộc vào việc có thể so sánh các giá trị được lưu trữ trong các ô nhớ cho sự bằng nhau. Bình đẳng không có ý nghĩa đối với tất cả các loại - ví dụ, nói chung, nó vô nghĩa đối với các hàm, bởi vì không có phương pháp chung nào để xác định xem hai hàm chưa biết có bằng nhau hay không (điều này đang xâm nhập vào lãnh thổ Vấn đề). Vì vậy, đưa ra hai tham chiếu đến các hàm lưu trữ các ô nhớ, chúng ta không thể so sánh các hàm mà chúng giữ cho bằng nhau.
- Nó phụ thuộc vào việc có một số giá trị mà chúng ta có thể gán cho một trong hai tham chiếu. Vì vậy, ngay cả khi sự bình đẳng có ý nghĩa đối với tất cả các loại trong ngôn ngữ, chúng ta vẫn cần quyền truy cập vào một giá trị cho từng loại mà chúng ta muốn so sánh. Điều gì xảy ra nếu xây dựng một giá trị của loại đó có tác dụng phụ?
- Giá trị tham chiếu mà chúng ta sử dụng để thay đổi một trong các tham chiếu phải khác với giá trị mà ô nhớ đã có, vì vậy chúng ta thực sự cần hai giá trị.
- Mã để so sánh các tham chiếu của các loại khác nhau sẽ trông chính xác cùng một lưu cho hai giá trị chúng tôi sử dụng.
- Chúng tôi cần sao lưu và khôi phục giá trị của tài liệu tham khảo mà chúng tôi thay đổi để tránh thay đổi ý nghĩa của chương trình.
Vì vậy, sẽ hữu ích cho ngôn ngữ khi cung cấp một thao tác để kiểm tra trực tiếp nếu hai tham chiếu trỏ đến cùng một ô nhớ có thể thay đổi. Hàm như vậy là vô nghĩa đối với các giá trị bất biến; Trên thực tế, tôi muốn nói rằng nó hoàn toàn có hại. Nếu có một cách để biết liệu hai 1
s được lưu trữ ở những nơi khác nhau trong bộ nhớ, thì có thể có các chương trình quan tâm liệu tôi có vượt qua cái này 1
hay cái kia không. Tôi thực sự không muốn lo lắng về việc liệu tôi có "quyền 1
" hay không; toán học là đủ khó như nó là! Vì vậy, rõ ràng rằng việc có thể kiểm tra sự bình đẳng bộ nhớ chủ yếu hữu ích cho các loại có thể thay đổi.