Здравствуйте, Разраб, Вы писали:
Р>В Oberon BlackBox есть команда меню позволяющая выгрузить модуль. Р>В Clojure при загрузке командой require можно указать :reload что конечно не выгрузит модуль полностью, но перегрузит его. Р>В net fx была возможность убивать дополнительные домены с загруженными в них модулями. В корке к сожалению от этого отказались. Р>Еще в free pascal есть такой LoadLibrary , FreeLibrary. Не уверен, насчет этого. И насколько это безопасно для приложения. Р>По крайней мере в корке через контекст загрузки осуществить выгрузку довольно сложно пока есть ссылки (например был вызван конструктор класса из загруженной сборки). Р>В ББО как-то с этим попроще, хотя там реализована безопасная выгрузка.
Р>Насколько практична данная фича?
Смотря для чего. Во времена доса когда "640Кб хватит всем" везде были оверлеи — части программы, хранимые на дисках отдельными файлами, которые подгружались когда надо было что-то вызывать.
В винде есть DLL, а в линухе SO. Но они скорее нужны для оптимизации общего потребления памяти программами, чтобы одна и та же DLL\SO в разных процессах отображалась в одну область памяти. Хотя большинство систем плагинов в нативных приложениях и сейчас используют DLL\SO и их механизм выгрузки.
В мире VM и JIT с выгрузкой сложнее. Во-первых VM старается обеспечить целостность ссылок, чтобы нельзя было выгрузить то, на что ссылается другая часть кода, в том числе нельзя выгрузить метаданные класса, когда есть хотя бы один экземпляр класса. С другой стороны загрузка DLL\SO теперь не только отображения образа файла в память, но и создание исполняемого кода из байткода, то есть нужно чтобы при выгрузке удалялось все что было за JITено. Появился еще третий фактор: в VM с развитой системой метаданных и рантайм рефлексии можно из кода плагина много куда получить доступ, поэтому нужна некоторая изоляция если плагины приходят из недоверенных источников. Причем при переходе на x64 фактор экономии памяти стал неважным, а фактор изоляции наоборот вышел на первый план.
В Java, насколько я знаю, все это рулится Класслоадером, он обеспечивает загрузку и выгрузку отдельных классов. В JVM изначально встроена выгрузка классов на которые нет ссылок, потому что Java создавалась еще во времена когда "640Кб хватит всем". Вроде даже изоляция есть.
В .NET FW была (и сейчас есть) такая изоляция в рамках app domain (с ручным приводом). А .NET Core такого не завезли (потому что не слишком актуально). Кроме того, кажись в .NET 4, прикрутили автоматическую выгрузку динамически созданных методов.
В общем в наше время хорошей единицей изоляции является процесс. Во многих языках не предусмотрена какая-либо изоляция кода, поэтому для недоверенного кода создается процесс, который через IPC каналы общается с основным, и внутри себя вызывает недоверенный код.
Для .net сейчас пилят .net isolator — изолированная среда исполнения на базе WebAssemby (WASM). WASM хост (wasi) работает внутри процесса. Причем хост может управлять изоляцией WASM рантайма достаточно легко, а работа внутри WASM по быстродействию не отличается от самого приложения, только кросс-вызовы тормозят. А еще wasm можно подружить с AOT. И естественно весь wasm хост можно выгрузить разом.
Я думаю изоляция и плагины на базе WASM в ближайшее время захватят всё.