Автор Тема: [Oberon-07/11] RECORD&POINTER export.  (Прочитано 12344 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
[Oberon-07/11] RECORD&POINTER export.
« : Сентябрь 04, 2013, 11:21:23 am »
В Oberon-report'e этот момент не уточнен (и вообще никак не описан), поэтому предлагаю обсудить, уточнить и договориться.

Итак, ситуация следующая - модуль A экспортирует указатель на структурный тип A.R, но сам A.R не экспортирует. Может ли модуль B импортирующий A.R создать в куче переменную типа A.R?

Код:
MODULE A;
TYPE
 R = RECORD END;
 P* = POINTER TO R;
END A.

MODULE B;
IMPORT A;
VAR
 p : A.P;
BEGIN
 NEW(p)
END B.
Технически мы это можем без проблем. Но в некоторых реализациях такое вот может быть не возможно, кроме того, если такое разрешить, то по сути мы лишаемся возможности создавать opaque-типы простым способом. Кроме того возникает логическое противоречие - почему то локальную переменную мы завести не можем, а переменную через NEW уже можем.

Поэтому предлагаю следующее:
1) Если импортирован только указательный тип, то с указателем можно делать все что обычно, но нельзя NEW. То есть новых экземпляров типа R пользователь заводить не может нигде.

2) Если импортирован еще и сам структурный тип (record or array), то создавать экземпляры (через NEW или иначе) можно, а доступ есть к тем полям которые экспортированны (помечены звездочкой), можно КОПИРОВАТЬ экземпляры (statement ":="). При этом конечно возможна ситуация когда тип экспортирован, но ни одного поля не экпортированно. Увы :-)

Ну и наконец есть особый случай, который тоже неоднозначен, и про который в репорте нет ничего:
MODULE A;
TYPE
 P* = POINTER TO RECORD foo* : INTEGER END;
END A.

MODULE B;
IMPORT A;
VAR
 p : A.P;
BEGIN
 NEW(p); (* это можно? *)
 p.foo := 42 (* а это? *)
END B.
Экспортирован тип-указатель на анонимную запись, причем у этой записи есть экспортированные поля. Таким образом переменную типа этой самой записи пользователь создать не может. Но, очевидно, он может обратиться к полю. Но может ли он создать через NEW новый экземпляр таковой безымянной записи?

Предлагаю создание экземпляра через NEW, в этом случае, также запретить. Таким образом у нас получается возможность создавать типы переменные которых могут создаваться ТОЛЬКО через фабрики (где они будут гарантированно инициализированны корректно), но при этом остается возможность прямого обращения к некоторым полям. (кроме того, опять таки, это логично, что если я не могу создать локальную переменную, то и через NEW тоже не могу её создать).

Как-то так. Какие будут мнения?
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #1 : Сентябрь 04, 2013, 11:51:32 am »
В Oberon-report'e этот момент не уточнен (и вообще никак не описан), поэтому предлагаю обсудить, уточнить и договориться.

Итак, ситуация следующая - модуль A экспортирует указатель на структурный тип A.R, но сам A.R не экспортирует. Может ли модуль B импортирующий A.R создать в куче переменную типа A.R?

Не могу согласиться с этим утверждением:

Цитата: Oberon07.Report
4. Declarations and scope rules
...
The scope rule has the following amendments:

1. If a type T is defined as POINTER TO T1 (see 6.4), the identifier T1 can be declared textually following the declaration of T, but it must lie within the same scope.

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

Экспорт какой-либо сущности -- это по сути расширение области видимости этой сущности на другие модули (через квалифицированный импорт), а значит, экспортироваться должен не только тип, указывающий на запись/массив, но и сами эти запись/массив...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #2 : Сентябрь 04, 2013, 11:53:10 am »
Поля записи, отмеченные знаком экспорта, должны быть доступны через экспортированный тип указателя на эту запись, независимо от того, экспортирован тип записи или нет, именован или нет.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #3 : Сентябрь 04, 2013, 11:57:49 am »
В Oberon-report'e этот момент не уточнен (и вообще никак не описан), поэтому предлагаю обсудить, уточнить и договориться.

Итак, ситуация следующая - модуль A экспортирует указатель на структурный тип A.R, но сам A.R не экспортирует. Может ли модуль B импортирующий A.R создать в куче переменную типа A.R?

Не могу согласиться с этим утверждением:

Цитата: Oberon07.Report
4. Declarations and scope rules
...
The scope rule has the following amendments:

1. If a type T is defined as POINTER TO T1 (see 6.4), the identifier T1 can be declared textually following the declaration of T, but it must lie within the same scope.

Как видно, тут написано, что тип, на который указывает указательный тип, должен быть видимым в той области видимости, где находится сам этот указательный тип.
Тут говорится о валидности объявлений (declaration, процесса объявления новых типо), я же говорю и спрашиваю о экспорте и импорте. То есть не про объявления, это разные понятия.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #4 : Сентябрь 04, 2013, 12:01:12 pm »
Ну и наконец есть особый случай, который тоже неоднозначен, и про который в репорте нет ничего:
MODULE A;
TYPE
 P* = POINTER TO RECORD foo* : INTEGER END;
END A.

А вот, похоже, экспортировать указатели на анонимные записи вряд ли можно.
Но тогда, по аналогии, нельзя экспортировать и указатели на процедуры?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #5 : Сентябрь 04, 2013, 12:04:36 pm »
Тут говорится о валидности объявлений (declaration, процесса объявления новых типо), я же говорю и спрашиваю о экспорте и импорте. То есть не про объявления, это разные понятия.

В оберонах модификатор экспорта -- это часть декларации. Так в чём проблема-то?
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #6 : Сентябрь 04, 2013, 12:06:19 pm »
Ну и наконец есть особый случай, который тоже неоднозначен, и про который в репорте нет ничего:
MODULE A;
TYPE
 P* = POINTER TO RECORD foo* : INTEGER END;
END A.

А вот, похоже, экспортировать указатели на анонимные записи вряд ли можно.
Но тогда, по аналогии, нельзя экспортировать и указатели на процедуры?
Ну, во первых указателей на процедуры в Обероне нет, есть лишь процедурные типы (пофиг как оно реализуется технически).

Во-вторых, почему нельзя? Процитированное тобою имеет несколько иные акценты:
Цитировать
1. If a type T is defined as POINTER TO T1 (see 6.4), the identifier T1 can be declared textually
following the declaration of T
, but it must lie within the same scope.
То есть это исключение из правил, то есть правило (1) введено для того, чтобы ослабить требования объявлений сверху-внизу для указателей. Всего лишь.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #7 : Сентябрь 04, 2013, 12:07:06 pm »
Тут говорится о валидности объявлений (declaration, процесса объявления новых типо), я же говорю и спрашиваю о экспорте и импорте. То есть не про объявления, это разные понятия.

В оберонах модификатор экспорта -- это часть декларации. Так в чём проблема-то?
На тип этот модификатор никак не влияет. То есть не входит в сигнатуру.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #8 : Сентябрь 04, 2013, 12:23:00 pm »
Ну, во первых указателей на процедуры в Обероне нет, есть лишь процедурные типы (пофиг как оно реализуется технически).

А, да, процедурные типы же без указателей объявляются, так что всё нормально тут... Вроде бы...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #9 : Сентябрь 04, 2013, 12:27:36 pm »
Поля записи, отмеченные знаком экспорта, должны быть доступны через экспортированный тип указателя на эту запись, независимо от того, экспортирован тип записи или нет, именован или нет.
Исходя из этого, объявить переменную типа экспортированный указатель на не экспортированную или безымянную запись и создать экземпляр он может, иначе полная бессмыслица получится.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #10 : Сентябрь 04, 2013, 12:29:51 pm »
Исходя из этого, объявить переменную типа экспортированный указатель на не экспортированную или безымянную запись и создать экземпляр он может, иначе полная бессмыслица получится.

Это будет аналогией экземпляра класса сишарпа -- в куче создать можно, а на стеке -- нет...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #11 : Сентябрь 04, 2013, 12:34:24 pm »
Это будет аналогией экземпляра класса сишарпа -- в куче создать можно, а на стеке -- нет...
Мы и говорим про указатель

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #12 : Сентябрь 04, 2013, 12:40:48 pm »
Это будет аналогией экземпляра класса сишарпа -- в куче создать можно, а на стеке -- нет...

Мы и говорим про указатель

Блекбоксёры постоянно ставят в достоинство КП то, что в нём записи можно создавать не только в куче, но и на стеке, в отличие от Явы, где все объекты создаются только на куче.
Этим они объясняют высокую производительность свой шины сообщений.

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

Так что с точки зрения оберонщиков такой экспорт лишён смысла...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

DddIzer

  • Гость
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #13 : Сентябрь 04, 2013, 12:43:14 pm »
Лично моя позиция - не запрещено + имеет смысл = разрешено.

DddIzer

  • Гость
Re: [Oberon-07/11] RECORD&POINTER export.
« Ответ #14 : Сентябрь 04, 2013, 12:53:37 pm »
 "за сценой", дополнительно - не  забудьте
1. Вирт и так ограничил по максимуму язык
2. Мы не имеем четкого представления куда идет эта реализация
3. УЖЕ получается не совсем то, что хотелось (в частности , строгости и непротиворечивости).
4. Любое ограничение уменьшает выгоду от простоты языка и накладывает трудно прогнозируемые ограничения на область использования
5. Мы пока еще неспособны аргументировать введение ограничений на хорошем уровне.