Oberon space
General Category => Общий раздел => Тема начата: valexey_u от Май 08, 2013, 12:44:24 pm
-
Задача следующая: вот допустим у меня есть стандартный пример Cubes (Obx/Docu/Cubes.odc), который соответственно умеет размещать свой Action и свой View, причем этот самый View уже допустим внедрен в какой-то составной документ и там благополучно вращается.
Я хочу иметь возможность модифицировать код этого модуля ObxCubes (например менять его поведение, чтобы например он не вращался а перемещался, логику менять, возможно отрисовку) на лету. То есть чтобы во внедренном в составной документ View сразу отображались изменения (скажем куб перестал вращаться, или вообще в шар превратился).
То есть такой вот hot code swapping.
Это возможно?
PS. В erlang'e я это делал неоднократно - там это элементарно делается.
-
Сделай переменные-параметры (скорость например) экспортными в модуле и создай форму для этого модуля.
-
Сделай переменные-параметры (скорость например) экспортными в модуле и создай форму для этого модуля.
Не катит. Мне нужно менять алгоритмы. Причем я меняю тот алгоритм который есть на тот о котором во момент написания модуля я ничего не знаю.
То есть мне нужен реальный hot code swapping, не покрывающийся конфигами.
Еще пример - мне нужно в этом модуле пофиксить багу. Фиксить нужно без (видимой)остановки работы приложения.
-
В любом случае делаешь экспортную переменную и ее меняешь во время работы.
Пусть в этой переменной будет реализация некого класса. Вот и подменяй эту реализацию динамически.
-
В любом случае делаешь экспортную переменную и ее меняешь во время работы.
Пусть в этой переменной будет реализация некого класса. Вот и подменяй эту реализацию динамически.
Это ручной code swapping. А он хочет из черной коробки :)
-
Не как в эрланге
-
Сделай переменные-параметры (скорость например) экспортными в модуле и создай форму для этого модуля.
Не катит. Мне нужно менять алгоритмы. Причем я меняю тот алгоритм который есть на тот о котором во момент написания модуля я ничего не знаю.
То есть мне нужен реальный hot code swapping, не покрывающийся конфигами.
Еще пример - мне нужно в этом модуле пофиксить багу. Фиксить нужно без (видимой)остановки работы приложения.
в теории возможно.. - вроде есть механизм пересылки сообщений (на уровне фреймворка).. чисто гипотетически ничто не мешает сделать модуль который ловит сообщения извне вызывая стороннюю процедуру перерисовки ( с определенной сигнатурой) если нужное сообщение получено, или производит дефолтную прорисовку, если такого нет.....
-
.. также вроде ничто не мешает действовать по следующей схеме
пусть есть модуль А ( который экспортирует тип процедуры прорисовки, дефолтную процедуру прорисовки и глобальную процедурную переменную указывающую на текущую процедуру прорисовки), Модуль Б - который вызывает текущую процедуру прорисовки , и модуль C. которыq
-
.. также вроде ничто не мешает действовать по следующей схеме
пусть есть модуль А ( который экспортирует тип процедуры прорисовки, дефолтную процедуру прорисовки и глобальную процедурную переменную Proc указывающую на текущую процедуру прорисовки - при загрузке A устанавливает в Proc - дефолтную процедуру прорисовки), Модуль Б - который вызывает текущую процедуру прорисовки (например по таймеру) , и модуль C. который при загрузки подменяет дефолтную процедуру прорисовки (из А) своей, а при выгрузке присваивает переменной Proc дефолтное значение
-
Сделать, допустим, общую штуку - вьюшку-обёртку, которая понимает сообщение ReloadMsg - сериализует свою внутреннюю вьюшку (в Files.dir.Temp()), выгружает её модуль, делает загрузку вьюшки из временного представления (при этом модуль автоматом загрузится в новой версии) и помещает внутрь себя уже новую вьюшку.
-
Веселовский, вы же профессионал, неужели не разобрались сами?
-
Веселовский, вы же профессионал, неужели не разобрались сами?
Именно потому что профессионал, не исключаю возможность своей ошибки, и поэтому не считаю зазорным посоветоваться с другими и не боюсь показаться глупым.
-
.. также вроде ничто не мешает действовать по следующей схеме
пусть есть модуль А ( который экспортирует тип процедуры прорисовки, дефолтную процедуру прорисовки и глобальную процедурную переменную Proc указывающую на текущую процедуру прорисовки - при загрузке A устанавливает в Proc - дефолтную процедуру прорисовки), Модуль Б - который вызывает текущую процедуру прорисовки (например по таймеру) , и модуль C. который при загрузки подменяет дефолтную процедуру прорисовки (из А) своей, а при выгрузке присваивает переменной Proc дефолтное значение
Сделать, допустим, общую штуку - вьюшку-обёртку, которая понимает сообщение ReloadMsg - сериализует свою внутреннюю вьюшку (в Files.dir.Temp()), выгружает её модуль, делает загрузку вьюшки из временного представления (при этом модуль автоматом загрузится в новой версии) и помещает внутрь себя уже новую вьюшку.
Спасибо. Понял. Значит в общем случае в ББ задача не решена, но для моего конкретного случая вполне сгодится старый добрый ручной метод. Попробую.
-
в общем - не общем, но возможности те же или почти те же, что и в эрланге.
-
в общем - не общем, но возможности те же или почти те же, что и в эрланге.
Сори, но ничего общего не наблюдаю. Возможности тут примерно те же, что в Сях с динамическими либами.
В ерланге я могу заменить любой модуль на лету, в том числе тот который сейчас активно используется другими модулями. Все это без остановки системы.
-
типичный тред
-
Веселовский, вы же профессионал, неужели не разобрались сами?
Именно потому что профессионал, не исключаю возможность своей ошибки, и поэтому не считаю зазорным посоветоваться с другими и не боюсь показаться глупым.
да будет вам, цель этого треда в том, чтобы сравнить кислое с длинным, многозначительно фыркнув в конце.
-
Веселовский, вы же профессионал, неужели не разобрались сами?
Именно потому что профессионал, не исключаю возможность своей ошибки, и поэтому не считаю зазорным посоветоваться с другими и не боюсь показаться глупым.
да будет вам, цель этого треда в том, чтобы сравнить кислое с длинным, многозначительно фыркнув в конце.
Пётр, кончай фигней страдать и уводить тему в не конструктивное русло. Целью этой и соседней темы ([BlackBox] Быстрое рисование. (http://oberspace.dyndns.org/index.php/topic,494.0.html)) является создание одной поделки, соответственно я с народом консультируюсь.
-
чай фигней страдать и уводить тему в не конструктивное русло. Целью этой и соседней темы ([BlackBox] Быстрое рисование. (http://oberspace.dyndns.org/index.php/topic,494.0.html)) является создание одной поделки, соответственно я с народом консультируюсь.
да ладно Алексей - это быдло как никак себя пол-года сдерживало...рекорд как никак - будьте снисходительным (как я) :)
-
... а насчет поделки... так от нее, боюсь, мир не станет лучше и никого вы ею не удивите ибо все началось с нее - ББ и есть изначальное поделье....
-
Так и в ББ же можно. Но у этого действия (выгрузки) есть одно логичное следствие - если выгружают код, который исполнялся, то исполнение прервётся. Если данные принадлежат модулю (а в момент исполнения они принадлежат модулю), то они теряются.
-
Сори, но ничего общего не наблюдаю. Возможности тут примерно те же, что в Сях с динамическими либами.
В ерланге я могу заменить любой модуль на лету, в том числе тот который сейчас активно используется другими модулями. Все это без остановки системы.
Так и в ББ же можно. Но у этого действия (выгрузки) есть одно логичное следствие - если выгружают код, который исполнялся, то исполнение прервётся. Если данные принадлежат модулю (а в момент исполнения они принадлежат модулю), то они теряются.
-
дизер раскудахтался. просто иди нах, упырь.
а веселовскому даже к лицу такое простодушное хлопание глазкаме, бгг.
-
дизер раскудахтался. просто иди нах, упырь.
а веселовскому даже к лицу такое простодушное хлопание глазкаме, бгг.
гы... а вот я вас не выгоняю... ибо вы акапет хронический дурак (помимо того, что быдло) - а без дураков жить скучно( даже таких дристунов как вы)...
-
В вашей местечковой стране слепых разве может быть иное мнение?
-
ко-ко-ко-ко-ко...
Что?
-
В вашей местечковой стране слепых разве может быть иное мнение?
почему бы и нет?... только это ведь вам не нужно...- вы приперлись сюда с одной целью (как и мохнорыл) - СРАТЬ..
-
бгг, дизер, ваши упрёки даже выглядят смешно, особенно с соплёй Героя помойки, под юзернеймом
-
бгг, дизер, ваши упрёки даже выглядят смешно, особенно с соплёй Героя помойки, под юзернеймом
:D какой упрек.. помилуйте.. всего навсего констатация факта... и потом.. я же не против , я за... :D
(вы сгодитесь нам и таким... ибо повторюсь - без дураков скучно)
-
эта помойка уже доросла до общности? уже смешно.
Ну впрямь, страна слепых.
-
Сори, но ничего общего не наблюдаю. Возможности тут примерно те же, что в Сях с динамическими либами.
В ерланге я могу заменить любой модуль на лету, в том числе тот который сейчас активно используется другими модулями. Все это без остановки системы.
Так и в ББ же можно. Но у этого действия (выгрузки) есть одно логичное следствие - если выгружают код, который исполнялся, то исполнение прервётся. Если данные принадлежат модулю (а в момент исполнения они принадлежат модулю), то они теряются.
Горячая замена кода (модуля) это не просто механизм загрузки и выгрузки модуля, но и механизм миграции со старого модуля на новый. В Posix (в Си соответственно) и в ББ первые два есть. В Си это dlopen и dlclose соответственно. Но нет механизма миграции. Следовательно на лету менять код можно будет лишь тот который специально для этого был приспособлен. Произвольный модуль не заменить на бегу.
В erlang'e я могу заменить на бегу любой модуль. Просто после подгрузки нового модуля везде где возможно начнут вызываться функции из нового модуля.
Вообще для такой процедуры миграции необходимо иметь возможность держать в памяти одновременно несколько версий, ну или хотя бы две, данного модуля - старую и новую версию.
Когда я создавал эту тему, я думал, что возможно подобный механизм и в ББ уже реализован.
-
эта помойка уже доросла до общности? уже смешно.
Ну впрямь, страна слепых.
вот видите вам смешно.. нам смешно.. и всем -хорошо :D
-
... а насчет поделки... так от нее, боюсь, мир не станет лучше и никого вы ею не удивите ибо все началось с нее - ББ и есть изначальное поделье....
It a fun :-)
Ну и вообще, это кроме фана и потенциальной пользы для некоторых, прокачивает также некоторый мой скил, не связанный с Оберонами.
-
дизер раскудахтался. просто иди нах, упырь.
а веселовскому даже к лицу такое простодушное хлопание глазкаме, бгг.
ко-ко-ко-ко-ко...
Что?
А тебе к лицу кривлянье.
-
Сори, но ничего общего не наблюдаю. Возможности тут примерно те же, что в Сях с динамическими либами.
В ерланге я могу заменить любой модуль на лету, в том числе тот который сейчас активно используется другими модулями. Все это без остановки системы.
Так и в ББ же можно. Но у этого действия (выгрузки) есть одно логичное следствие - если выгружают код, который исполнялся, то исполнение прервётся. Если данные принадлежат модулю (а в момент исполнения они принадлежат модулю), то они теряются.
В erlang'e я могу заменить на бегу любой модуль. Просто после подгрузки нового модуля везде где возможно начнут вызываться функции из нового модуля.
1. ;) прям так и любой...
2. тут тоже (выгружаете с -выполняется дефолтная прорисовка), загружаете новый.. подставляется новая..
-
А тебе к лицу кривлянье.
блин.. Алексей не портьте малину... когда еще у нас новая зверушка (akaPet) заведется... ибо для мохнорылов нужен вольер.. а это недоразвитый мохнорыл...все ОК :)
-
В erlang'e я могу заменить на бегу любой модуль. Просто после подгрузки нового модуля везде где возможно начнут вызываться функции из нового модуля.
1. ;) прям так и любой...
2. тут тоже (выгружаете с -выполняется дефолтная прорисовка), загружаете новый.. подставляется новая..
Угу. Любой. Но в таким наивном способе не любое изменение корректно отработает. Для произвольных изменений в новом модуле есть OTP.
При попытке выгрузки-загрузки модуля в ББ я ловил трапы, если логику модулей не разнести как надо. Ну, то есть моя задача решаема, и я в общем то довелен этим. Ну а то что общего механизма нет... Ну нет и нет. :-) Oberon-way - закат солнца вручную ;-) Зато в процессе поймешь как оно закатывается на самом деле.
-
... и потом помимо fun'а я тоже скил прокачиваю - важнейший для преподавателя (после знания темы и методик преподавания) - умение оперативно реагировать на неблагоприятно меняющуюся обстановку (работа с неудобной аудиторией).
-
В erlang'e я могу заменить на бегу любой модуль. Просто после подгрузки нового модуля везде где возможно начнут вызываться функции из нового модуля.
1. ;) прям так и любой...
2. тут тоже (выгружаете с -выполняется дефолтная прорисовка), загружаете новый.. подставляется новая..
Угу. Любой. Но в таким наивном способе не любое изменение корректно отработает. Для произвольных изменений в новом модуле есть OTP.
При попытке выгрузки-загрузки модуля в ББ я ловил трапы, если логику модулей не разнести как надо. Ну, то есть моя задача решаема, и я в общем то довелен этим. Ну а то что общего механизма нет... Ну нет и нет. :-) Oberon-way - закат солнца вручную ;-) Зато в процессе поймешь как оно закатывается на самом деле.
не понял .. а что в эрланге разве логику разносить совсем не надо? - что то не верю...
-
не понял .. а что в эрланге разве логику разносить совсем не надо? - что то не верю...
Конкретно для горячей замены кода - нет, не надо. По крайней мере я с подобным в своей практике ни разу не сталкивался.
-
Кстати, мысли в тему - в ББ дико не хватает полноценного repl'a.
-
речь про рид-эвал-принт? Так это же сервер.
-
речь про рид-эвал-принт? Так это же сервер.
Угу. Про него, родимого.
А при чем тут сервер?
-
При том, что в этой вещи заключена вся суть сервера: в цикле принимать, обрабатывать и отдавать.
-
При том, что в этой вещи заключена вся суть сервера: в цикле принимать, обрабатывать и отдавать.
Repl он не для серверов совсем.
http://ru.wikipedia.org/wiki/REPL
-
А. Ну, тогда коммандеры - это вариация на тему repl
-
А. Ну, тогда коммандеры - это вариация на тему repl
Угу. Недоделанная.
-
Бгг, веселовский выдал авторитетное профессиональное заключение.
-
valexey, я так и не понял в чем у тебя проблема. Не знаю что там в эрланге, но в ББ это элементарно делается. Смотри переменную dir в модулях подсистемы Host
-
Посмотрел вашу беседу по диагонали. Горячая замена модуля какая-то..... Тык в ББ горячая замена модуля - это штатный режим работы. Система ведь не останавливается во время разработки ;) ;D
-
valexey, я так и не понял в чем у тебя проблема. Не знаю что там в эрланге, но в ББ это элементарно делается. Смотри переменную dir в модулях подсистемы Host
Ну, пример проблемы - пересобрал HostMenus, а вот выгрузить не смог, ибо оно использовалось кем-то. Пришлось перезапускать ББ, хотя там изменилась только константа которая никуда не экспортировалась.
В erlang'e этого делать не пришлось бы. Переход на новую версию модуля прошел бы бесшовно (даже если при проектировании этого модуля о горячем замене кода не беспокоились).
-
valexey, этого быть не может. Если модуль нельзя выгрузить значит его физически нельзя выгрузить (например это сам загрузчик модулей ;) ) Если эрланг позволяет выгрузить любой модуль, значит на нем нельзя написать такую систему как ББ :) Ибо в противном случае это смахивает на фантастику.
-
valexey, этого быть не может. Если модуль нельзя выгрузить значит его физически нельзя выгрузить (например это сам загрузчик модулей ;) ) Если эрланг позволяет выгрузить любой модуль, значит на нем нельзя написать такую систему как ББ :) Ибо в противном случае это смахивает на фантастику.
Не выгрузить, а заменить модуль на новый. Я по работе писал на erlang'e, и это не фантастика, это жизнь :-) И это одна из киллер-фич именно erlang'a, потому как если у тебя крутится телефонная станция, и идут звонки постоянно, то ты не имеешь права ни на секунду её останавливать чтобы воткнуть новую версию модуля, в которой скажем пофикшен баг. Естественно этот модуль постоянно активно используется, то есть он не лист в графе.
-
valexey, я тебе привел пример с загрузчиком модулей...
-
valexey, я тебе привел пример с загрузчиком модулей...
Ну, во-первых загрузчиков модулей может быть несколько (см. ClassLoader в той же жабе). Во вторых про именно ВЫГРУЗКУ я ничего сейчас не говорил. В-третьих, ты же понимаешь, что в erlang'а есть некое ядро писанное на сях, где никаких модулей ерланговых нет вообще.
-
Может я после огорода туплю... В чем проблема то? Модули в ББ выгружаются и загружаются. Заменить модуль во время работы можно. (чем ты и занимаешься во время разработки в ББ)
Хотя я не очень понимаю зачем менять модуль, когда можно заменить реализацию класса.
-
Может я после огорода туплю... В чем проблема то? Модули в ББ выгружаются и загружаются. Заменить модуль во время работы можно. (чем ты и занимаешься во время разработки в ББ)
Хотя я не очень понимаю зачем менять модуль, когда можно заменить реализацию класса.
проблема в том, что не все модули.. однако, вероятно, что для решения КОНКРЕТНОЙ задачи функционала ББ вполне хватит.
-
кроме того, эта возможность зависит от зависимостей.. например, в схеме которую привел я - модуль A - не должен выгружаться (пока не выгружены модули его использующие)
-
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, то есть, загружены его секция данных и кода.
Вот вся логика. Может ты импорт не учел? В этом случае нужно списком выгружать.
-
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 не нуль.
-
Может я после огорода туплю... В чем проблема то? Модули в ББ выгружаются и загружаются. Заменить модуль во время работы можно. (чем ты и занимаешься во время разработки в ББ)
Хотя я не очень понимаю зачем менять модуль, когда можно заменить реализацию класса.
проблема в том, что не все модули.. однако, вероятно, что для решения КОНКРЕТНОЙ задачи функционала ББ вполне хватит.
Угу. В данной конкретной моей задаче вполне хватает декомпозиции такой вот ООПшной :-)
-
valexey, я посмотрел в гугле... в общем понятно... интерпретируемый функциональный эрланг с динамической типизацией специально разработанный для горячей замены кода таки позволяет это. :)
А кроме эрланга там лисп, смолток и 1С (O_o OMG): http://ru.wikipedia.org/wiki/%D0%93%D0%BE%D1%80%D1%8F%D1%87%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0
Вопрос: при чем тут ББ?
Из коробки вот прям такого функционала нету. Не было такого пункта в ТЗ у разрабов ;D Можешь сам написать.
-
valexey, я посмотрел в гугле... в общем понятно... интерпретируемый функциональный эрланг с динамической типизацией специально разработанный для горячей замены кода таки позволяет это. :)
А кроме эрланга там лисп, смолток и 1С (O_o OMG): http://ru.wikipedia.org/wiki/%D0%93%D0%BE%D1%80%D1%8F%D1%87%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0
Вопрос: при чем тут ББ?
Из коробки вот прям такого функционала нету. Не было такого пункта в ТЗ у разрабов ;D Можешь сам написать.
Кстати, для этого динамическая типизация и интерпретируемость не нужна на самом деле :-)
-
Ну как и для замыканий. Вот только реализовать это сложнее в компилируемом языке.
Кстати почитал на хабре про эрланг... Тык там система как в 1С практически ;D Фигасе я на передовой софтварине работаю ;D
-
Ну как и для замыканий. Вот только реализовать это сложнее в компилируемом языке.
Кстати почитал на хабре про эрланг... Тык там система как в 1С практически ;D Фигасе я на передовой софтварине работаю ;D
Да ты ваще крут :-)
-
На самом деле про горячую замену в 1С конечно сильно преувеличено.
Кодить на горячую можно, да. Вот только пользователю нужно перезапускать клиента чтобы изменения вступили в силу. Единственный гуд, что сервер не нужно перезапускать. А в остальном типа как в эрланге... На сервере может быть несколько версий конфигурации одновременно. Старые версии уничтожаются как только исчезнет последний якорь (клиентское соединение)
-
То есть такой вот hot code swapping.
Техника code injection в приложении написанном на обероне (AOS): https://www.youtube.com/watch?v=Pe0ZdzO_urU (https://www.youtube.com/watch?v=Pe0ZdzO_urU)