Alexey Veselovsky писал(а):
"доступны динамически" лично я интерпретировал, как: мы имеем право получить доступ к тому чего небыло на этапе компиляции. Т.е. мы можем сказать LoadModule("MyModule")
С чего вы взяли LoadModule? Там говорится скорее о FindModule("MyModule"). "Доступны динамически" не новые модули, которых не было в момент компиляции, а информация о доступных на момент исполнения модулях.
Alexey Veselovsky писал(а):
Т.о. про метаинформацию нет ничего (кроме разве что имен модулей (а эта метаинформация может быть просто в имени файла модуля) и сигнатур процедур-команд), зато про загрузку модулей есть вполне:
Цитаты хорошие, только надо внимательно читать. Во-первых, про метаинформацию там есть (meta information), во-вторых:
Цитата:
If necessary, this may cause modules to be loaded.
Может будут загружены, а может и не будут - в зависимости от реализации. Слово "may" означает "может", а не "должен". Отдельно проговорено, что в случае встроенных систем никакой загрузки ожидать не приходится, т.е. это возможность дополнительная. А основная возможность, как я и говорю, - в том, чтобы получить ссылку на модуль по имени, если модуль с таким именем присутствует (в памяти или, если есть динамический загрузчик, на диске), а потом уже найти там по имени нужную команду или экспортированный тип.
Смотрим на реализаицю XDS. Напомню, что в XDS только статическая линковка. Описание модуля oberonRTS.
PROCEDURE Search(name: ARRAY OF CHAR): Module;
(* Returns a module by its name or nullModule. *)
PROCEDURE ThisCommand(m: Module; name: ARRAY OF CHAR): Command;
(* Returns the command (parameterless procedure) named "name" in the module m or NIL, if the command does not exist. *)
Пример кода (только что накидал, не компилировал):
Код:
PROCEDURE RunCmd* (modName, cmdName: ARRAY OF CHAR);
VAR
mod: oberonRTS.Module;
cmd: oberonRTS.Command; (* TYPE Command = PROCEDURE (); *)
BEGIN
mod := oberonRTS.Search (modName);
IF mod # oberonRTS.nullModule THEN
cmd := oberonRTS.ThisCommand (mod, cmdName);
IF cmd # NIL THEN
cmd (); (* Выполняем найденную команду *)
END
END
END RunCmd;
RunCmd ('MyModule', 'MyCmd'); (* Выполнится MyModule.MyCmd при условии, что модуль MyModule прилинкован и содержит экспортированную процедуру MyCmd без параметров. Тот, кто вызывает RunCmd не обязан импортировать MyModule ни прямо, ни косвенно. Вот это и есть "retrievable dynamically", не путайте с "loadable dynamically". *)