value-type, reference-type, pointer-type
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.10.04 09:55
Оценка: :)
value-type, reference-type, pointer-type

Решил вынести в отдельную ветку обсуждение вопроса о value-type, reference-type и pointer-type.

Начало там:
http://www.rsdn.ru/Forum/Message.aspx?mid=870069&only=1
Автор: VladD2
Дата: 27.10.04


В Java работа с объектами осуществляется через reference-type переменные. В C# для ускорения работы придумано хитрое средство под названием boxing/unboxing — упрятывает value-type в reference-type и обратно. И в том и в другом языке pointer-type если и есть, то этим термином названа "низкая" unsafe работа с адресами. Хотелось бы восстановить доброе имя pointer-type. Дело в том, что, например, в оберонах есть все три сорта типов value-type, reference-type и pointer-type, и все они совершенно безопасны (safe) и управляются сборщиком мусора.


TYPE
  ValueType = RECORD
    a: PointerType;
    b: ReferenceType;
  END;

  ReferenceType = POINTER TO RECORD
    a: PointerType;
    b: ReferenceType;
    c: ValueType;   
  END;

  PointerType = POINTER TO ValueType;


То есть, никакие хитрости boxing/unboxing не нужны если есть обыкновенный безопасный pointer-type управляемый сборщиком мусора. Отсюда нет дискредитации термина УКАЗАТЕЛЬ как чего-то низменного и недостойного safe кода. Указатель — это хорошо и не более опасно чем reference-type.

P.S.
Другое дело, что не надо путать два разных понятия УКАЗАТЕЛЬ и АДРЕС. Указатель — это одно, а адрес, адресное пространство и адресная арифметика — это совершенно другое.
Re: value-type, reference-type, pointer-type
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.10.04 10:27
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>
СГ>TYPE
СГ>  ValueType = RECORD
СГ>    a: PointerType;
СГ>    b: ReferenceType;
СГ>  END;

СГ>  ReferenceType = POINTER TO RECORD
СГ>    a: PointerType;
СГ>    b: ReferenceType;
СГ>    c: ValueType;   
СГ>  END;

СГ>  PointerType = POINTER TO ValueType;
СГ>

Из этого примера совершенно неясно, в чем семантическое отличие между PointerType и ReferenceType. Ну и если мы уж зашла речь об оберонах, то грех не вспомнить про untraced поинтеры, которые как раз небезопасны и сборщиком мусора не собираются.
СГ>То есть, никакие хитрости boxing/unboxing не нужны если есть обыкновенный безопасный pointer-type управляемый сборщиком мусора. Отсюда нет дискредитации термина УКАЗАТЕЛЬ как чего-то низменного и недостойного safe кода. Указатель — это хорошо и не более опасно чем reference-type.
От того, что ты назвал поинтером то, что в других языках называется ссылкой, её суть никак не изменилась. Boxing/Unboxing нужен не из-за того, что с указателями что-то не так.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: value-type, reference-type, pointer-type
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.10.04 10:45
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>
СГ>TYPE
СГ>  ValueType = RECORD
СГ>    a: PointerType;
СГ>    b: ReferenceType;
СГ>  END;

СГ>  ReferenceType = POINTER TO RECORD
СГ>    a: PointerType;
СГ>    b: ReferenceType;
СГ>    c: ValueType;   
СГ>  END;

СГ>  PointerType = POINTER TO ValueType;
СГ>


СГ>То есть, никакие хитрости boxing/unboxing не нужны если есть обыкновенный безопасный pointer-type управляемый сборщиком мусора.


Простой вопрос. Псевдокод
int* GetSomeData()
{
    int i = 3;
    return &i;
}

void Main()
{
    int* ip = GetSomeData();
    // 1
}

Куда в 1 будет указывать указатель ip?
... << RSDN@Home 1.1.4 beta 3 rev. 209>>
AVK Blog
Re[2]: value-type, reference-type, pointer-type
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.10.04 10:52
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Простой вопрос. Псевдокод

AVK>
AVK>int* GetSomeData()
AVK>{
AVK>    int i = 3;
AVK>    return &i;
AVK>}

AVK>void Main()
AVK>{
AVK>    int* ip = GetSomeData();
AVK>    // 1
AVK>}
AVK>

AVK>Куда в 1 будет указывать указатель ip?

Простой ответ, так делать нельзя:

Другое дело, что не надо путать два разных понятия УКАЗАТЕЛЬ и АДРЕС. Указатель — это одно, а адрес, адресное пространство и адресная арифметика — это совершенно другое.

Операция "&" — есть операция взятия адреса, таким образом, в Си/Си++ указатели и адреса это одно и тоже.
Re[2]: value-type, reference-type, pointer-type
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.10.04 10:57
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Сергей Губанов, Вы писали:


СГ>>
СГ>>TYPE
СГ>>  ValueType = RECORD
СГ>>    a: PointerType;
СГ>>    b: ReferenceType;
СГ>>  END;

СГ>>  ReferenceType = POINTER TO RECORD
СГ>>    a: PointerType;
СГ>>    b: ReferenceType;
СГ>>    c: ValueType;   
СГ>>  END;

СГ>>  PointerType = POINTER TO ValueType;
СГ>>

S>Из этого примера совершенно неясно, в чем семантическое отличие между PointerType и ReferenceType.

Например, если отдельно объявлен ValueType и PointerType, то, например, можно и два разных массива сделать массив значений (можно размещать на стеке) или массив указателей (динамическое размещение). А если объявлен только ReferenceType — то только с указателями можно работать, то есть только динамически размещать с помощью NEW, а на стеке нельзя.
Re[3]: value-type, reference-type, pointer-type
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.10.04 11:22
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Простой ответ, так делать нельзя:


. А смысл тогда в таких поинтерах?

СГ>

СГ>Другое дело, что не надо путать два разных понятия УКАЗАТЕЛЬ и АДРЕС. Указатель — это одно, а адрес, адресное пространство и адресная арифметика — это совершенно другое.

СГ>Операция "&" — есть операция взятия адреса, таким образом, в Си/Си++ указатели и адреса это одно и тоже.

Я же написал — ПСЕВДОКОД, а не С/С++. Воспринимай эту операцию как операцию получения указателя по значению. Никакой адресной арифметики.
... << RSDN@Home 1.1.4 beta 3 rev. 209>>
AVK Blog
Re[3]: value-type, reference-type, pointer-type
От: WolfHound  
Дата: 27.10.04 11:27
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Простой ответ, так делать нельзя:

СГ>

СГ>Другое дело, что не надо путать два разных понятия УКАЗАТЕЛЬ и АДРЕС. Указатель — это одно, а адрес, адресное пространство и адресная арифметика — это совершенно другое.

СГ>Операция "&" — есть операция взятия адреса, таким образом, в Си/Си++ указатели и адреса это одно и тоже.
ладно перепишу
int& GetSomeData()
{
    int i = 3;
    return i;
}

void Main()
{
    int& ip = GetSomeData();
    // 1
}

вопрос тотже.
... << RSDN@Home 1.1.4 rev. 185 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: value-type, reference-type, pointer-type
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.10.04 11:42
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>ладно перепишу


Все равно нельзя — ссылка из Си/Си++ очень переочень сильно замаскированный указатель, который все равно адрес.
Re[4]: value-type, reference-type, pointer-type
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.10.04 11:45
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>. А смысл тогда в таких поинтерах?


В том что отдельно объявлен тип-значение и отдельно объявлен указательный-тип. Стало быть, Вы можете на свое усмотрение создавать переменные и на стеке и в куче. А с ссылочным-типом Вы можете располагать объекты только в куче, а на стеке не можете.
Re[5]: value-type, reference-type, pointer-type
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.10.04 11:53
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

WH>>ладно перепишу


СГ>Все равно нельзя — ссылка из Си/Си++ очень переочень сильно замаскированный указатель, который все равно адрес.


Да при чем здесь С++ то? Хорошо, переформулирую на русский язык — куда будет указывать указатель после выхода из процедуры, если до выхода он указывал на локальную переменную value-типа?
... << RSDN@Home 1.1.4 beta 3 rev. 209>>
AVK Blog
Re[5]: value-type, reference-type, pointer-type
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.10.04 12:04
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

AVK>>. А смысл тогда в таких поинтерах?


СГ>В том что отдельно объявлен тип-значение и отдельно объявлен указательный-тип. Стало быть, Вы можете на свое усмотрение создавать переменные и на стеке и в куче. А с ссылочным-типом Вы можете располагать объекты только в куче, а на стеке не можете.


Ага, здорово. Вот только в дотнете с боксингом оно как то лучше выходит — я могу создавать ссылку на value-тип вне зависимости от того где он находится — в куче или в стеке. В чем кайф такого коцаного указателя я так и не понял. Для чего его использовать?
... << RSDN@Home 1.1.4 beta 3 rev. 209>>
AVK Blog
Re[6]: value-type, reference-type, pointer-type
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.10.04 12:11
Оценка: 7 (1)
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Сергей Губанов, Вы писали:


WH>>>ладно перепишу


СГ>>Все равно нельзя — ссылка из Си/Си++ очень переочень сильно замаскированный указатель, который все равно адрес.


AVK>Да при чем здесь С++ то? Хорошо, переформулирую на русский язык — куда будет указывать указатель после выхода из процедуры, если до выхода он указывал на локальную переменную value-типа?


Не существует способа заставить указывать указатель на размещенную на стеке локальную переменную value-типа. Переменные указательных типов создаются с помощью NEW, переменные value-типа создаются на стеке. Друг в друга уже размещенные в памяти переменные (заметьте, двух разных типов) по волшебству не превращаются. Можно лишь копировать содержимое одной в содержимое другой, т.к. содержимое у них устроено одинаково.
Re[6]: value-type, reference-type, pointer-type
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.10.04 12:14
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK> ...Для чего его использовать?


Ё-ё-ё-о-о-у-у-у.

Указатель на объект используют для того чтобы размещать объект в динамической памяти.
Re[7]: value-type, reference-type, pointer-type
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.10.04 12:25
Оценка: :))
Здравствуйте, Сергей Губанов, Вы писали:

AVK>> ...Для чего его использовать?


СГ>Ё-ё-ё-о-о-у-у-у.


СГ>Указатель на объект используют для того чтобы размещать объект в динамической памяти.


Т.е. если нет указателей, то разместить объект в динамической памяти нельзя? Йоуууу!!!
... << RSDN@Home 1.1.4 beta 3 rev. 209>>
AVK Blog
Re: value-type, reference-type, pointer-type
От: Кодт Россия  
Дата: 27.10.04 12:31
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

<>

Если я правильно уловил идею...
Имеются три квалификатора типа: "динамик", "аргумент-ссылка", "значение".
"Динамик" означает, что объект создан на куче, оператором new.
"Значение" — объект создан не оператором new. (Это или локальная переменная, или член-данное, или элемент массива значений).

При этом допускается конверсия
динамик|значение -> аргумент-ссылка
динамик|аргумент-ссылка -> значение (создаётся копия)
динамик|аргумент-ссылка|значение -> динамик (создаётся копия; только явным способом, вызов new)

То есть, снять квалификатор "динамик" можно, а повесить — нельзя.

В этом случае, оказывается невозможным возвращать указатели на временные объекты.
Одновременно, мы пожертвовали возможностью создавать связи с элементами структур/массивов.

Впрочем, мы можем обойтись: если известно, что некий элемент структуры (массива/записи) будет отдан на сторону, то объявим (и создадим) его динамическим.

Обратите внимание: квалификатор "динамик" можно давать любым типам, в том числе примитивным.
Задача боксинга переносится на стадию дизайна: хочешь отдавать что-то на сторону — изволь объявить.

Заодно упрощается сборка мусора: нет нужды отслеживать внешние указатели на элементы структуры.

Ещё один момент: такая схема усложняет реализацию множественного наследования.
Либо интерфейс / базовый подобъект не может быть квалифицирован как динамик, либо требуется прокси-объект типа "интерфейс" с квалификатором "динамик", держащий ссылку на объект целиком. Причём сам объект должен быть только динамическим (ведь ссылки на не-динамики заначивать невозможно).
Перекуём баги на фичи!
Re[8]: value-type, reference-type, pointer-type
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.10.04 12:35
Оценка: :)
Здравствуйте, AndrewVK, Вы писали:

AVK>Т.е. если нет указателей, то разместить объект в динамической памяти нельзя? Йоуууу!!!


Да, нельзя. А что, знаете способ?
Re[9]: value-type, reference-type, pointer-type
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.10.04 12:40
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

AVK>>Т.е. если нет указателей, то разместить объект в динамической памяти нельзя? Йоуууу!!!


СГ>Да, нельзя. А что, знаете способ?


Ага. Например тот что использует джава и дотнет.
... << RSDN@Home 1.1.4 beta 3 rev. 209>>
AVK Blog
Re[2]: value-type, reference-type, pointer-type
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.10.04 12:55
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Если я правильно уловил идею...


Есть еще парочка уточнений.

Например, в Component Pascal указатели могут быть не на любые типы, а только на RECORD или на ARRAY (Кстати, просто обычный ARRAY — это value-type, динамический ARRAY уже reference-type, но на обычный ARRAY можно объявить указатель и получить pointer-type).
TYPE
  ValueArray     = ARRAY 10, 10 OF INTEGER; 
  (* Матрица 10*10 размещаемая на стеке *)

  ReferenceArray = ARRAY OF AARAY OF INTEGER; 
  (* Двумерный динамический массив, точнее одномерный массив одномерных массивов *)

  PointerArray   = POINTER TO ARRAY 10, 10 OF INTEGER; 
  (* Матрица 10*10 размещаемая в динамической памяти *)

Что касается рассширения типов (то бишь, наследования), то тут квалификатор "POINTER TO", как бы, игнорируются, то есть то что базовый тип был ссылочным не мешает рассширение типа сделать типом-значением
Base = POINTER TO EXTENSIBLE RECORD
   (* ... *)
  END;

Derived = RECORD (Base)
   (* ... *)
  END;

Или наоборот:
Base = EXTENSIBLE RECORD
   (* ... *)
  END;

Derived = POINTER TO RECORD (Base)
   (* ... *)
  END;

"POINTER TO" — для расширения типов не имеет значения.
Re[10]: value-type, reference-type, pointer-type
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 27.10.04 12:59
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Сергей Губанов, Вы писали:


AVK>>>Т.е. если нет указателей, то разместить объект в динамической памяти нельзя? Йоуууу!!!


СГ>>Да, нельзя. А что, знаете способ?


AVK>Ага. Например тот что использует джава и дотнет.


Java и C# как раз и используют то что в терминологии оберонов называется POINTER TO RECORD, то есть refernce-type.
Re[11]: value-type, reference-type, pointer-type
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.10.04 13:11
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Java и C# как раз и используют то что в терминологии оберонов называется POINTER TO RECORD, то есть refernce-type.


Тогда что такое в твоем понимании указатель?
... << RSDN@Home 1.1.4 beta 3 rev. 209>>
AVK Blog
Re[12]: value-type, reference-type, pointer-type
От: _MarlboroMan_ Россия  
Дата: 27.10.04 13:19
Оценка: :)))
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Сергей Губанов, Вы писали:


СГ>>Java и C# как раз и используют то что в терминологии оберонов называется POINTER TO RECORD, то есть refernce-type.


AVK>Тогда что такое в твоем понимании указатель?


видимо это такая бяка, которая указывает на область памяти. и, видимо, эта бяка нифига не типизированная
... << RSDN@Home 1.1.4 beta 3 rev. 185>>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
Re[3]: value-type, reference-type, pointer-type
От: Кодт Россия  
Дата: 27.10.04 13:22
Оценка: +1
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Есть еще парочка уточнений.


СГ>Например, в Component Pascal указатели могут быть не на любые типы, а только на RECORD или на ARRAY (Кстати, просто обычный ARRAY — это value-type, динамический ARRAY уже reference-type, но на обычный ARRAY можно объявить указатель и получить pointer-type).


Вот это, имхо, не есть очень хорошо: оно только усложняет боксинг (приходится специально заворачивать примитивные типы в pointer to record).

СГ>Что касается рассширения типов (то бишь, наследования), то тут квалификатор "POINTER TO", как бы, игнорируются, то есть то что базовый тип был ссылочным не мешает рассширение типа сделать типом-значением

СГ>"POINTER TO" — для расширения типов не имеет значения.

Ну это уже особенности (бонусные фичи) языка... С равным успехом можно потребовать, что наследование происходит только от исходных, value-типов, а POINTER TO создаёт производный тип. Просто — больше писанины будет.

Кстати говоря, конструкция "POINTER TO" — по смыслу неграмотная, так как рассказывает о внутреннем представлении!
Да и без внутреннего представления:
  • Либо мы должны синтаксически по-разному работать с переменными типов T и pointer to T (например, явно разыменовывать указатели, в отличие от значений/ссылок),
  • Либо, если синтаксис одинаков (а семантика различается лишь в инициализации/копировании) — называть типы схожим образом. Что-то в стиле "shared record..." Здесь спецификатор "shared" выглядит как определение, а не как самостоятельная сущность.
  • Перекуём баги на фичи!
    Re[12]: value-type, reference-type, pointer-type
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 27.10.04 13:32
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, Сергей Губанов, Вы писали:


    СГ>>Java и C# как раз и используют то что в терминологии оберонов называется POINTER TO RECORD, то есть refernce-type.


    AVK>Тогда что такое в твоем понимании указатель?


    Сказка про белого бычка. Серия восемьдесят восьмая.

    Указатель — это такая специальная переменная, которая может быть связана с объектом размещенным в динамической памяти, а может быть и не связана ни с каким объектом, в этом случае ее значение равно константе называемой NIL (или null). Если эта переменная, все таки связана с объектом размещенным в динамической памяти, то доступ к этому объекту можно получить разыменовывая указатель (причем, операция разыменования практически всегда прозрачна для программиста, то есть выражения p.f() и v.f() выглядят одинаково не смотря на то что p — переменная указательного или ссылочного типа, а v — переменная value-типа).

    Кроме того, указательными и ссылочными переменными управляет сборщик мусора и может менять их фактическое значение, но так как для программы их фактическое значение не доступно (а доступен лишь объект с которыми они связаны), то эта деятельность сборщика мусора для программы не заметна.
    Re[13]: value-type, reference-type, pointer-type
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 27.10.04 13:36
    Оценка:
    Здравствуйте, _MarlboroMan_, Вы писали:

    _MM_> и, видимо, эта бяка нифига не типизированная


    Как это бяка и как это не типизированная?

    На счет бяки в следующий раз, а на этот раз про типизацию, написано же
    TYPE
      Val = RECORD (*... *) END;
      Ptr = POINTER TO Val;

    Переменные типа Ptr могут ссылаться только на объекты типа Val.
    Re[4]: value-type, reference-type, pointer-type
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 27.10.04 13:42
    Оценка:
    Здравствуйте, Кодт, Вы писали:

    К>Кстати говоря, конструкция "POINTER TO" — по смыслу неграмотная, так как рассказывает о внутреннем представлении!


    Почему рассказывает о внутреннем представлении? Она говорит лишь о том где размещается объект: на стеке или в динамической памяти. И в том и в другом случае объект одинаково внутри устроен.
    Re: оффтопик
    От: Кодт Россия  
    Дата: 27.10.04 13:53
    Оценка: +2
    Здравствуйте, Сергей Губанов

    Дисклаймеры:
    1. Прости за оффтопик.
    2. Это не наезд.

    У меня сложилось впечатление, что ты во что бы ни стало хочешь научить людей языку Оберон. Особенно — апологетов С++, C#, Java.
    Причём не просто пацанов, которые от a^=b^=a^=b кипятком писают. А людей, практикующих за деньги и достаточно долго.
    Соответственно, глубина практических и философских знаний о предмете (как языке, так и программировании в целом) у них достаточно велика.
    Поэтому битва "фанатизм против фанатизма" обречена на провал.
    Оберон не настолько имеет преимущества перед другими языками, что ради него все всё бросят. Да ещё и закидают...

    Форум же не зря называется "Философия программирования". Здесь есть смысл исследовать парадигмы.
    Если какой-то язык хорошо приспособлен для некоей парадигмы или паттерна — это замечательно. Если на другом языке то же самое делается с бОльшими усилиями — ну по крайней мере понятна цена.
    Говорить же "X крут, а Y,Z,T перед ним сынки" это несерьёзно. Просто ты наживаешь себе врагов на ровном месте.
    Перекуём баги на фичи!
    Re[13]: value-type, reference-type, pointer-type
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 27.10.04 13:53
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Указатель — это такая специальная переменная, которая может быть связана с объектом размещенным в динамической памяти, а может быть и не связана ни с каким объектом, в этом случае ее значение равно константе называемой NIL (или null). Если эта переменная, все таки связана с объектом размещенным в динамической памяти, то доступ к этому объекту можно получить разыменовывая указатель (причем, операция разыменования практически всегда прозрачна для программиста, то есть выражения p.f() и v.f() выглядят одинаково не смотря на то что p — переменная указательного или ссылочного типа, а v — переменная value-типа).


    Тогда чем переменная указательного типа отличается от переменной ссылочного типа?
    ... << RSDN@Home 1.1.4 beta 3 rev. 209>>
    AVK Blog
    Re[14]: value-type, reference-type, pointer-type
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 27.10.04 14:15
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, Сергей Губанов, Вы писали:


    СГ>>Указатель — это такая специальная переменная, которая может быть связана с объектом размещенным в динамической памяти, а может быть и не связана ни с каким объектом, в этом случае ее значение равно константе называемой NIL (или null). Если эта переменная, все таки связана с объектом размещенным в динамической памяти, то доступ к этому объекту можно получить разыменовывая указатель (причем, операция разыменования практически всегда прозрачна для программиста, то есть выражения p.f() и v.f() выглядят одинаково не смотря на то что p — переменная указательного или ссылочного типа, а v — переменная value-типа).


    AVK>Тогда чем переменная указательного типа отличается от переменной ссылочного типа?


    Эти переменные функционально ничем не отличаются. Вот только одновременно их быть не может, ведь тип может быть либо указательным либо ссылочным, но не может быть и тем и тем одновременно. То есть либо мы пишем так:
    TYPE
      Gadget = POINTER TO GadgetDesc; (* pointer-type *)
    
      GadgetDesc = RECORD             (* value-type *)  
        (* ... *)
      END;

    Либо мы сразу пишем так:
    TYPE
      Gadget = POINTER TO RECORD      (* reference-type *)
        (* ... *)
      END;

    Но мы не можем написать и так и сяк одновременно. Первый случай отличается от второго тем, что мы можем размещать переменные GadgetDesc на стеке или в массиве-значений (в том случае если нам это вдруг зачем-то надо, конечно).
    Re[2]: оффтопик
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 27.10.04 14:23
    Оценка:
    Здравствуйте, Кодт, Вы писали:

    К> хочешь научить людей языку Оберон


    Прошу рассматривать мои сообщения как: "Обзор философии программирования на языках Oberon-family".
    Re[5]: value-type, reference-type, pointer-type
    От: Кодт Россия  
    Дата: 27.10.04 14:25
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    К>>Кстати говоря, конструкция "POINTER TO" — по смыслу неграмотная, так как рассказывает о внутреннем представлении!


    СГ>Почему рассказывает о внутреннем представлении? Она говорит лишь о том где размещается объект: на стеке или в динамической памяти. И в том и в другом случае объект одинаково внутри устроен.


    Потому что она говорит ясным английским языком: "это не сам объект, это указатель на запись". А то, что и к записи, и к указателю на запись применяются одинаковые синтаксические конструкции (например, доступ к членам — var.field, ptr.field) — только привносит бардак в голову.

    Вот если бы мы говорили о "personal record" vs "shared record", то внутреннее представление действительно было бы убрано с глаз долой.



    Наконец, есть ещё один хитрый момент — это передача указателя в процедуру по ссылке. Как ни крути, а здесь разница бросится в глаза.
    type
      Rec = record x:integer end;
      Ptr = pointer to Rec; {если Оберон это не позволяет - унаследуем от Rec}
    
    procedure Change0(    v: Rec) begin v.x := 0 end;
    procedure Change1(var v: Rec) begin v.x := 1 end;
    procedure Change2(    v: Ptr) begin v.x := 2 end;
    procedure Change3(var v: Ptr) begin v.x := 3 end;
    procedure Change4(var v: Ptr) begin v := new Ptr; v.x := 4 end;
    
    var
      r: Rec;
      p,q: Ptr;
    begin
      r.x := -1;
      Change0(r); {r.x = -1}
      Change1(r); {r.x = 1}
    
      p := new Ptr; p.x := -1;
      q := p;
      Change0(p); {p.x = -1}
      Change1(p); {p.x = 1}
      Change2(p); {p.x = 2}
      Change3(p); {p.x = 3}
      Change4(p); {p.x = 4, q.x=3}
    end;

    Таки да, это был указатель, то есть нечто вторичное по отношению к самому объекту.

    Как элемент не тождественен списку элементов, так и объект не тождественен паре указатель-объект. И никакие заклинания не спасают.
    Перекуём баги на фичи!
    Re[15]: value-type, reference-type, pointer-type
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 27.10.04 14:35
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Эти переменные функционально ничем не отличаются.


    Значит получается что в СР есть две сущности с одинаковыми функциями?

    СГ> Вот только одновременно их быть не может, ведь тип может быть либо указательным либо ссылочным, но не может быть и тем и тем одновременно. То есть либо мы пишем так:

    СГ>
    СГ>TYPE
    СГ>  Gadget = POINTER TO GadgetDesc; (* pointer-type *)
    
    СГ>  GadgetDesc = RECORD             (* value-type *)  
    СГ>    (* ... *)
    СГ>  END;
    СГ>

    СГ>Либо мы сразу пишем так:
    СГ>
    СГ>TYPE
    СГ>  Gadget = POINTER TO RECORD      (* reference-type *)
    СГ>    (* ... *)
    СГ>  END;
    СГ>

    СГ>Но мы не можем написать и так и сяк одновременно. Первый случай отличается от второго тем, что мы можем размещать переменные GadgetDesc на стеке или в массиве-значений (в том случае если нам это вдруг зачем-то надо, конечно).

    Понятно. Но не думаю что это намного логичнее и проще боксинга.
    ... << RSDN@Home 1.1.4 beta 3 rev. 209>>
    AVK Blog
    Re[6]: value-type, reference-type, pointer-type
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 27.10.04 14:43
    Оценка:
    Здравствуйте, Кодт, Вы писали:

    К>Потому что она говорит ясным английским языком: "это не сам объект, это указатель на запись". А то, что и к записи, и к указателю на запись применяются одинаковые синтаксические конструкции (например, доступ к членам — var.field, ptr.field) — только привносит бардак в голову.


    Это из-за того что var.field — безопасная операция, а ptr.field — потенциально опасная операция, т.к. ptr может быть равен NIL? В этом смысле, действительно, не помешало бы эту потенциальную опасность как-то выразить синтаксически чтобы лишний раз напоминать программисту о том что он делает.

    К>Наконец, есть ещё один хитрый момент — это передача указателя в процедуру по ссылке. Как ни крути, а здесь разница бросится в глаза.


    Естественно.
    Re[16]: value-type, reference-type, pointer-type
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 27.10.04 14:47
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, Сергей Губанов, Вы писали:


    СГ>>Эти переменные функционально ничем не отличаются.


    AVK>Значит получается что в СР есть две сущности с одинаковыми функциями?


    С точки зрения CP есть только одна сущность — "POINTER TO".
    Re[3]: оффтопик
    От: buriy Россия http://www.buriy.com/
    Дата: 28.10.04 06:45
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Здравствуйте, Кодт, Вы писали:


    К>> хочешь научить людей языку Оберон


    СГ>Прошу рассматривать мои сообщения как: "Обзор философии программирования на языках Oberon-family".


    Но ты не даешь обзор. Ты не производишь сравнений с другими языками. Ты только показываешь примеры из Оберона, и не говоришь больше ничего. Приходится все доделывать другим товарищам... Исправляйся.
    /bur
    Re[4]: оффтопик
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 28.10.04 08:00
    Оценка:
    Здравствуйте, buriy, Вы писали:

    B>Здравствуйте, Сергей Губанов, Вы писали:


    СГ>>Здравствуйте, Кодт, Вы писали:


    К>>> хочешь научить людей языку Оберон


    СГ>>Прошу рассматривать мои сообщения как: "Обзор философии программирования на языках Oberon-family".


    B>Но ты не даешь обзор. Ты не производишь сравнений с другими языками. Ты только показываешь примеры из Оберона, и не говоришь больше ничего. Приходится все доделывать другим товарищам... Исправляйся.


    Да, у меня закралась идейка написать что-то вроде обзорной статьи, сейчас ее обдумываю...
    Re: value-type, reference-type, pointer-type
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 28.10.04 23:00
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Хотелось бы восстановить доброе имя pointer-type.


    На этом месте я плякаль... нет я риидаль...
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[4]: value-type, reference-type, pointer-type
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 28.10.04 23:00
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Я же написал — ПСЕВДОКОД, а не С/С++. Воспринимай эту операцию как операцию получения указателя по значению. Никакой адресной арифметики.


    А в С++, кстати, тоже не будет адресов. Тоже типа "безопасный" поинтер.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[9]: value-type, reference-type, pointer-type
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 28.10.04 23:01
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Да, нельзя. А что, знаете способ?


    Ага. Боксинг!
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[3]: value-type, reference-type, pointer-type
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 28.10.04 23:01
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Кстати, просто обычный ARRAY — это value-type, динамический ARRAY уже reference-type, но на обычный ARRAY можно объявить указатель и получить pointer-type).


    О! То что нужно. Тогда объяви, плиз, обычный ARRAY как локальную переменную функции, получи указатель, и возврати его из функции.

    Кстати, pointer-type можно инкрементить?
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: value-type, reference-type, pointer-type
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 29.10.04 08:21
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, AndrewVK, Вы писали:


    AVK>>Я же написал — ПСЕВДОКОД, а не С/С++. Воспринимай эту операцию как операцию получения указателя по значению. Никакой адресной арифметики.


    VD>А в С++, кстати, тоже не будет адресов. Тоже типа "безопасный" поинтер.



    int* p = &a[5];
    if ( *(p - 1) == a[4] ) Console::WriteLine(S"Vlad2 не прав");


    "p — 1" — это адресная арифметика, в Си/Си++ указатели и адреса есть одно и тоже.
    Re[4]: value-type, reference-type, pointer-type
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 29.10.04 08:28
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>О! То что нужно. Тогда объяви, плиз, обычный ARRAY как локальную переменную функции, получи указатель, и возврати его из функции.

    VD>Кстати, pointer-type можно инкрементить?

    Подобные хаки в оберонах невозможны. Так как в них нет понятия адресного пространства.

    С указателем возможны только две операции:

    1) p := q — привоение значения одного указателя другому (по правилам преобразования типов, естественно)
    2) NEW(p) — размещение нового объекта в динамической памяти (соответствующего типа, естественно)

    Получение и инкремент указателя возможно только когда УКАЗАТЕЛЬ и АДРЕС есть одно и тоже, а в оберонах адресов нет.
    Re[2]: value-type, reference-type, pointer-type
    От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
    Дата: 29.10.04 08:31
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Здравствуйте, Сергей Губанов, Вы писали:


    СГ>>Хотелось бы восстановить доброе имя pointer-type.


    VD>На этом месте я плякаль... нет я риидаль...


    Если Вам нечего сказать по существу, то не пишите.

    P. S.
    Есть на RSDN модераторы в конце-концов?
    Re[6]: value-type, reference-type, pointer-type
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 29.10.04 16:58
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>"p — 1" — это адресная арифметика, в Си/Си++ указатели и адреса есть одно и тоже.


    Ну, можно сказать что это будет "арифметика указателей", так как с реальными адресами мы тут дела не имеем.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[3]: value-type, reference-type, pointer-type
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 29.10.04 16:58
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>>>Хотелось бы восстановить доброе имя pointer-type.


    VD>>На этом месте я плякаль... нет я риидаль...


    СГ>Если Вам нечего сказать по существу, то не пишите.


    А я по существу. Я тоже хочу востановить доброе имя.

    СГ>P. S.

    СГ>Есть на RSDN модераторы в конце-концов?

    Думаешь они тебя забанят?
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: value-type, reference-type, pointer-type
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 29.10.04 16:58
    Оценка:
    Здравствуйте, Сергей Губанов, Вы писали:

    СГ>Получение и инкремент указателя возможно только когда УКАЗАТЕЛЬ и АДРЕС есть одно и тоже, а в оберонах адресов нет.


    Ну, а к целому привести и обратно? Какой смысл иначе получат указатели на массивы?
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.