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. |
Автор: | Сергей Губанов [ Суббота, 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/ |