Оптимизатора не обмануть — блог Мэтта Годболта

Оптимизатора не обманешь

Написано мной, проверено LLM.

Подробности в конце.

Иногда вы, просматривая код в отладчике, обнаруживаете сложный на вид цикл… который выполняется как одна инструкция. Компилятор разглядел запутывание и все равно сгенерировал очевидный код.

Рассмотрим этот набор весьма сомнительных процедур беззнакового сложения. – для разнообразия здесь скомпилировано для ARM (в отличие от пример вчерашнего сложения).

Несмотря на то, что это очень разные способы возвращения x + yкомпилятор видит все это и признает, что это всего лишь один add w0, w1, w0 инструкция. Даже рекурсивный add_v4 – который вызывает сам себя – оптимизируется до одной и той же инструкции.

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

Так как же компилятор обнаруживает эти шаблоны? Поддерживает ли он базу данных «глупых способов сложения чисел»? Не совсем. Внутренне он переводит ваш код в промежуточное представление — упрощенную абстрактную форму, которую легче анализировать. Когда компилятор видит цикл while add_v3он преобразует его во что-то вроде «увеличить y на x, затем вернуть y», что затем распознается как математически эквивалентное «вернуть x + y». Этот процесс преобразования различных шаблонов кода в стандартную каноническую форму позволяет компилятору обрабатывать их одинаково. К моменту генерации тайм-кода все четыре функции выглядят для оптимизатора одинаково..

Такое распознавание образов чрезвычайно надежно — компилятор с радостью оптимизирует код, который вы никогда не захотите писать. На протяжении всей этой серии мы увидим, как далеко может завести нас эта канонизация.

Видеть видео которое сопровождает этот пост.


Этот пост третьего дня Появление оптимизаций компилятора в 2025 году25-дневная серия, посвященная тому, как компиляторы преобразуют наш код.

Этот пост написал человек (Мэтт Годболт), а также проверено и вычитано специалистами LLM и людьми.

Поддержка Compiler Explorer включена Патреон
или GitHubили покупая продукцию CE в Магазин компиляторов Explorer
.

2025-12-03 12:14:00


1764765070
#Оптимизатора #не #обмануть #блог #Мэтта #Годболта

Ещё по этой теме

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.