Size: a a a

Compiler Development

2020 May 17

RB

Rustem B. in Compiler Development
просто я вот реально хз на чём можно реализовать компилятор LISP
чтобы потом на нём написать свой же компилятор
источник

RB

Rustem B. in Compiler Development
Rustem B.
просто я вот реально хз на чём можно реализовать компилятор LISP
чтобы потом на нём написать свой же компилятор
и я такой
на чистом ассемблере?
источник

PS

Peter Sovietov in Compiler Development
Rustem B.
типа, если ты пришел из этого блока, то дай мне это, если из того, то другое?
Тут можно еще аналогию из мира функционального программирования привести. "SSA is functional programming", как сказал один умный человек. (то есть для императивных программистов функциональное программирование -- всего-лишь промежуточное представление, на котором они напрямую брезгуют писать код ;)

Итак, в чистом ФП у нас есть имена и значения, а не императивные переменные, нет "разрушающего присваивания". И если мы видим что-то в духе:

x = 1
y = x + 2
x = 4

То необходимо переименовать соответствующие переменные (одно из древнейших и очень мощных компиляторных преобразований).

x = 1
y = x + 2
x1 = 4

Вот, теперь у нас снова код по канонам ФП. Но что делать с ветвлениями?

x = 1
if (y > 2) {
 x = x + 1
} else {
 x = y
}
z = x

Пробуем заняться переименованиями.

x = 1
if (y > 2) {
 x1 = x + 1
} else {
 x2 = y
}
z = x // x1 или x2?

Вот тут phi-функция и нужна, она "знает", откуда именно пришло управление в данный момент. То есть нужна она именно на этапе слияния потоков управления, когда возникает неоднозначность с выбором имен (здесь для двух блоков -- if и else).
На самом деле, в духе ФП можно было бы поступить и интереснее, с помощью ANF или же использовать стековое представление, как в WASM, но это уже другая история.
источник

RB

Rustem B. in Compiler Development
ага, спасибо, понял
источник

M

MaxGraey in Compiler Development
Peter Sovietov
Тут можно еще аналогию из мира функционального программирования привести. "SSA is functional programming", как сказал один умный человек. (то есть для императивных программистов функциональное программирование -- всего-лишь промежуточное представление, на котором они напрямую брезгуют писать код ;)

Итак, в чистом ФП у нас есть имена и значения, а не императивные переменные, нет "разрушающего присваивания". И если мы видим что-то в духе:

x = 1
y = x + 2
x = 4

То необходимо переименовать соответствующие переменные (одно из древнейших и очень мощных компиляторных преобразований).

x = 1
y = x + 2
x1 = 4

Вот, теперь у нас снова код по канонам ФП. Но что делать с ветвлениями?

x = 1
if (y > 2) {
 x = x + 1
} else {
 x = y
}
z = x

Пробуем заняться переименованиями.

x = 1
if (y > 2) {
 x1 = x + 1
} else {
 x2 = y
}
z = x // x1 или x2?

Вот тут phi-функция и нужна, она "знает", откуда именно пришло управление в данный момент. То есть нужна она именно на этапе слияния потоков управления, когда возникает неоднозначность с выбором имен (здесь для двух блоков -- if и else).
На самом деле, в духе ФП можно было бы поступить и интереснее, с помощью ANF или же использовать стековое представление, как в WASM, но это уже другая история.
Ну в wasm есть CFG с if / else / than, еще там есть инструкция select которая как раз очень напоминает phi функцию
источник

PS

Peter Sovietov in Compiler Development
MaxGraey
Ну в wasm есть CFG с if / else / than, еще там есть инструкция select которая как раз очень напоминает phi функцию
Я как раз про if, которая возвращает значение на стеке, и говорил :)
источник

M

MaxGraey in Compiler Development
точно!
источник

PS

Peter Sovietov in Compiler Development
Короче говоря, все беды от именованных переменных.
источник

RB

Rustem B. in Compiler Development
Rustem B.
просто я вот реально хз на чём можно реализовать компилятор LISP
чтобы потом на нём написать свой же компилятор
так что лучше подойдёт?
источник

RB

Rustem B. in Compiler Development
по крайней мере для бутстрапа
источник

RB

Rustem B. in Compiler Development
ок 😐
источник

A

Alex in Compiler Development
Bulba
Нашел здоровскую ссылку, была тут?
Ссылка крутая, а вдруг у кого похожая ссылка про gcc'шный GENERIC завалялась?
источник

PS

Peter Sovietov in Compiler Development
Alex
Ссылка крутая, а вдруг у кого похожая ссылка про gcc'шный GENERIC завалялась?
А gccint недостаточно? Или хочется с примерами?
Вообще, GENERIC ближе к (гипотетическому) Clang IR, а не к LLVM IR.
источник

A

Alex in Compiler Development
Вообще нет. gccint очень неполный (т.е. там может просто не быть упоминания функций, использующихся по факту), и да, хочется с примерами. Я нашёл некоторое количество разных примеров создания фронтендов, но пока что ничего близкого к приведённой ссылке не встречал
источник

SM

Sailor Moon in Compiler Development
Aleksey Shipilev
А вот что, учат элементарную схемотехнику в универах нынче? Я помню лабораторные, где в эмуляторах собирали и отлаживали 4-битные компьютеры. Хорошее развлечение!
Учат - меня учили строить процессор в эмуляторе лоджисим. А до этого было пол семестра про схемы не связанные с логическими операторами, типа про транзисторы, диоды. Мне было интересно, хотя сомневаюсь что когда нибудь пригодится
источник

PS

Peter Sovietov in Compiler Development
Alex
Вообще нет. gccint очень неполный (т.е. там может просто не быть упоминания функций, использующихся по факту), и да, хочется с примерами. Я нашёл некоторое количество разных примеров создания фронтендов, но пока что ничего близкого к приведённой ссылке не встречал
К счастью, сегодня все меньше объективных причин залезать во внутренности gcc. А у Вас какая причина, если не секрет?

Как было бы здорово, если бы в начале 2000-х "сообщество" обратило бы внимание на libFirm! Возможно, и LLVM бы тогда вовсе не появился в том виде, как мы его знаем :)
источник

A

Alex in Compiler Development
Peter Sovietov
К счастью, сегодня все меньше объективных причин залезать во внутренности gcc. А у Вас какая причина, если не секрет?

Как было бы здорово, если бы в начале 2000-х "сообщество" обратило бы внимание на libFirm! Возможно, и LLVM бы тогда вовсе не появился в том виде, как мы его знаем :)
У меня - чисто любопытство, сейчас ради интереса пытаюсь прикрутить фронтенд к gcc. И в этом плане от количества документации и актуальности примеров хочется плакать. Продвигаться приходится методом "тыка" и переносом каких-то функций из учебного языка tiny и go в собственный код.
источник

PS

Peter Sovietov in Compiler Development
Sailor Moon
Учат - меня учили строить процессор в эмуляторе лоджисим. А до этого было пол семестра про схемы не связанные с логическими операторами, типа про транзисторы, диоды. Мне было интересно, хотя сомневаюсь что когда нибудь пригодится
Фундаментальные знания — это всегда хорошо. Тем более, что сейчас популярны FPGA — вот и возможность применить уроки цифровой схемотехники, разработки ЯП и компиляторов. У ныне покойного автора Erlang последний твит я считаю пророческим: https://twitter.com/joeerl/status/1115990630793207808
источник

PS

Peter Sovietov in Compiler Development
Alex
У меня - чисто любопытство, сейчас ради интереса пытаюсь прикрутить фронтенд к gcc. И в этом плане от количества документации и актуальности примеров хочется плакать. Продвигаться приходится методом "тыка" и переносом каких-то функций из учебного языка tiny и go в собственный код.
Это да. Казалось бы — ну предложите промежуточный язык, дайте его строгое БНФ-описание. Позвольте компиляторщикам-любителям напрямую передавать свои сгенерированные программы прямо в текстовом виде на этом языке в ваш модуль компилятора... :)
источник

A

Alex in Compiler Development
Да я то с одной стороны могу понять что сделать документацию сложно, а есть куча других интересных задач. Но всё равно как только подходишь к этому со стороны "прикрутить к проекту" - сразу боль и страдание
источник