Size: a a a

Compiler Development

2021 January 04

PS

Peter Sovietov in Compiler Development
Про аргументы — да, это очевидный момент. Число аргументов уже входит в MAXVARS. А вот какой момент менее очевидный? Есть что-то, что сходу труднее подсчитать :)
источник

PS

Peter Sovietov in Compiler Development
То есть парсер Lua сразу определяет, если количество locals (включая аргументы) превысило MAXVARS. И выдает соответствующую ошибку.
Далее же происходит трансляция в байткод. И здесь может тоже произойти переполнение — отсюда и "запас" из 55 слотов (величина чисто эмпирическая).
источник

BD

Berkus Decker in Compiler Development
Peter Sovietov
К слову сказать, для существующих регистровых VM тоже spilling используется далеко не всегда. В частности, в случае Lua VM в процессе трансляции просто проверяется, не превысило ли число слотов стека (виртуальных регистров) максимального значения, равного 255. Вместо тяжеловесной процедуры выгрузки регистров в память выдается соответствующее сообщение об ошибке пользователю.
"256 регистров хватит всем!" :)
мм, погоди, но у железа то не 256 регистиров
источник

PS

Peter Sovietov in Compiler Development
Berkus Decker
мм, погоди, но у железа то не 256 регистиров
У железа тоже бывает 256 регистров. Но я в данном случае про виртуальные регистры Lua-машины говорю.
источник

BD

Berkus Decker in Compiler Development
Peter Sovietov
У железа тоже бывает 256 регистров. Но я в данном случае про виртуальные регистры Lua-машины говорю.
А, этот spilling, ну ок, должен же быть какой-то верхний лимит )
источник

BD

Berkus Decker in Compiler Development
Насколько он большой или маленький решает дизайнер VM/языка
источник

BD

Berkus Decker in Compiler Development
тут например главный лимит - чтобы влезало в 8 бит, я так понимаю
источник

PS

Pavel Samolysov in Compiler Development
Наверное есть какое-то железо и с реальными 256 регистрами. Сейчас кэш первого уровня на том же кристалле что и ядро, почему бы не наделать регистров. Вопрос как их адресовать и не разрастется ли формат команды в длину
источник

PS

Peter Sovietov in Compiler Development
Berkus Decker
тут например главный лимит - чтобы влезало в 8 бит, я так понимаю
Вот и вопрос, почему авторы не сделали MAXVARS = MAXREGS = 255? :)
источник

BD

Berkus Decker in Compiler Development
Pavel Samolysov
Наверное есть какое-то железо и с реальными 256 регистрами. Сейчас кэш первого уровня на том же кристалле что и ядро, почему бы не наделать регистров. Вопрос как их адресовать и не разрастется ли формат команды в длину
для 256 регистров как минимум байт  уйдет под индекс регистра да
источник

BD

Berkus Decker in Compiler Development
Peter Sovietov
Вот и вопрос, почему авторы не сделали MAXVARS = MAXREGS = 255? :)
я не знаю, я на Lua смотрел последний раз в 2010-х
источник

PS

Peter Sovietov in Compiler Development
Ну я бы не спрашивал что-то сильно специфичное именно для Lua. Это было бы просто неспортивно.
источник

BD

Berkus Decker in Compiler Development
Наверняка царь может ответить на этот вопрос
источник

PS

Pavel Samolysov in Compiler Development
Может за 50 лет программирования уже эмперически вывели что столько регистров и не нужно.
источник

BD

Berkus Decker in Compiler Development
Peter Sovietov
Ну я бы не спрашивал что-то сильно специфичное именно для Lua. Это было бы просто неспортивно.
ну а никаких временных регистров для промежуточных результатов там нет?
источник

PS

Pavel Samolysov in Compiler Development
Вопрос зачем кто-то захомячил 55 регистров, а не 5 или 20?
источник

BD

Berkus Decker in Compiler Development
я не знаю модель исполнения в lua vm
источник

PS

Peter Sovietov in Compiler Development
Berkus Decker
ну а никаких временных регистров для промежуточных результатов там нет?
Вот именно! А ведь хранить эти результаты где-то надо? Вот откуда взялся запас :)
источник

BD

Berkus Decker in Compiler Development
звучит логично
источник

PS

Pavel Samolysov in Compiler Development
Так а что там переменная тогда? Если вирт. Регистр из SSA формы, то разве они не выделяются и под промежуточные значения?
источник