Здравствуйте, Aen Sidhe, Вы писали:
M>>Я знаю, что subj реализован в Erlang-е. M>>Есть ли еще языки/системы, где реализован похожий функционал? AS>Что подразумевается под этим?
Замена работающего кода.
AS>А то, вон в дотнете такое возможно.
Невозможно.
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Aen Sidhe, Вы писали:
M>>>Я знаю, что subj реализован в Erlang-е. M>>>Есть ли еще языки/системы, где реализован похожий функционал? AS>>Что подразумевается под этим? C>Замена работающего кода.
Непонимаю.
AS>>А то, вон в дотнете такое возможно. C>Невозможно.
А как же тогда ASP.NET работает? Перезаписал dll, код для новых запросов — новый. Или это не то?
Здравствуйте, Aen Sidhe, Вы писали:
C>>Замена работающего кода. AS>Непонимаю.
Что тут непонятного? Erlang позволяет заменять код уже загруженных и работающих модулей.
AS>>>А то, вон в дотнете такое возможно. C>>Невозможно. AS>А как же тогда ASP.NET работает? Перезаписал dll, код для новых запросов — новый.
А ещё можно приложение перезапустить. Тоже код заменится!
AS>Или это не то?
Совсем.
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Aen Sidhe, Вы писали:
C>>>Замена работающего кода. AS>>Непонимаю. C>Что тут непонятного? Erlang позволяет заменять код уже загруженных и работающих модулей.
Непонятно то, что дотнет тоже это позволяет. Мне никто не мешает выгрузить пару сборок (вместе , загрузить другие и заставить их работать).
Всё, что описано здесь возможно.
AS>>Или это не то? C>Совсем.
Здравствуйте, Aen Sidhe, Вы писали:
C>>Что тут непонятного? Erlang позволяет заменять код уже загруженных и работающих модулей. AS>Непонятно то, что дотнет тоже это позволяет. Мне никто не мешает выгрузить пару сборок (вместе , загрузить другие и заставить их работать). AS>Всё, что описано здесь возможно.
Ещё раз — можно менять уже работающий код.
Грубо говоря, оно было бы таким же, если бы можно было для:
class Blah
{
int a, b;
}
В рантайме добавить ко всем существующим инстансам этого класса новое поле или поменять тип поля.
Здравствуйте, Quintanar, Вы писали:
Q>Здравствуйте, md03t4, Вы писали:
M>>Я знаю, что subj реализован в Erlang-е. M>>Есть ли еще языки/системы, где реализован похожий функционал?
Q>Думаю, для любого интерпретируемого языка с проверкой типов во время исполнения такое элементарно реализовывается. Q>Классический пример — Лисп.
Для любого интерпретируемого, или любого функционального?
Как выгрузить модуль (любую другую единицу компиляции), если ссылки на его переменные могут быть со[ранены в других модулях? функции в чистом функциональном языке не имеют сторонних эффектов, чистый функциональный язык не имеет и глобальных переменных, да и переменных как таковых не имеет , но лисп не таков. Руби — тем более. Простая замена DLL — в двойне "тем более".
Спасибо, я покопаю Руби, попытаюсь понять как там это сделано, если сделано. Пока мне не удалось ничего похожего найти.
Здравствуйте, Cyberax, Вы писали:
AS>>>>А то, вон в дотнете такое возможно. C>>>Невозможно. AS>>А как же тогда ASP.NET работает? Перезаписал dll, код для новых запросов — новый. C>А ещё можно приложение перезапустить. Тоже код заменится!
В случае asp.net при изменении страницы приложение не перезапускается.
В принципе вполне возможно заменять код в .NET, приседаний много надо
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Aen Sidhe, Вы писали:
C>>>Что тут непонятного? Erlang позволяет заменять код уже загруженных и работающих модулей. AS>>Непонятно то, что дотнет тоже это позволяет. Мне никто не мешает выгрузить пару сборок (вместе , загрузить другие и заставить их работать). AS>>Всё, что описано здесь возможно. C>Ещё раз — можно менять уже работающий код.
C>Грубо говоря, оно было бы таким же, если бы можно было для: C>
C>class Blah
C>{
C> int a, b;
C>}
C>
C>В рантайме добавить ко всем существующим инстансам этого класса новое поле или поменять тип поля.
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, Aen Sidhe, Вы писали:
C>>>Что тут непонятного? Erlang позволяет заменять код уже загруженных и работающих модулей. AS>>Непонятно то, что дотнет тоже это позволяет. Мне никто не мешает выгрузить пару сборок (вместе , загрузить другие и заставить их работать). AS>>Всё, что описано здесь возможно. C>Ещё раз — можно менять уже работающий код.
Очевидно, в примере с ASP.NET меняется не работающий код. Я вас правильно понял?
C>В рантайме добавить ко всем существующим инстансам этого класса новое поле или поменять тип поля.
Ну, к существующим нельзя так вот просто сделать. К новым — легко. Буквально, одна строка кода/одна настройка в конфиге
Здравствуйте, Aen Sidhe, Вы писали:
C>>Ещё раз — можно менять уже работающий код. AS>Очевидно, в примере с ASP.NET меняется не работающий код. Я вас правильно понял?
Да. В примере с ASP.NET загружается новый код, который просто начинает обслуживать новые запросы.
C>>В рантайме добавить ко всем существующим инстансам этого класса новое поле или поменять тип поля. AS>Ну, к существующим нельзя так вот просто сделать. К новым — легко. Буквально, одна строка кода/одна настройка в конфиге
Нет, не легко. Например, если я передам в новый код инстанс старого класса — получится фигня.
Здравствуйте, md03t4, Вы писали:
M>Для любого интерпретируемого, или любого функционального? M>Как выгрузить модуль (любую другую единицу компиляции), если ссылки на его переменные могут быть со[ранены в других модулях? функции в чистом функциональном языке не имеют сторонних эффектов, чистый функциональный язык не имеет и глобальных переменных, да и переменных как таковых не имеет :), но лисп не таков. Руби — тем более. Простая замена DLL — в двойне "тем более".
Я использовал это в Питоне. У него, с одной стороны, можно переопределять практически всё (например, определения класса), с другой стороны, старые определения сохраняются, пока на них есть ссылки. В результате получается следующий эффект. Если использовать, например, так:
from Module import Class
...
c = Class()
то импорт срабатывает на этапе компиляции вызывающего модуля. В результате перезагрузки Module.Class уже новый, но заимпортированная ссылка — старая. Если же написать
import Module
...
c = Module.Class()
то разрешение происходит в момент вызова Class(), и грузится новый код.
Думаю, в Ruby эффекты не отличаются. В результате такого подхода, может быть произвольное количество копий старых определений, пока они используются. Это определённый плюс — по сравнению с Erlang, например, где может быть только текущая и предыдущая копия — но тут же и минус: процесс перехода может растянуться надолго. Эффекты от необходимости перезапускать операции "from X import Y" обсуждаются, например, здесь, вместе с методами надёжного перезапуска. Но для разных случаев надо это делать достаточно по-разному. У меня, например, получались группы модулей, внутри которых связи надо было обновлять сразу, а за их пределами — не обязательно или вообще нежелательно (объект должен доработать с кодом своего класса, а не с обновлённым).
В последних версиях делал перезагрузку модуля специальной функцией, которая до и после этого вызывала в нём специальные хуки (_prereload, _postreload). Это давало возможность модулю произвести "дочистку" определений по необходимости.
Перезагрузку в Erlang'е собираемся применять, но тут таки много особенностей, которые в стандартный relup не укладываются. И все его методы не помогают против того, что если логика сменилась, например, с использованием других модулей или смены порядка прохождения обработчиков (при пересылке между ними), оказывается необходимо ставить не просто версию B после версии A, а версию "вариант B для перехода с A" и только когда этот переход произошёл успешно — переходить на окончательную B. relup помогает только тривиальным случаям, когда нет несовместимых изменений межмодульной логики или интерфейсов, а лучше — все изменения локализованы внутри модуля.
Здравствуйте, md03t4, Вы писали:
M>Спасибо, я покопаю Руби, попытаюсь понять как там это сделано, если сделано. Пока мне не удалось ничего похожего найти.