Comments 14
Я некоторое время назад написал транспиллер из bf в llvm ir… И было очень интересно смотреть как компилятор выкидывал куски кода заменяя на константы…
Кому-то же надо писать оптимизирующие компиляторы
Красивый и понятный код легче поддерживать, а компилятор и сам неплохо выкинет лишнее.Главное — компилятор ничего не может сделать с вашими структорами данных. Код — да, компилятор уже часто генерирует очень неплохой. А вот понять, что вы тут вычисляете структору в 100 мегабайт только чтобы где-то в другом месте спросить сколько там в ней элементов… он может только в простейших, сильно искусственных случаях.
Ну если таблица используется как просто хранилище данных и не изменяется то компилятор может вытаскивать данные просто по смещению. Но в целом да. Максимум что может так оптимизировать обращение к структуре, тут вы правы.
Программа — это описание закономерностей между входными сайд-эффектами и выходными. Если они не нарушаются, то компилятор может делать что угодно (хоть заменить весь код на GLUT).
… А ещё компилятору разрешено нарушать временные сайд-эффекты, но запрещено нарушать causality.
Как? type propagation или type inference? Если inference — то какой? Hindley-Milner или есть что поинтереснее?
>а multiplied — нет: она начинается с 0 и каждый раз умножается через multiplied = multiplied * count,
Ээээ, нееет. В смысле да, но как мы об этом узнали? Точнее не мы а компилятор. Что стоит за этим выводом — гвоздями прибитый эмпиризм или он на этой же логике выведет str += '' и int += 0?
ну и так далее и тому подобное. /зануда моде офф
В статье про Optimization Pass'ы ни слова про SSA / mSSA / Array-SSA, зато куча байт-кода…
Слишком глубоко копнули без разъяснения теоретических основ, общих оптимизационных задач и практик.
Кое-что компилятор не смог оптимизировать (например, неиспользуемый вызов new PrintLogger)
Есть предположение, что компилятор вынужден был оставить не вызов пустого конструктора, а загрузку класса PrintLogger.
Кстати, что именно вы декомпилировали? Байт-код (результат javac) или результат JIT?
А вот solid код, с минимум побочных эффектов, — это довольно безопасно, масштабируемо, и эффективно. Тот же Burst Compiler — чудесное решение, хоть и сырое.
Как работает оптимизирующий компилятор