Оптимизатор объектного кода , иногда также известный как оптимизатор постпрохода или, для небольших участков кода, оптимизатор peephole , является частью программного компилятора . Он берет выходные данные с этапа компиляции исходного языка — объектный код или двоичный файл — и пытается заменить идентифицируемые участки кода заменяющим кодом, который алгоритмически более эффективен (обычно с улучшенной скоростью).
Примеры
Самый ранний "COBOL Optimizer" был разработан Capex Corporation в середине 1970-х годов для COBOL . Этот тип оптимизатора зависел, в данном случае, от знания "слабых мест" в стандартном компиляторе IBM COBOL и фактически заменял (или исправлял ) разделы объектного кода более эффективным кодом. Заменяющий код мог заменить линейный табличный поиск , например, на двоичный поиск или иногда просто заменить относительно медленную инструкцию известной более быстрой, которая в остальном была функционально эквивалентна в своем контексте. Этот метод теперь известен как снижение прочности . Например, на оборудовании IBM/360CLI инструкция была, в зависимости от конкретной модели, от двух до пяти раз быстрее инструкции CLCдля сравнения отдельных байтов. [1] [2]
Преимущества
Главным преимуществом повторной оптимизации существующих программ было то, что запас уже скомпилированных клиентских программ ( объектный код ) можно было улучшить практически мгновенно с минимальными усилиями, сокращая ресурсы ЦП по фиксированной стоимости (цена фирменного программного обеспечения ). Недостатком было то, что новые выпуски COBOL, например, требовали (платного) обслуживания оптимизатора для обслуживания возможных измененных внутренних алгоритмов COBOL. Однако, поскольку новые выпуски компиляторов COBOL часто совпадали с обновлениями оборудования , более быстрое оборудование обычно более чем компенсировало возврат прикладных программ к их предварительно оптимизированным версиям (до тех пор, пока не был выпущен поддерживающий оптимизатор).
Другие оптимизаторы
Некоторые бинарные оптимизаторы выполняют сжатие исполняемых файлов , что уменьшает размер бинарных файлов с помощью общих методов сжатия данных , снижая требования к хранилищу и время передачи и загрузки, но не улучшая производительность во время выполнения. Фактическая консолидация дублирующихся модулей библиотеки также снизила бы требования к памяти.
Некоторые двоичные оптимизаторы используют метрики времени выполнения ( профилирование ) для интроспективного улучшения производительности с использованием методов, аналогичных JIT- компиляторам.
Последние события
Недавно разработанные «бинарные оптимизаторы» для различных платформ, некоторые из которых заявляют о своей новизне , но, тем не менее, по сути используют те же (или похожие) методы, описанные выше, включают в себя:
BOLT: оптимизатор пост-линковки, построенный на основе фреймворка LLVM . Используя профилирование на основе выборок, BOLT улучшает производительность реальных приложений даже для высокооптимизированных двоичных файлов, созданных как с помощью Feedback Directed Optimization , так и с помощью оптимизации времени компоновки . Для компиляторов GCC и Clang BOLT ускоряет их двоичные файлы до 20,4% поверх FDO и LTO и до 52,1%, если двоичные файлы созданы без FDO и LTO. [13]
^ "The Binary Code Optimizer". Архивировано из оригинала 2010-07-22 . Получено 2010-01-07 .
^ Дюстервальд, Э. (2005). «Проектирование и разработка динамического двоичного оптимизатора». Труды IEEE . 93 (2): 436–448. doi :10.1109/JPROC.2004.840302. S2CID 2217101.
^ Сюй, Чаохао; Ли, Цзяньхуэй; Бао, Тао; Ван, Юнь; Хуан, Бо (2007-06-13). "Оптимизация памяти на основе метаданных в динамическом двоичном трансляторе". Труды 3-й международной конференции по виртуальным средам выполнения - VEE '07 . Ассоциация вычислительной техники. стр. 148–157. doi :10.1145/1254810.1254831. ISBN978-1-59593630-1. S2CID 15234434. Архивировано из оригинала 2021-10-27 . Получено 2021-10-27 – через ACM Digital Library.
^ Панченко, Максим; Олер, Рафаэль; Нелл, Билл; Оттони, Гильерме (2019-02-16). "BOLT: Практический двоичный оптимизатор для центров обработки данных и не только". Международный симпозиум IEEE/ACM по генерации и оптимизации кода (CGO) 2019 года . С. 2–14. arXiv : 1807.06735 . doi :10.1109/CGO.2019.8661201. ISBN978-1-7281-1436-1. S2CID 49869552.