OberonCore
https://forum.oberoncore.ru/

IMPORT и порядок инициализации
https://forum.oberoncore.ru/viewtopic.php?f=30&t=3544
Страница 1 из 1

Автор:  Rifat [ Пятница, 19 Август, 2011 17:24 ]
Заголовок сообщения:  IMPORT и порядок инициализации

Допустим есть модули:
Код:
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 определять порядок инициализации или нет?

Автор:  Сергей Губанов [ Пятница, 19 Август, 2011 18:04 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

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

  IMPORT A, B;

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

Автор:  igor [ Пятница, 19 Август, 2011 18:19 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

2Rifat
Думаю, что порядок загрузки (и инициализации) модулей A и B в Вашем примере не имеет значения.

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

Автор:  igor [ Пятница, 19 Август, 2011 18:35 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

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

Автор:  Илья Ермаков [ Пятница, 19 Август, 2011 18:38 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

Порядок в списке импорта не может гарантировать порядок загрузки, даже если бы нам этого захотелось.
Мы не застрахованы от того, что какой-то модуль ещё до нас загрузил модуль B, а мы так хотели загружать сначала A, потом B...

Автор:  Rifat [ Пятница, 19 Август, 2011 21:49 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

Если есть динамический загрузчик, то действительно сложно гарантировать порядок загрузки, так как модуль может быть уже загружен. Но что если динамического загрузчика нет, а есть только статическая линковка, как в XDS или Exaprog Oberon. Можно ли для случая статической линковки порядок инициализации задавать путем определенного порядка в секции IMPORT? Или же лучше отдельно предусмотреть возможность изменения порядке инициализации, без изменения исходного кода, то есть без изменения порядка следования модулей в секции IMPORT?

Автор:  Сергей Губанов [ Пятница, 19 Август, 2011 23:03 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

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

Автор:  Сергей Губанов [ Пятница, 19 Август, 2011 23:07 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

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

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

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

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

Автор:  Сергей Губанов [ Суббота, 20 Август, 2011 10:09 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

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

Автор:  Илья Ермаков [ Суббота, 20 Август, 2011 10:50 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

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


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

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

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

Автор:  Info21 [ Суббота, 20 Август, 2011 12:09 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

В Обероне "загрузка в момент вызова" означает в момент вызова команды пользователем. Из текста или из меню.

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

Автор:  Сергей Губанов [ Суббота, 20 Август, 2011 13:09 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

Проверил в ББ. Действительно загружает "статически". Приношу свои извинения.

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

Автор:  igor [ Суббота, 20 Август, 2011 16:57 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

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

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

Автор:  Илья Ермаков [ Суббота, 20 Август, 2011 18:04 ]
Заголовок сообщения:  Re: IMPORT и порядок инициализации

Сергей Губанов писал(а):
Перепутал с дотнетом.

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/