Автор Тема: [BlackBox] Динамическая выгрузка/загрузка.  (Прочитано 23926 раз)

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #45 : Май 10, 2013, 02:52:27 pm »
А. Ну, тогда коммандеры - это вариация на тему repl

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #46 : Май 10, 2013, 03:00:53 pm »
А. Ну, тогда коммандеры - это вариация на тему repl
Угу. Недоделанная.
Y = λf.(λx.f (x x)) (λx.f (x x))

kkk

  • Гость
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #47 : Май 10, 2013, 03:33:43 pm »
Бгг, веселовский выдал авторитетное профессиональное заключение.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #48 : Май 10, 2013, 06:41:54 pm »
valexey, я так и не понял в чем у тебя проблема. Не знаю что там в эрланге, но в ББ это элементарно делается. Смотри переменную dir в модулях подсистемы Host

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #49 : Май 10, 2013, 06:47:51 pm »
Посмотрел вашу беседу по диагонали. Горячая замена модуля какая-то..... Тык в ББ горячая замена модуля - это штатный режим работы. Система ведь не останавливается во время разработки  ;)  ;D

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #50 : Май 10, 2013, 06:48:48 pm »
valexey, я так и не понял в чем у тебя проблема. Не знаю что там в эрланге, но в ББ это элементарно делается. Смотри переменную dir в модулях подсистемы Host
Ну, пример проблемы - пересобрал HostMenus, а вот выгрузить не смог, ибо оно использовалось кем-то. Пришлось перезапускать ББ, хотя там изменилась только константа которая никуда не экспортировалась.

В erlang'e этого делать не пришлось бы. Переход на новую версию модуля прошел бы бесшовно (даже если при проектировании этого модуля о горячем замене кода не беспокоились).
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #51 : Май 10, 2013, 06:54:29 pm »
valexey, этого быть не может. Если модуль нельзя выгрузить значит его физически нельзя выгрузить (например это сам загрузчик модулей ;) ) Если эрланг позволяет выгрузить любой модуль, значит на нем нельзя написать такую систему как ББ :) Ибо в противном случае это смахивает на фантастику.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #52 : Май 10, 2013, 06:57:43 pm »
valexey, этого быть не может. Если модуль нельзя выгрузить значит его физически нельзя выгрузить (например это сам загрузчик модулей ;) ) Если эрланг позволяет выгрузить любой модуль, значит на нем нельзя написать такую систему как ББ :) Ибо в противном случае это смахивает на фантастику.
Не выгрузить, а заменить модуль на новый. Я по работе писал на erlang'e, и это не фантастика, это жизнь :-) И это одна из киллер-фич именно erlang'a, потому как если у тебя крутится телефонная станция, и идут звонки постоянно, то ты не имеешь права ни на секунду её останавливать чтобы воткнуть новую версию модуля, в которой скажем пофикшен баг. Естественно этот модуль постоянно активно используется, то есть он не лист в графе.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #53 : Май 10, 2013, 07:01:12 pm »
valexey, я тебе привел пример с загрузчиком модулей...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #54 : Май 10, 2013, 07:04:34 pm »
valexey, я тебе привел пример с загрузчиком модулей...
Ну, во-первых загрузчиков модулей может быть несколько (см. ClassLoader в той же жабе). Во вторых про именно ВЫГРУЗКУ я ничего сейчас не говорил. В-третьих, ты же понимаешь, что в erlang'а есть некое ядро писанное на сях, где никаких модулей ерланговых нет вообще.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #55 : Май 10, 2013, 07:16:30 pm »
Может я после огорода туплю... В чем проблема то? Модули в ББ выгружаются и загружаются. Заменить модуль во время работы можно. (чем ты и занимаешься во время разработки в ББ)

Хотя я не очень понимаю зачем менять модуль, когда можно заменить реализацию класса.

DddIzer

  • Гость
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #56 : Май 10, 2013, 07:18:33 pm »
Может я после огорода туплю... В чем проблема то? Модули в ББ выгружаются и загружаются. Заменить модуль во время работы можно. (чем ты и занимаешься во время разработки в ББ)

Хотя я не очень понимаю зачем менять модуль, когда можно заменить реализацию класса.
проблема в том, что не все модули.. однако, вероятно, что для решения КОНКРЕТНОЙ задачи функционала ББ вполне хватит.

DddIzer

  • Гость
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #57 : Май 10, 2013, 07:23:27 pm »
кроме того,  эта возможность зависит от зависимостей.. например, в схеме которую привел я - модуль A - не должен выгружаться (пока не выгружены модули его использующие)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #58 : Май 10, 2013, 07:27:09 pm »
PROCEDURE UnloadMod (name: TextMappers.String; VAR ok: BOOLEAN);
VAR mod: Kernel.Module; str: Dialog.String; n: Kernel.Name;
BEGIN
n := SHORT(name$); mod := Kernel.ThisLoadedMod(n);
IF mod # NIL THEN
Dialog.ShowParamStatus("#Dev:Unloading", name, "", "");
Kernel.UnloadMod(mod);
IF mod.refcnt < 0 THEN
Dialog.MapParamString("#Dev:Unloaded", name, "", "", str);
StdLog.String(str); StdLog.Ln
ELSE
Dialog.ShowParamMsg("#Dev:UnloadingFailed", name, "", "");
ok := FALSE
END
ELSE
Dialog.ShowParamMsg("#Dev:NotFound", name, "", "");
ok := FALSE;
END
END UnloadMod;

Цитировать
refcnt-: INTEGER
Число ссылок на модуль, то есть, число загруженных в настоящий момент модулей, импортирующих данный. Если refcnt = 0, то модуль ничем не импортируется и может быть выгружен. Однако следует учитывать, что модуль может использоваться неявно. Например, модуль реализации может инсталлировать свои фабрики в некоторый абстрактный модуль, но при этом сам он не импортируется никаким модулем. При выгрузке такого модуля и последующему обращению к фабрике в абстрактном модуле произойдет ошибка. Если refcnt < 0, то модуль уже выгружен из памяти. Однако при этом в памяти остается вся информация о типах данного модуля, поскольку еще могут существовать динамические экземпляры этих типов с соотв. тегом. Таким образом, в списке модулей может находиться несколько версий модуля с одним именем, но только для одного из них refcnt >= 0, то есть, загружены его секция данных и кода.

Вот вся логика. Может ты импорт не учел? В этом случае нужно списком выгружать.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [BlackBox] Динамическая выгрузка/загрузка.
« Ответ #59 : Май 10, 2013, 07:48:42 pm »
PROCEDURE UnloadMod (name: TextMappers.String; VAR ok: BOOLEAN);
VAR mod: Kernel.Module; str: Dialog.String; n: Kernel.Name;
BEGIN
n := SHORT(name$); mod := Kernel.ThisLoadedMod(n);
IF mod # NIL THEN
Dialog.ShowParamStatus("#Dev:Unloading", name, "", "");
Kernel.UnloadMod(mod);
IF mod.refcnt < 0 THEN
Dialog.MapParamString("#Dev:Unloaded", name, "", "", str);
StdLog.String(str); StdLog.Ln
ELSE
Dialog.ShowParamMsg("#Dev:UnloadingFailed", name, "", "");
ok := FALSE
END
ELSE
Dialog.ShowParamMsg("#Dev:NotFound", name, "", "");
ok := FALSE;
END
END UnloadMod;

Цитировать
refcnt-: INTEGER
Число ссылок на модуль, то есть, число загруженных в настоящий момент модулей, импортирующих данный. Если refcnt = 0, то модуль ничем не импортируется и может быть выгружен. Однако следует учитывать, что модуль может использоваться неявно. Например, модуль реализации может инсталлировать свои фабрики в некоторый абстрактный модуль, но при этом сам он не импортируется никаким модулем. При выгрузке такого модуля и последующему обращению к фабрике в абстрактном модуле произойдет ошибка. Если refcnt < 0, то модуль уже выгружен из памяти. Однако при этом в памяти остается вся информация о типах данного модуля, поскольку еще могут существовать динамические экземпляры этих типов с соотв. тегом. Таким образом, в списке модулей может находиться несколько версий модуля с одним именем, но только для одного из них refcnt >= 0, то есть, загружены его секция данных и кода.

Вот вся логика. Может ты импорт не учел? В этом случае нужно списком выгружать.
Так вот, в ерланге заменить (не выгрузить!) модуль можно даже если refcnt не нуль.
Y = λf.(λx.f (x x)) (λx.f (x x))