OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 15:45

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




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: IMPORT и порядок инициализации
СообщениеДобавлено: Пятница, 19 Август, 2011 17:24 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Допустим есть модули:
Код:
MODULE A;

BEGIN
  (* что-то инициализируем *)
END A.

MODULE B;

BEGIN
  (* что-то инициализируем *)
END B.

(* Главный модуль *)
MODULE C;

  IMPORT A, B;

BEGIN
  (* что-то инициализируем *)
END C.

Допустим, я хочу сделать утилиту, которая автоматически сформирует списки в каком порядке модули будут компилироваться и линковаться. Для этого надо построить DAG (directed acyclic graph) и линеаризовать его. Но линеаризовать его можно несколькими способами. Возможно, что разработчик хотел, чтобы модуль B инициализировался до модуля A, но список импорта составил в алфавитном порядке. Тогда, ему нужно предоставить возможность, изменить порядок линковки и соотвественно порядок инициализации модулей. А можно сделать чтобы порядок линковки и инициализации определялся однозначно, по порядку перечисления модулей в секции IMPORT.

Кто как считает должен ли порядок перечисления модулей в секции IMPORT определять порядок инициализации или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Пятница, 19 Август, 2011 18:04 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Rifat писал(а):
Кто как считает должен ли порядок перечисления модулей в секции IMPORT определять порядок инициализации или нет?
Не должен. Порядок загрузки модулей выясняется только в процессе работы программы. В следующем примере один из модулей А или В вообще не будет загружен в завивсимости от погоды на Марсе:
Код:
MODULE C;

  IMPORT A, B;

BEGIN
  ЕСЛИ температура на Марсе больше критической ТОГДА
    A...
  ИНАЧЕ
    B...
  КОНЕЦ
END C.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Пятница, 19 Август, 2011 18:19 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
2Rifat
Думаю, что порядок загрузки (и инициализации) модулей A и B в Вашем примере не имеет значения.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Пятница, 19 Август, 2011 18:35 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Губанов писал(а):
Порядок загрузки модулей выясняется только в процессе работы программы. В следующем примере один из модулей А или В вообще не будет загружен в завивсимости от погоды на Марсе: ...
В Вашем примере модули А и В будут оба загружены и проинициализированы ДО того как будет проинициализирован модуль С и станет известна температура на Марсе.


Последний раз редактировалось igor Пятница, 19 Август, 2011 18:46, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Пятница, 19 Август, 2011 18:38 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Пятница, 19 Август, 2011 21:49 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Если есть динамический загрузчик, то действительно сложно гарантировать порядок загрузки, так как модуль может быть уже загружен. Но что если динамического загрузчика нет, а есть только статическая линковка, как в XDS или Exaprog Oberon. Можно ли для случая статической линковки порядок инициализации задавать путем определенного порядка в секции IMPORT? Или же лучше отдельно предусмотреть возможность изменения порядке инициализации, без изменения исходного кода, то есть без изменения порядка следования модулей в секции IMPORT?


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
igor писал(а):
Сергей Губанов писал(а):
Порядок загрузки модулей выясняется только в процессе работы программы. В следующем примере один из модулей А или В вообще не будет загружен в завивсимости от погоды на Марсе: ...
В Вашем примере модули А и В будут оба загружены и проинициализированы ДО того как будет проинициализирован модуль С и станет известна температура на Марсе.
Это с какого бодуна? В моём примере загрузка динамическая.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Rifat писал(а):
Можно ли для случая статической линковки порядок инициализации задавать путем определенного порядка в секции IMPORT?
В случае статической линковки надо создать отдельный документ-проект-для-линкера в котором прописать все линкуемые модули в нужном порядке. Его и скормить линковщику. А на порядок объявления модулей в секциях ИМПОРТ внимания не обращать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Суббота, 20 Август, 2011 05:48 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Сергей Губанов писал(а):
igor писал(а):
Сергей Губанов писал(а):
Порядок загрузки модулей выясняется только в процессе работы программы. В следующем примере один из модулей А или В вообще не будет загружен в завивсимости от погоды на Марсе: ...
В Вашем примере модули А и В будут оба загружены и проинициализированы ДО того как будет проинициализирован модуль С и станет известна температура на Марсе.
Это с какого бодуна? В моём примере загрузка динамическая.
Динамическая или нет, но загрузка и инициализация используемых модулей производится ДО загрузки и инициализации использующего. Вот если бы они у вас в примере НЕ БЫЛИ перечислены в секции IMPORT, а загружались вручную какими-нибудь командами LoadModule, тогда от погоды на Марсе действительно зависел бы состав и/или порядок загружаемых модулей.

Иначе по-вашему получается, что загрузка модуля производится при первом обращении к нему. Но ведь загрузка производится при загрузке того, кто указал его в секции IMPORT.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Суббота, 20 Август, 2011 10:09 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Александр Ильин писал(а):
Иначе по-вашему получается, что загрузка модуля производится при первом обращении к нему.
Именно так устроена динамическая загрузка. Вы Блэкбоксом вообще что ли ни разу не пользовались? Попробуйте, увидите. Надо этот пункт вывесить в FAQ.
Александр Ильин писал(а):
Но ведь загрузка производится при загрузке того, кто указал его в секции IMPORT.
Это не динамическая, а статическая. Так было в Турбо Паскалях, Дельфях и наверное в XDS.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Суббота, 20 Август, 2011 10:50 
Модератор
Аватара пользователя

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


Простите, Сергей, Вы путаете!
Да, загрузка модуля верхнего уровня производится при первом ДИНАМИЧЕСКОМ обращении к нему (вызвали команду и т.д., что в конечном счёте сводится к обращению к модулю через Meta и Kernel.ThisMod, которая уже смотрит, есть модуль или надо загружать).
Но дальше при загрузке этого модуля вступает в права загрузчик StdLoader - и он действует просто: анализирует список импорта загружаемого модуля и ДО его загрузки загружает все ещё не загруженные из его списка импорта (и так рекурсивно). Т.е. к моменту появления в памяти некоторого модуля все из его списка импорта загружены загрузчиком.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Суббота, 20 Август, 2011 11:01 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Сергей Губанов писал(а):
Александр Ильин писал(а):
Но ведь загрузка производится при загрузке того, кто указал его в секции IMPORT.
Это не динамическая, а статическая.
Значит, терминология слишком расплывчатая. То, что вы описываете, я бы скорее назвал "ленивой" загрузкой, наподобие ленивых вычислений в функциональных языках. Такой режим загрузки не поддерживает ни одна из известных мне реализаций Оберона.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Суббота, 20 Август, 2011 12:09 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
В Обероне "загрузка в момент вызова" означает в момент вызова команды пользователем. Из текста или из меню.

Это где-то явно прописано в документации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Суббота, 20 Август, 2011 13:09 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Проверил в ББ. Действительно загружает "статически". Приношу свои извинения.

Перепутал с дотнетом. Там статические конструкторы (ближайший аналог загрузки модуля) вызываются при первом обращении.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Суббота, 20 Август, 2011 16:57 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Rifat писал(а):
Можно ли для случая статической линковки порядок инициализации задавать путем определенного порядка в секции IMPORT?
Технически это конечно возможно. Но лично я бы не стал этого делать. Порядок загрузки любых двух модулей в Оберонах и так уже определён отношениями импорта-экспорта этих модулей: импортируемый модуль должен быть проинициализирован раньше импортирующего модуля. Новое правило, про которое Вы спрашиваете, легко может вступить в противоречие с уже существующим правилом, которое я только что напомнил.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: IMPORT и порядок инициализации
СообщениеДобавлено: Суббота, 20 Август, 2011 18:04 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Сергей Губанов писал(а):
Перепутал с дотнетом.

Что я сразу и заподозрил :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

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


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

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


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

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