Следующая таблица обобщает семантику присоединения изученных случаев:
| Тип цели x | Тип источника y | |
|---|---|---|
| Ссылочный | Развернутый | |
| Ссылочный | Ссылочное присоединение | Клонирование: эффект x := clone(y) |
| Развернутый | Копирование: эффект x.copy(y) Ошибка, если y - void | Копирование: эффект x.copy(y) |
Таблица 8.1. Эффект присоединения x:=y
Проверка эквивалентности
Семантика операций, проверяющих эквивалентность (
[x]. (E1) Если
[x]. (E2) Если
[x]. (E3) Если
Этот анализ дает желаемую интерпретацию равенства
| Тип цели x | Тип источника y | |
|---|---|---|
| Ссылочный | Развернутый | |
| Ссылочный | Ссылочное сравнение | equal(x,y) объектное сравнение, если x не void, иначе - false |
| Развернутый | equal(x,y) объектное сравнение, если y не void, иначе - false | equal(x,y) объектное сравнение |
Таблица 8.2.Семантика сравнения x=y
Сравнение таблиц 8.1 и 8.2 показывает совместимость присваивания и операций сравнения в упоминавшемся уже смысле. Напомним, в частности, что
Обсуждаемые проблемы возникают во всех языках, включающих ссылки и указатели, таких как Pascal, Ada, Modula-2, C, Lisp и другие. Они особенно актуальны для ОО-языков, в которых все создаваемые пользователем типы являются ссылочными. В дополнение к причинам, объясняемых в разделе обсуждения, в синтаксисе явно не отражается факт представления объектов ссылками, так что следует быть особо внимательными при проверке эквивалентности объектов.
Работа со ссылками: преимущества и опасности
В предыдущих разделах отмечалось, что два свойства модели времени выполнения заслуживают дополнительного внимания. Во-первых, важная роль ссылок. Во-вторых, двойственность семантики базовых операций (присваивания, передачи параметров, проверки на равенство), имеющих различный смысл для ссылок и развернутых операндов.
Динамические псевдонимы
Для
