Комментарии 4
Вещь интересная, но на таких изыках как rust, c, c++ будут проблемы при работе с памятью если изменять структуры/классы, поэтому для таких языков ничего подобного и не делают, так как это накладывает ограничения из-за которых ставится под сомнение нужность такого решения.
Можно попытаться решить эти проблемы вмешавшись в аллокатор и сохранять выделенные адреса и дебажную инфу о выделяемом типе (размер, выравнивание, положение полей) и перепроверять их при загрузке и модифицировать память по сохраненным адресам для соответствия новой схеме типов.
Но что делать если добавили новое поле, которое не может быть нулем? Возможно для таких полей можно вызывать default(), но тут хз на сколько это возможно.
Задумка с кастомным аллокатором интересная, но мне кажется довольно сложная в реализации. Кроме инициализации полей нужно будет еще подумать над их "деинициализацией", например, что делать если удалилось поле, которое хранило какие-то неуправляемые ресурсы? Нужно будет видимо в момент перезагрузки ДЛЛки освобождать эти ресурсы, а иначе они утекут. Хотя может быть небольшие утечки и не так уж страшны на этапе разработки...
Интересно еще как дебаггер будет себя вести после таких махинаций) В текущем варианте он к удивлению работает исправно, позволяет ставить брейкпоинты, читать измененные переменные и тд.
Кроме инициализации полей нужно будет еще подумать над их “деинициализацией”, например, что делать если удалилось поле, которое хранило какие-то неуправляемые ресурсы?
С освобождением памяти очень просто - алокатор знает что за тип у удаляемого поля: если это указатель, и он был алоцирован - надо деалоцировать. А вот поля, в которых хранился какой-нибудь дескриптор, то его освободить будет уже не так просто. Тут можно попробовать через dlmopen загрузить новую версию библиотеки не выгружая старую, проверить удаляемые поля, вызвать для них деструкторы из старой библиотеки, и уже потом выгрузить старую библиотеку.
Интересно еще как дебаггер будет себя вести после таких махинаций)
Почти наверняка нормально будет работать, если он не остановится в момент вот такой миграции.
За время обычной компиляции Rust я успеваю сгонять в гараж и поменять масло, так что hotreload тут напрашивался давно. Осталось чтобы компилятор перестал пересобирать полпроекта из-за одной строчки, и вообще красота

Hotreload в Rust