Size: a a a

Compiler Development

2020 November 26

PS

Peter Sovietov in Compiler Development
fldlg2
У неё очевидная проблема с иклюзивностью программистов, увы.
Мур на этот счет писал. Цвета можно заменить различными шрифтами, подчеркиванием... Но это мы уже отклонились от темы чата :)
источник

NK

ID:0 in Compiler Development
Распределение регистров - краеугольная задача любого порождающего машинный код компилятора. В работе Linear Scan Register Allocation (1999) был представлен один из двух популярнейших алгоритмов распределения регистров.

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

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

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

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

M

MaxGraey in Compiler Development
Pavel Samolysov
С небольшим удивлением для себя обнаружил, что rustc действительно генерирует практически идентичный выхлоп для кода, написанного в императивном стиле, и для функционального стиля с map'ами и filter'ами. Если честно, думал, что это просто красивые слова. Пример из Rust by Example: https://godbolt.org/z/ox38MP
Так конечно же, там обычные трансдьюсеры на итераторах, что значит, что можно все безболезненно развернуть в один цикл даже если имеються сайд эффекты
источник

PS

Pavel Samolysov in Compiler Development
MaxGraey
Так конечно же, там обычные трансдьюсеры на итераторах, что значит, что можно все безболезненно развернуть в один цикл даже если имеються сайд эффекты
А есть какая-то вводная по трандюсерам? Как это будет trand User?
источник

PS

Peter Sovietov in Compiler Development
Вот мы тут как-то говорили о языке Impala. На мой взгляд, там гораздо более впечатляющие вещи компилятор вытворяет (в том числе с hof), чем Rust :)
источник

AT

Alexander Tchitchigi... in Compiler Development
Pavel Samolysov
А есть какая-то вводная по трандюсерам? Как это будет trand User?
Transducers.
источник

AT

Alexander Tchitchigi... in Compiler Development
Rich Hickey про них в своё время доклад делал. Для разъяснения использовал код на Haskell, потому что без типов чёрт ногу сломит в них.
источник

PS

Pavel Samolysov in Compiler Development
Спасибо
источник

M

MaxGraey in Compiler Development
Peter Sovietov
Вот мы тут как-то говорили о языке Impala. На мой взгляд, там гораздо более впечатляющие вещи компилятор вытворяет (в том числе с hof), чем Rust :)
О да, тот может развовачивать хвостовые рекурсии. Вообще у него IR это SoN только на continuations а не на базовых блоках как в классике
источник

AT

Alexander Tchitchigi... in Compiler Development
@thedeemon_lj помнится, в ЖЖ разъяснял, что трансдьюсеры в Кложе — это недоделанные свёртки инициальных алгебр. В Haskell, понятное дело, используют доделанные.
источник

а

а это кто in Compiler Development
MaxGraey
О да, тот может развовачивать хвостовые рекурсии. Вообще у него IR это SoN только на continuations а не на базовых блоках как в классике
gcc/clang тоже может разворачивать хвостовые рекурсии (и не только хвостовые!), почему это важно? 🤔
источник

а

а это кто in Compiler Development
типа Rust тоже разворачивает, но там из-за деструкторов большинство рекурсий не хвостовые
источник

AT

Alexander Tchitchigi... in Compiler Development
Вы — бот, что ли???
источник

PS

Pavel Samolysov in Compiler Development
а это кто
типа Rust тоже разворачивает, но там из-за деструкторов большинство рекурсий не хвостовые
Так в с++ тоже деструкторы или там они не мешают, не совсем уловил мысль.
источник

D

Danya in Compiler Development
Pavel Samolysov
Так в с++ тоже деструкторы или там они не мешают, не совсем уловил мысль.
Как я понял, проблема в том, что моменты когда вызываются деструкторы в С++ и Раст — отличаются
источник

D

Danya in Compiler Development
В С++ при выходе из скоупа
В Раст либо после использования объекта, либо при выходе из скоупа
источник

h

hazer_hazer in Compiler Development
Alexander Tchitchigin
Вы — бот, что ли???
не похож на любителя компиляторов)
источник

T1

Tony 123 in Compiler Development
Danya
В С++ при выходе из скоупа
В Раст либо после использования объекта, либо при выходе из скоупа
Использования объекта?
источник

M

MaxGraey in Compiler Development
а это кто
gcc/clang тоже может разворачивать хвостовые рекурсии (и не только хвостовые!), почему это важно? 🤔
Вот такое он вряд ли развернет:

isEven(n) {
 return !n ? true : isOdd (n - 1);
}

isOdd(n) {
 return !n ? false : isEven (n - 1);
}

А вот вот IR в Impala с легкостью
источник

D

Danya in Compiler Development
Tony 123
Использования объекта?
Я Раст плохо знаю, но

fn foo(obj : T) { ... }

{
 let obj = ...;
 foo(obj); // объект мувнулся и прекратил свое существование после окончания функции
 ...
 ...
}
источник