Size: a a a

Compiler Development

2021 March 13

IP

Iaroslav Postovalov in Compiler Development
А языки делают для людей, а не парсеров
источник

ДК

Дмитрий К in Compiler Development
Честно говоря и парсеру и человеку тут всё ясно - если квадратная скобка идёт в начале (под)выражения, то это создание массива, а если продолжает существующее, то взятие среза/индексация.
источник

K

Kir in Compiler Development
Дмитрий К
Честно говоря и парсеру и человеку тут всё ясно - если квадратная скобка идёт в начале (под)выражения, то это создание массива, а если продолжает существующее, то взятие среза/индексация.
You have 34 shift/reduce conflicts.
источник

ДК

Дмитрий К in Compiler Development
Вот, кстати, будет ли это срез или индексация определяется сильно после, да. Хотя, можно и не разделять эти вещи и понимать срез как индексацию диапазоном.
источник

ДК

Дмитрий К in Compiler Development
Kir
You have 34 shift/reduce conflicts.
Хоть один пример?
источник

K

Kir in Compiler Development
Дмитрий К
Вот, кстати, будет ли это срез или индексация определяется сильно после, да. Хотя, можно и не разделять эти вещи и понимать срез как индексацию диапазоном.
You have 75 shift/reduce conflicts and 3 reduce/reduce conflicts.
источник

K

Kir in Compiler Development
Конфликты - вещь забавная, на самом деле. Классика жанра это

expr -> "if" expr "then" expr "else" expr
expr -> "if" expr "then" expr
expr -> term
источник

K

Kir in Compiler Development
Потому что в обоих ветках "else" входит в lookahead set.
источник

f

for(int c; (c = getc... in Compiler Development
Я правильно понимаю что для интерпретации на регистровой ВМ мне нужно использовать те же методы что и для обычного компилятора, с единственным исключением что операнды могут быть какими-то сложными структурами?

Я посмотрел как это реализовано в lua - там значение это тегированое объединение из нескольких базовых типов данных (таблица для сложных структур). В nim тоже самое - сумма базовых типов данных (и AST для сложных структур данных).

И сам код это просто последовательность uint64 из которой потом получают номера регистров и код операции.
источник

f

for(int c; (c = getc... in Compiler Development
И соответственно компиляция в код для ВМ использует все те же подходы (в т.ч. нужна аллокация регистров)
источник

AT

Alexander Tchitchigi... in Compiler Development
for(int c; (c = getchar()) != EOF;)
И соответственно компиляция в код для ВМ использует все те же подходы (в т.ч. нужна аллокация регистров)
Ну, тут два варианта. Можно сделать ВМ с бесконечным количеством регистров (в Lua почти так и сделали) -- распределять их не нужно, но тогда не получится отмапить на реальные регистры. Либо да, как у "взрослых" компиляторов с распределением и спиллингом.
источник

AT

Alexander Tchitchigi... in Compiler Development
Хотя есть и компромиссные варианты когда вершина стека/аккумулятор хранится в регистре, а остальное -- как обычно. Может, и более хитрые схемы встречаются.
источник

f

for(int c; (c = getc... in Compiler Development
В таком случае наверное имеет смысл написать простой вариант с бесконечными регистрами и затем добавить распределение и т.д., так как я в дальнейшем хочу перейти от интерпретации, так что с этим все равно нужно будет разобраться.
источник

AT

Alexander Tchitchigi... in Compiler Development
for(int c; (c = getchar()) != EOF;)
В таком случае наверное имеет смысл написать простой вариант с бесконечными регистрами и затем добавить распределение и т.д., так как я в дальнейшем хочу перейти от интерпретации, так что с этим все равно нужно будет разобраться.
Telegram
PLComp
Распределение регистров - краеугольная задача любого порождающего машинный код компилятора. В работе Linear Scan Register Allocation (1999) был представлен один из двух популярнейших алгоритмов распределения регистров.

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

Благодаря своим свойствам алгоритм стал стандартным решением в динамических (just-in-time) и легковесных компиляторах.

Из известных компиляторов линейное сканирование используется, например, в luajit или Hotspot.

#history #registerallocation #linearscan
источник

AT

Alexander Tchitchigi... in Compiler Development
Ну и далее там же можно найти ещё немало ссылок. 😉
источник

J

JohnByte in Compiler Development
Дмитрий К
По этой причине, кстати, в D отказались от угловых скобочек для обрамления статических параметров в пользу круглых и квадратных, которые всегда парные и не являются самостоятельными инфиксными операторами.
Даешь {{ smth }} !
источник

J

JohnByte in Compiler Development
Или как в Zig, помечать некоторые параметры вычислимыми на стадии компиляции
источник

ДК

Дмитрий К in Compiler Development
JohnByte
Или как в Zig, помечать некоторые параметры вычислимыми на стадии компиляции
Вот, кстати, да. Правда тогда придётся позволить принимать в параметрах не только значения, но и типы.
источник

TP

Tim Plotnikov in Compiler Development
Господа, такой может глупый вопрос: если я пишу компилятор на каком-то языке, могу я в теории использовать свойства этого языка в своём компиляторе?
Ну типа там пишешь на расте и добавляешь к себе в язык его borrow checker?
источник

K

Kir in Compiler Development
Tim Plotnikov
Господа, такой может глупый вопрос: если я пишу компилятор на каком-то языке, могу я в теории использовать свойства этого языка в своём компиляторе?
Ну типа там пишешь на расте и добавляешь к себе в язык его borrow checker?
Не-а.
источник