Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
Динамическая модульность в ETH Oberon / OPCL https://zx.oberon.org/forum/viewtopic.php?f=15&t=156 |
Страница 1 из 1 |
Автор: | Len [ 15 ноя 2013, 13:46 ] |
Заголовок сообщения: | Динамическая модульность в ETH Oberon / OPCL |
В файле Program1.link указана строка S.Atan писал(а): Это запихивает оба модуля в одну программу Project.exe? А если я хочу сделать какой-то модуль связанным, а не внедрённым, т.е. чтобы он подгружался во время выполнения программы. Как делать такие связи между модулями? |
Автор: | Zorko [ 15 ноя 2013, 23:53 ] |
Заголовок сообщения: | Re: Часть третья. Быть или не быть? |
Очень хороший вопрос. Давайте разберёмся как устроена динамическая модульность в системе ETH Oberon (а заодно и в ETH PlugIn Oberon for Windows) и как её можно использовать с помощью OPCL. Закономерно, что не все модули ETH Oberon являются динамическими: ведь для того, чтобы загрузить модуль (из файла в память) нужно как минимум уже иметь средства для распределения памяти и работы с файлами. Поэтому модули Kernel и Files быть динамическими не могут и не должны, как и некоторые другие модули. Загрузчик ОС (или подсистема исполнения Windows PE - Portable Executables) загружает такие модули в память своими личными низкоуровневыми средствами (средствами вышележащей ОС или же, например, путём вызова прерываний BIOS или как-то ещё). Вобщем, примем как факт, что часть модулей спроектированы не для динамической загрузки и уже находятся в нашем распоряжении (в случае с Windows, которая не имеет в своём составе рантаймов для поддержки Оберон-окружения, такие модули могут быть вкомпилированы в целевой исполняемый файл). Мы можем без труда выяснить, что за динамическую загрузку и выгрузку модулей отвечает модуль Modules: Код: "OBERON"
Вот эта процедура: Код: "OBERON"
Процедура: Код: "OBERON"
Осталось понять как этим пользоваться. Я нашёл такой пример использования динамической загрузки в модуле ETHOberon/Src/Printer.Mod: Код: "OBERON"
Теперь далее. Я не рыл очень уж досконально потроха ETH Oberon, но полагаю, что в какой-то момент с помощью Modules.ThisMod загружается динамический инициализатор Оберон-системы, и он уже в свою очередь пользуется для загрузки/выгрузки модулей только этим механизмом (т.е. все последующие модули уже динамические). Теперь немножко о том как реализовывать свои плагины. Пишете модули с одинаковым интерфейсом. Папочкой для них будет абстрактный модуль-контейнер, экспортирующий виртуальную запись, в которой методами будут указатели. Реализации этого интерфейса будут импортировать контейнер (но не наоборот!). Инсталлятор реализаций будет инициализировать эту запись (подключать в абстрактный слот контейнера нужную реализацию, при необходимости подгружая соответствующий модуль). Совместимость интерфейсов гарантируется совместимостью типов виртуальной и реализованной записи. Если нужно расширение, унаследуем от этой записи и расширим её дополнительным функционалом. Примеры смотрите в BlackBox'е (SystemFiles и HostFiles, SystemDialog и HostDialog, и т.д.). В качестве теоретического материала советую главу "6. Загрузчик модулей" из книги "Разработка операционной системы и компилятора. Проект Oberon", стр. 183-197. |
Страница 1 из 1 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |