Код горячей замены в Луа - PullRequest
7 голосов
/ 21 февраля 2012

Я слышал бормотание в интернете о возможности горячей замены кода в Lua, аналогично тому, как это делается в Java, Erlang, Lisp и т. Д. Однако 30 минут поиска в Google ничего не дали.Кто-нибудь читал что-нибудь существенное по этому поводу?У кого-нибудь есть опыт?Работает ли он в LuaJIT или только в эталонной виртуальной машине?

Меня больше интересует техника в качестве ярлыка в разработке / отладке, чем путь обновления в реальной среде.

Ответы [ 2 ]

19 голосов
/ 21 февраля 2012

Lua и большинство языков сценариев в этом отношении не поддерживают наиболее обобщенную форму «горячей замены», как вы ее определяете. То есть вы не можете гарантированно изменить файл на диске, и любые изменения в нем распространяются в исполняющую программу.

Тем не менее, Lua и большинство языков сценариев вполне способны к управляемым формам горячей замены. Глобальные функции - это глобальные функции. Модули просто загружают глобальные функции (если вы используете их таким образом). Поэтому, если модуль загружает глобальные функции, вы можете перезагрузить модуль снова, если он был изменен, и эти ссылки на глобальные функции изменятся на вновь загруженные функции.

Однако , Lua и большинство скриптовых языков в этом отношении не дают никаких гарантий по этому поводу. Все, что происходит, - это изменение глобальных данных о состоянии. Если кто-то скопировал старую функцию в локальную переменную, он все равно может получить к ней доступ. Если ваш модуль использует данные о локальном состоянии, новая версия модуля не может получить доступ к состоянию старого модуля. Если модуль создает какой-то объект, который имеет функции-члены, если эти члены не извлекаются из глобальных переменных, эти объекты всегда будут ссылаться на старые функции, а не на новые. И так далее.

Кроме того, Lua не безопасен для потоков; Вы не можете просто прервать lua_State в какой-то момент и попытаться загрузить модуль снова. Так что вам нужно будет установить какой-то конкретный момент времени, чтобы он мог проверить вещи и перезагрузить измененные файлы.

Так что вы можете это сделать, но это не "поддерживается" в том смысле, что это может просто произойти. Вы должны работать над этим, и вы должны быть осторожны с тем, как вы пишете вещи и что вы вкладываете в локальные и глобальные функции.

0 голосов
/ 16 октября 2017

Полностью согласен с Николь. Я работаю с факелом (рамки машинного обучения) - который основан на Луа. Мне пришлось запустить несколько экспериментов, используя один и тот же main.lua. Поскольку горячая замена явно не поддерживается, все, что мне нужно было сделать, это изменить некоторые параметры в main.lua и запустить эксперименты, используя ту же команду. Это гарантировало, что мне не нужно было делать несколько копий моего кода, и это изменение не повлияло на предыдущие эксперименты.

...