Я просмотрел несколько руководств по JIT и выделению кучи исполняемой памяти во время выполнения. Это в основном концептуальный вопрос, поэтому, пожалуйста, поправьте меня, если я что-то не так.
Если я правильно понимаю, JIT использует интерпретатор/компилятор времени выполнения, который выводит собственный или исполняемый код и, если собственный двоичный код, помещает его в кучу исполняемого кода в памяти, которая зависит от ОС (например, VirtualAlloc() для Windows , mmap() для Linux).
Кроме того, некоторые языки, такие как Erlang, могут иметь распределенную систему, так что каждая часть отделена друг от друга, а это означает, что в случае сбоя одной из них другие могут учитывать такой случай модульным образом, а это означает, что модули также могут включаться и отключаться. по желанию, если им правильно управлять, не нарушая общего исполнения.
С компилятором времени выполнения или каким-либо механизмом доставки кода, не будет ли возможно произвольно загружать код во время выполнения, чтобы заменить модули кода, которые можно обновить?
Пример
Скажем, у меня есть функция sort(T, T)
, которая работает с T или T. Теперь предположим, что у меня есть функция merge_sort(T,T)
, которую я загрузил во время выполнения. Если я реализую что-то вроде реестра или системы регистров, чтобы пользователи первого sort(T,T)
могли переназначить себя для использования новой функции merge_sort(T,T)
и определить, когда все пользователи настроились, я тогда смогу освободить и удалить sort(T,T)
из памяти.
По сути, это очень похоже на JIT, но для меня привлекательной частью был аспект, в котором вы можете произвольно заменять код во время выполнения для модулей. Таким образом, пока система не находится под полной нагрузкой, когда используется каждый модуль, модули могут быть автоматизированы для переключения на новый код, если это необходимо, и т. д. Теоретически, не будет ли это способом реализации патчей таким образом, чтобы пользователь, который использует программу, никогда не должен перезапускать программу, если программа может молча заменять код в отдельных модулях? Я полагаю, что гораздо более крупные распределенные системы могут использовать это, но как насчет более мелких?