OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 21 Июнь, 2025 06:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Интерфейс модуля
СообщениеДобавлено: Понедельник, 19 Март, 2007 14:38 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Имеем такой модуль
Код:
MODULE ModA;
TYPE
  P* = POINTER TO T;
  T = RECORD
    x*, y: INTEGER;
  END;
END ModA.

При этом к полю x по указателю типа P можно обратиться из другого модуля,
хотя в интерфейсе ModA этого x вообще нет:
Код:
DEFINITION ModA;
TYPE
  P = POINTER TO T;
END ModA.


А если так, то x появляется
Код:
MODULE ModA;
TYPE
  P* = POINTER TO RECORD
    x*, y: INTEGER;
  END;
END ModA.

Код:
DEFINITION ModA;
TYPE
  P = POINTER TO RECORD
    x: INTEGER
  END;
END ModA.


Наверное, в первом случае было бы лучше выдавать такой же
интерфейс, как и во втором. Все равно тип T недоступен и нет смысла
показывать его в интерфейсе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 19 Март, 2007 23:26 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В некотором смысле да.
Но тут такая политика, как и, к примеру, в файловой системе Линукса.
Если доступа к каталогу верхнего уровня нет, но знаем прямой путь до каталога, к которому доступ есть, то можем обратиться...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 20 Март, 2007 00:38 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
С видимостью типа T понятно. Но в первом случае поле x экспортируется
модулем, а в интерфейсе этого не видно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 20 Март, 2007 01:29 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну да, есть противоречивость в логике браузера...
Тут есть неоднозначности в трактовке того, что и как показывать.
На уровне фактического доступа всегда все нормально - доступ есть только к экспортированным сущностям.
Например, моя процедура получит входным параметром расширение некоторого типа, которое неэкспортировано. Но если у него есть поля с меткой экспорта, то через модуль Meta я смогу их считывать/записывать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re:
СообщениеДобавлено: Понедельник, 08 Октябрь, 2007 09:11 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Илья Ермаков писал(а):
Ну да, есть противоречивость в логике браузера...
Тут есть неоднозначности в трактовке того, что и как показывать.
На уровне фактического доступа всегда все нормально - доступ есть только к экспортированным сущностям.
...skip...


А я вот только что наткнулся на такую штуку - экспортированная процедура с сигнатурой (h: ViewHook) в Definition вообще не показывается. Easter egg какой-то :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re:
СообщениеДобавлено: Понедельник, 08 Октябрь, 2007 09:38 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
Иван Кузьмицкий писал(а):
А я вот только что наткнулся на такую штуку - экспортированная процедура с сигнатурой (h: ViewHook) в Definition вообще не показывается. Easter egg какой-то :)

В документации это описано.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re:
СообщениеДобавлено: Понедельник, 08 Октябрь, 2007 10:47 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Александр Ильин писал(а):
Иван Кузьмицкий писал(а):
А я вот только что наткнулся на такую штуку - экспортированная процедура с сигнатурой (h: ViewHook) в Definition вообще не показывается. Easter egg какой-то :)

В документации это описано.


Уточню для тех, кто придёт после меня: в документации к модулю DevBrowser.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Пятница, 12 Октябрь, 2007 12:01 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
PGR писал(а):
Имеем такой модуль
Код:
MODULE ModA;
TYPE
  P* = POINTER TO T;
  T = RECORD
    x*, y: INTEGER;
  END;
END ModA.

При этом к полю x по указателю типа P можно обратиться из другого модуля,
хотя в интерфейсе ModA этого x вообще нет:
Код:
DEFINITION ModA;
TYPE
  P = POINTER TO T;
END ModA.

Наверное, поэтому в Обероне и нельзя разделить модуль на 2 отдельных файла, как в Модуле: интерфейс и реализацию...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Пятница, 12 Октябрь, 2007 12:12 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Почему "нельзя"? Просто это файл интерфейса генерируется автоматически, компилятором (sym-файл). И открыть его в Блэкбоксе можно для просмотра.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Пятница, 12 Октябрь, 2007 22:50 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Да, генерируется автоматически и не содержит полной информации об экпортированных объектах модуля. Как написать полный текстовый DEFINITION MODULE для приведённого модуля реализации? По-моему, возможность экспортировать поля записи без экспорта самого типа записи делает это невозможным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Суббота, 13 Октябрь, 2007 00:12 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Полную информацию он содержит - иначе в Вашем примере компилятор не пропустил бы обращение к полю x через указатель (т.к. для компилятор IMPORT - это значит подключение именно символьного файла). Любой тип, косвенно задействованный в интерфейсе, автоматически включается в описание этого интерфейса. Но поскольку непосредственно он недоступен, то браузер его не показывает (настроен на показ только полностью экспортированных элементов).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Суббота, 13 Октябрь, 2007 01:35 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Неясно написал :oops: В смысле сгенерированное по sym-файлу текстовое представление не содержит полной информации, сам же sym-файл конечно содержит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Воскресенье, 14 Октябрь, 2007 00:18 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Насчёт неполноты информации в данном конкретном случае можно и поспорить. Добавление в сгенерированный текст типа T не представляется возможным, так как человек, читающий текст, решит, что тип экспортируется. А на самом деле это не так.

Более того, данный пример не имеет под собой реальной основы, что в данном случае имее особое значение. Ведь нормальный человек не станет давать своим переменным идентификаторы вида "dfgdsgd". А такое объявление
Код:
... POINTER TO ComplexDegree;
уже даёт представление о том, с чем нам придётся иметь дело. К тому же, в реальном примере будут ещё и экспортированные процедуры, принимающие в качестве параметра данный указатель, связанные процедуры. Это даст всю необходимую информацию для работы с типом. Вот и выходит, что сам тип и не нужен, да и скрыт он не для того, что бы усложнить жизнь программисту, а для того, чтобы её облегчить.

Если после всего этого всё-таки потребуется иметь сам тип, то стоит подумать о целесообразности дальнейшего использования данного модуля. Ведь, это значит, что тип надо обрабатывать вручную, так как в модуле для этого не хватает инструментов. Соответственно, нет особой надобности в модуле, не избавившем от заявленной сложности.

Но возвращаясь к утверждению, что модуль не разделяется на интерфейс и реализацию, хочу заметить: раз не отвергается существование sym-файла и наличия в нём экспорта модуля, "таки" придётся признать, что интерфейс и реализация разделены : ).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Воскресенье, 14 Октябрь, 2007 01:24 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Valery Solovey писал(а):
Более того, данный пример не имеет под собой реальной основы, что в данном случае имее особое значение. Ведь нормальный человек не станет давать своим переменным идентификаторы вида "dfgdsgd". А такое объявление
Код:
... POINTER TO ComplexDegree;
уже даёт представление о том, с чем нам придётся иметь дело. К тому же, в реальном примере будут ещё и экспортированные процедуры, принимающие в качестве параметра данный указатель, связанные процедуры. Это даст всю необходимую информацию для работы с типом. Вот и выходит, что сам тип и не нужен, да и скрыт он не для того, что бы усложнить жизнь программисту, а для того, чтобы её облегчить.

Но из всех этих процедур для работы с объектами данного типа мы не сможем узнать, чть оказывается можно обратиться к полю "x" такого объекта.

Valery Solovey писал(а):
Если после всего этого всё-таки потребуется иметь сам тип, то стоит подумать о целесообразности дальнейшего использования данного модуля. Ведь, это значит, что тип надо обрабатывать вручную, так как в модуле для этого не хватает инструментов. Соответственно, нет особой надобности в модуле, не избавившем от заявленной сложности.

Интересно, зачем тогда в Оберон введена возможность создавать скрытые типы с открытыми полями?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Воскресенье, 14 Октябрь, 2007 03:02 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Потому что с такими полями можно работать через метапрограммирование.
Положим, вашей процедуре передали какую-то запись. Вам глубоко параллельно, что это за запись, где она объявлена, и экспортирована ли сама. Но вы получите доступ к тем её полям, которые помечены как экспортированные.

Т.е. экспорта на всю запись нет - никто за пределами модуля не может использовать сам тип (т.е. объявлять его экземпляры), но работать с разрешёнными полями тех экземпляров, которые гуляют по системе от модуля-владельца - можно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Воскресенье, 14 Октябрь, 2007 09:07 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья Ермаков писал(а):
Потому что с такими полями можно работать через метапрограммирование.
Положим, вашей процедуре передали какую-то запись. Вам глубоко параллельно, что это за запись, где она объявлена, и экспортирована ли сама. Но вы получите доступ к тем её полям, которые помечены как экспортированные.

Т.е. экспорта на всю запись нет - никто за пределами модуля не может использовать сам тип (т.е. объявлять его экземпляры), но работать с разрешёнными полями тех экземпляров, которые гуляют по системе от модуля-владельца - можно.

А не нарушает ли это "герметичность" системы типов?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Воскресенье, 14 Октябрь, 2007 10:46 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Нет. У каждого элемента есть метка экспорта, т.е. разрешение или запрет доступа снаружи модуля (в том числе через метапрограммирование, если используется высокоуровневый интерфейс Meta, а не низкоуровневый Kernel, через который возможно всё). Я выше уже приводил пример - в Юниксе, если на папку нет доступа, но есть доступ на файл, то зная полный путь, к этому файлу можно обратиться. Так и тут.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Воскресенье, 14 Октябрь, 2007 15:12 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Илья Ермаков писал(а):
Потому что с такими полями можно работать через метапрограммирование.

C ними можно работать и напрямую:
Код:
IMPORT ModA;
PROCEDURE UseX;
VAR p: ModA.P;
BEGIN
  NEW(p);
  p.x := 10;
  Log.Int(p.x)
END UseX;

Если в BlackBox такие поля вообще не показываются, то в ETH Oberon ещё хуже: они показываются, но не там :(
Код:
MODULE ModA;
TYPE
  P* = POINTER TO T;
  Z* = POINTER TO RECORD END;
  T = RECORD x*, y: INTEGER END;
END ModA.

Код:
DEFINITION ModA;
TYPE
  P = POINTER TO T;
  Z = POINTER TO RECORD END;
    x: INTEGER
END ModA.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Воскресенье, 14 Октябрь, 2007 19:08 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
От себя хочу добавить такой момент. В документации модуля Integers:
Код:
TYPE Integer = POINTER;

Однако, если посмотреть интерфейс модуля, получим:
Код:
Integer = POINTER TO IntegerDesc;
где IntegerDesc - не экспортированный тип. Можно предположить, что швейцарцы сами до конца не определились с тем, что и как тут делать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейс модуля
СообщениеДобавлено: Понедельник, 15 Октябрь, 2007 01:27 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Geniepro писал(а):
Вот вам и "герметичная система типов" :о)))


А где здесь нарушается герметичность?
Герметичность в том, что к переменной (не прибегая к loop-holes) можно обратиться только в соответствии с ее типом.
Где именно это свойство не соблюдается?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB