OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 21 Октябрь, 2021 16:51

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




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2020 11:19 
Модератор
Аватара пользователя

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

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

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

Предлагаю исправить эту проблему.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2020 12:34 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 512
Это было бы, кмк, весьма существенное изменение.
Илья Ермаков писал(а):
- контролька считается от полного имени сущности, включая имя модуля.

Интересно, чем руководствовались коллеги, когда принимали такое решение. Кажется, где-то была диссертация или фрагмент, описывающий фингерпринтинговый подход к раздельной компиляции, который был в итоге включен в СР2.

Илья Ермаков писал(а):
Это вставляет рогатки на разные случаи, когда динамически можно было бы заставить один модуль, совместимый по интерфейсам, выполнять роль другого и т.п.

А приведите, пож, конкретный пример, какую задачу вы решаете; чтобы точно вас понять. То, как вы описали - "один модуль, совместимый по интерфейсам, выполнять роль другого" - оч похоже на привычное решение с абстрактным интерфейсом в одном модуле и реализацией в другом.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2020 14:49 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4552
Откуда: Россия, Орёл
adimetrius писал(а):
Интересно, чем руководствовались коллеги, когда принимали такое решение.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2020 14:49 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4552
Откуда: Россия, Орёл
Илья Ермаков писал(а):
Предлагаю исправить эту проблему.

Давно пора.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2020 15:26 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1394
Вроде Texts.View и Forms.View надо различать. Или нет?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2020 16:23 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4619
Откуда: Россия, Орёл
Илья Ермаков писал(а):
Это вставляет рогатки на разные случаи, когда динамически можно было бы заставить один модуль, совместимый по интерфейсам, выполнять роль другого и т.п.
Это можно сделать через StdLoader, не трогая fingerprints. Загрузчик должен выбрать нужный кодовый файл.

Подписаться под тем, что имя модуля в отпечатке -- это ошибка, или что это идеальное решение, я не готов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2020 16:28 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4619
Откуда: Россия, Орёл
adimetrius писал(а):
Интересно, чем руководствовались коллеги, когда принимали такое решение. Кажется, где-то была диссертация или фрагмент, описывающий фингерпринтинговый подход к раздельной компиляции, который был в итоге включен в СР2.
Насколько я помню, там этот вопрос как проблема не рассматривался. Модуль в системе Оберон определяется именем. Решалась задача состыковки различных версий одного модуля.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2020 18:07 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9444
Откуда: Россия, Орёл
Trurl писал(а):
Вроде Texts.View и Forms.View надо различать. Или нет?


Так они разные. Фингерпринт считается от всей структуры их.

Фингерпринт сущности берётся от её имени сущности и структуры. Желательно оставить только СОБСТВЕННОЕ имя сущности, а не несущий её модуль.
Он нужен, чтобы проверить, что она не изменилась относительно ожиданий в момент компиляции.
Зачем вшивать в фингер имя модуля?
Это потом на простейшие и вполне вообразимые, полезные случаи задействования одного модуля вместо другого ставит "рогатку".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2020 18:40 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1394
Илья Ермаков писал(а):
Так они разные. Фингерпринт считается от всей структуры их.

Может и разные, но не обязательно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2020 19:04 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1394
Илья Ермаков писал(а):
Это вставляет рогатки на разные случаи, когда динамически можно было бы заставить один модуль, совместимый по интерфейсам, выполнять роль другого и т.п.

Вот интересно, в каком смысле он "совместимый по интерфейсам"?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 21 Декабрь, 2020 04:11 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3148
Сталкивался, что модуль не хотел использоваться, так как фингерпринт поменялся, и поэтому требовалась перекомпиляция клиента. Но как, Илья, ты хочешь подменить модуль без смены его имени? Он ведь импортирован в модуль клиент по имени?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 21 Декабрь, 2020 10:23 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 566
Откуда: Москва
В МультиОбероне реализована возможность создания кросс-платформенных модулей https://forum.oberoncore.ru/viewtopic.php?f=157&t=6629&p=113412#p113412, когда для одного имени модуля можно сделать несколько файлов реализации и использовать несколько вариантов загрузки для разных ОС, разрядности, бэкендов, и проч .


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 21 Декабрь, 2020 11:50 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9444
Откуда: Россия, Орёл
Trurl писал(а):
Илья Ермаков писал(а):
Это вставляет рогатки на разные случаи, когда динамически можно было бы заставить один модуль, совместимый по интерфейсам, выполнять роль другого и т.п.

Вот интересно, в каком смысле он "совместимый по интерфейсам"?


В КП вообще нет понятия "совместимый модуль", а совместимость через фингерпринты проверяется по каждой сущности.

Если я откомпилировал MyStrings и загрузчику говорю подгружать его вместо Strings, он по каждой использованной конкретным модулем-клиентом процедуре проверит совместимость.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 21 Декабрь, 2020 14:23 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1394
Вы просто пытаетесь использовать систему непредусмотренным способом. А когда она сопротивляется, объявляете это ошибкой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Декабрь, 2020 02:30 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 512
Илья Ермаков писал(а):

В КП вообще нет понятия "совместимый модуль", а совместимость через фингерпринты проверяется по каждой сущности.

Если я откомпилировал MyStrings и загрузчику говорю подгружать его вместо Strings, он по каждой использованной конкретным модулем-клиентом процедуре проверит совместимость.


Спасибо, так уже понятнее, что вы пытаетесь сделать.

Я не согласен, что учет имени модуля при расчете отпечатка (фингерпринта) - это концептуальная ошибка. И вот почему.

Язык предоставляет гарантии типовой совместимости. На уровне Сообщения и уровне исходных текстов это выглядит как некая абстрактная система правил и выводов.

Теоретически, можно сделать среду исполнения, в которой не будет никаких ocf/osf файлов, а компиляция будет производиться по требованию при загрузке модуля. Ничто в Сообщении этому не препятствует.

Однако это непроизводительно. Поэтому компилируют раз, используют (загружают) - многократно.

В такой среде возникает промежуточное представление (состояние) - машинный файл ocf. И вместе с ним - проблема рассинхронизации:

В момент времени t:
MODULE Exp; VAR p*: INTEGER; END Exp. -> Exp.ocf
MODULE Imp; IMPORT Exp; BEGIN Exp.p := 123456 END Imp. -> Imp.ocf


При компиляции Imp все требования Сообщения удовлетворены, Imp корректен.

Затем в момент времени t':
MODULE Exp'; VAR p*: POINTER TO ... END Exp'. -> Exp.ocf

Но в t' модуль Imp Не перекомпилируется. Imp.ocf по-прежнему считается корректным. Если он будет загружен, то среда не обеспечит гарантии безопасности, обещанные языком. Таким образом, среда должна проверять корректность модуля при загрузке, а не только при компиляции.

Чтобы проверить эту корректность, можно
А) перекомпилировать Imp. Но исходного текста может не оказаться под рукой, а может - он вообще не доступен (в силу лицензирования). Тогда можно
Б) Воспользоваться символьным файлом Imp - там достаточно сведений, чтобы проверить корректность сопряжения Imp и Exp. Но, во-первых, это довольно трудоемко (так казалось в середине 90х), а во-вторых, символьного файла тоже может не оказаться под рукой. Можно, конечно, сохранить символьную информацию в ocf, но это ж сколько байтов потребуется! (так казалось в 90х)
В) Можно "схитрить": в Imp.ocf записать датувремя или отпечаток от Exp.ocf. Тогда при загрузке Imp загрузчик увидит, что Finger(Exp'.ocf) # Imp.ocf.Finger(Exp.ocf), и откажет в загрузке. Придется перекомпилировать Imp. (Это отличается от А, поскольку там предлагалось перекомпилировать, чтобы проверить корректность; а в В приходится перекомпилировать, поскольку установлена некорректность).
ЕМНИП, так и было в системе Оберон. И в Модуле до Оберона.
Но это очень хлопотно: всамделе,
MODULE Exp''; VAR p*: INTEGER; VAR q: CHAR END Exp.
При таких изменениях загрузчик все равно откажется загружать Imp, придется перекомпилировать; но очевидно, что Imp можно и не перекомпилируя загружать, ведь изменения не коснулись того, от чего Imp зависел. (Даже если бы q была экспортирована)
Вот когда кому-то надоело по сто раз перекомпилировать пол-системы, он решил написать дипломную или диссер, и формализовать, что это за "очевидно" такое. И придумались отпечатки (фингерпринты) как средство более конкретного отслеживания рассинхронизации. Теперь среда оперирует фактами вида:
Модуль Imp импортирует Exp.p с отпечатком fp.
Модуль Exp экспортирует p с отпечатком fp.

Загрузчик проверяет соответствие и в случае несоответствия отказывает в загрузке. Теперь реже нужно перекомпилировать "вхолостую": среда "поумнела" и "понимает", что в случае Exp'' модуль Imp по-прежнему корректен.

Отмечу, что это - вовсе не контроль версий. И не контроль соответствия реализаций. Так, процедура Proc* может вообще получить другую реализацию в Exp', при этом ее отпечаток останется неизменным, и клиенты спокойно загрузятся.

Цель всей этой отпечатковой системы - обеспечить языковые гарантии безопасности и строгой типизации, только и всего. И сделать это производительно - без "втягивания" символьной информации и без проверки типизации при загрузке.

Поэтому я не согласен, что учет имени модуля при расчете отпечатка - это концептуальная ошибка.

Похоже, я согласен с Trurl, в том, что вы пытаетесь сделать то, на что среда не рассчитана. Вам, как я понял, нужно оперировать фактами вида
Модуль Cheat экспортирует p, которую можно использовать вместо Exp.p с отпечатком fp.
Таких фактов в ББ нигде нет. Но, если уж очень надо, то можно соорудить некий чит-тул, который будет на основе Cheat.ocf и Exp.ocf делать DoCheat.ocf, в котором машкоды будут из Cheat.ocf, а отпечатки из Exp.ocf. Так вы сможете на свой страх и риск обмануть штатный загрузчик. Он ведь не "вчитывается" в отпечатки, не удостоверяется в их корректности.

Либо - поскольку вы в загрузчиках уже разбирались и всякие чудесности вплоть до горячей замены делали - почему бы не сделать еще один загрузчик, который напрямую будет понимать факты
Вместо Exp следует использовать Cheat.

Но самым простым мне кажется следующее:
Вашу реализацию назвать по-честному Strings и разместить в Secondary directory (в рабочей папке ББ). Тогда загрузчик будет подгружать его вместо штатного Strings из primary directory.
(Вероятно, я чего-то еще не знаю в постановке задачи, из-за чего это не подходит?)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Декабрь, 2020 03:18 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2423
Откуда: Россия, Томск
Если имя модуля не включать в контрольную сумму типа, то очень многие типы могут внезапно стать неразличимыми.
Другое дело, что имя файла может отличаться от имени модуля. Тогда модуль Strings можно загрузить из файла Strings, MyStrings, MyStringsTestImpl, CustomStrings, и так далее.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Декабрь, 2020 07:11 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3148
Дмитрий Дагаев писал(а):
В МультиОбероне реализована возможность создания кросс-платформенных модулей https://forum.oberoncore.ru/viewtopic.php?f=157&t=6629&p=113412#p113412, когда для одного имени модуля можно сделать несколько файлов реализации и использовать несколько вариантов загрузки для разных ОС, разрядности, бэкендов, и проч .

Также и в Блэкбоксе можно ведь изначально, а Илья похоже совсем про другое. Чтобы модули с разными названиями можно было использовать для наследования и использования как будто это один и тот же интерфейс. Если это сделано через импорт, то это в целом невозможно. А если сделано как-то через Meta, то вроде там и проблемы такой нет. Нужен пример какой-то, чтобы понять, как вообще у Ильи возникает такая проблема. Илья, речь про эксперименты с горячей заменой, как вы рассказывали на конференции?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Декабрь, 2020 10:30 

Зарегистрирован: Вторник, 01 Март, 2011 09:34
Сообщения: 566
Откуда: Москва
Иван Денисов писал(а):
Также и в Блэкбоксе можно ведь изначально, а Илья похоже совсем про другое. Чтобы модули с разными названиями можно было использовать для наследования и использования как будто это один и тот же интерфейс.

Вот не хотелось бы, чтоб совсем про другое. Если менять одну на другую реализацию одного и того же модуля, то это правильно(fingerprints остается). А если произвольно менять модули и использовать только имя функции, то, согласитесь, что это не одно и то же:
Код:
Компилятор.Старт ~
С400.Старт ~


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Декабрь, 2020 10:40 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3148
Впечатляющий пример :)
Так что имя модуля всё же нужно оставить в "отпечатке", имхо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 23 Декабрь, 2020 12:00 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9444
Откуда: Россия, Орёл
В принципе, готов согласиться.

Имя модуля - это как бы имя сервиса, оно входит тоже в контракт своих сущностей.


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

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


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

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


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

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