Как компиляторы динамически типизированных языков обрабатывают изменения в нелокальных переменных? - PullRequest
0 голосов
/ 05 января 2019

Возьмите следующий код Lua (который я использую, потому что Lua скомпилирован в байт-код перед интерпретацией):

local myVar = "h";

local function printer()
    print(myVar)
end;

printer();

myVar = 7;

printer();

Выходные данные: h, затем в новой строке 7.

Из-за динамической типизации языка я предполагаю, что переменная должна быть перераспределена в памяти из-за изменения типа данных. Исходя из этого предположения, myVar должен ссылаться на разные места в разных частях сценария. Если это так, для меня имеет смысл, что должны быть скомпилированы две версии printer: одна до изменения и одна после изменения.

Я также считал, что каждой переменной может быть выделено определенное место в памяти, и что данное место в памяти можно проверить, чтобы найти текущее выделенное место для значения переменной. Если это так, то я предполагаю, что ссылочные типы, такие как таблицы, имеют ссылку, сохраненную в указанном местоположении (двойная ссылка)?

Итак, скомпилирована ли функция для каждой его версии, которая может работать? Отслеживаются ли изменения местоположения указателем? Или здесь происходит какой-то другой процесс?

1 Ответ

0 голосов
/ 06 января 2019

Из-за динамической типизации языка я предполагаю, что переменная должна быть перераспределена в памяти из-за изменения типа данных.

объекты занимают память; переменные просто держатели для объектов. Переменная может содержать любой объект; когда вы вызываете myvar (где бы это ни было), он отправляется в то место, где myvar хранит свой объект и извлекает его. Когда вы делаете myvar = <something>, он переходит к месту, где myvar содержит свой объект, и переключает удерживаемый объект на <something>.

Любая память, кроме необходимой для хранения объекта, является частью объекта , а не переменной.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...