Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В теории компиляторов , устранении мертвых коды (также известный как АКД , мертвое удаление кода , мертвый код вскрышного или мёртвый код полоса ) является оптимизация компилятор для удаления кода , который не влияет на результатах программы. Удаление такого кода имеет несколько преимуществ: оно уменьшает размер программы, что является важным соображением в некоторых контекстах, и позволяет запущенной программе избегать выполнения нерелевантных операций, что сокращает время ее выполнения. Он также может обеспечить дальнейшую оптимизацию за счет упрощения структуры программы. Мертвый код включает в себя код, который никогда не может быть выполнен ( недоступный код ), и код, который влияет только намертвые переменные (записываются, но никогда не читаются снова), то есть не относящиеся к программе.

Примеры [ править ]

Рассмотрим следующий пример , написанный на C .

 INT  Foo ( недействительными )  {  Int  = 24 ; int b = 25 ; / * Присвоение мертвой переменной * / int c ; с = а * 4 ; return c ; b = 24 ; / * Недостижимый код * / return 0 ; }                       

Простой анализ использования значений покажет, что значение bпосле первого присваивания не используется внутри foo. Кроме того, bон объявлен как локальная переменная внутри foo, поэтому его значение нельзя использовать снаружи foo. Таким образом, переменная bявляется мертвым и оптимизатор может вернуть себе место для хранения и устранить его инициализации.

Более того, поскольку первый оператор return выполняется безоговорочно, ни один из возможных путей выполнения не достигает второго присвоения b. Таким образом, назначение недоступно и может быть удалено. Если у процедуры был более сложный поток управления , такой как метка после оператора return и gotoгде- то еще в процедуре, то возможный путь выполнения мог бы существовать для присвоения b.

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

У большинства продвинутых компиляторов есть опции для активации удаления мертвого кода, иногда на разных уровнях. Более низкий уровень может удалять только те инструкции, которые не могут быть выполнены. Более высокий уровень также может не резервировать место для неиспользуемых переменных. Еще более высокий уровень может определять инструкции или функции, которые не служат цели, и устранять их.

Обычно удаление мертвого кода используется как альтернатива необязательному включению кода через препроцессор . Рассмотрим следующий код.

 int  main ( void )  {  int  a  =  5 ;  int  b  =  6 ;  int  c ;  с  =  а  *  ( b  /  2 );  if  ( 0 )  {  / * ОТЛАДКА * /  printf ( "% d \ n " ,  c );  }  return  c ;  }

Поскольку выражение 0 всегда будет иметь значение false , код внутри оператора if никогда не может быть выполнен, и удаление мертвого кода полностью удалит его из оптимизированной программы. Этот метод является обычным при отладке, чтобы дополнительно активировать блоки кода; использование оптимизатора с устранением мертвого кода устраняет необходимость использования препроцессора для выполнения той же задачи.

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

Исторически устранение мертвого кода выполнялось с использованием информации, полученной в результате анализа потока данных . [2] Алгоритм, основанный на статической форме единого назначения (SSA), представлен в оригинальной журнальной статье о форме SSA, написанной Роном Ситроном и др. [3] Роберт Шиллингсбург (он же Шилльнер) улучшил алгоритм и разработал сопутствующий алгоритм для удаления бесполезных операций потока управления. [4]

Динамическое устранение мертвого кода [ править ]

Мертвый код обычно считается мертвым безоговорочно . Следовательно, разумно попытаться удалить мертвый код путем удаления мертвого кода во время компиляции .

Однако на практике разделы кода часто представляют мертвый или недоступный код только при определенных условиях , которые могут быть неизвестны во время компиляции или сборки. Такие условия могут быть наложены различными средами выполнения (например, разными версиями операционной системы или различными наборами и комбинациями драйверов или служб, загруженными в конкретной целевой среде), что может потребовать различных наборов особых случаев в коде, но при заодно стали условно мертвым кодом для остальных случаев. [5] [6]Кроме того, программное обеспечение (например, драйвер или резидентная служба) можно настраивать для включения или исключения определенных функций в зависимости от предпочтений пользователя, делая неиспользуемые части кода бесполезными в конкретном сценарии. [5] [6] Хотя модульное программное обеспечение может быть разработано для динамической загрузки библиотек только по запросу, в большинстве случаев невозможно загрузить только соответствующие подпрограммы из конкретной библиотеки, и даже если это будет поддерживаться, подпрограмма может по-прежнему включать разделы кода, которые можно считать мертвым кодом в данном сценарии, но нельзя было исключить уже во время компиляции.

Методы, используемые для динамического обнаружения спроса, выявления и разрешения зависимостей, удаления такого условно мертвого кода и рекомбинации оставшегося кода при загрузке или во время выполнения , называются динамическим устранением мертвого кода [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] или динамическое устранение мертвых инструкций . [18]

Большинство языков программирования, компиляторов и операционных систем не предлагают или почти не поддерживают больше, чем динамическая загрузка библиотек и поздняя компоновка , поэтому программное обеспечение, использующее динамическое удаление мертвого кода, очень редко встречается в сочетании с языками, скомпилированными заранее или написанными на языке ассемблера . [7] [11] [8] Однако языковые реализации, выполняющие своевременную компиляцию, могут динамически оптимизироваться для устранения мертвого кода. [17] [19] [20]

Подобные подходы иногда используются для динамического обновления программного обеспечения и установки «горячих» исправлений, хотя и имеют несколько иную направленность .

См. Также [ править ]

  • Резервный код
  • Упрощение (символьное вычисление)
  • Устранение частичной избыточности
  • Устранение конъюнкции
  • Динамическое обновление ПО
  • Динамическая связь (вычисления)
  • Программное обеспечение
  • Дерево трясется
  • Постпроходная оптимизация
  • Профильная оптимизация
  • Супероптимизатор
  • Сжатие сборки мусора

Ссылки [ править ]

  1. ^ Аллен, Фрэнсис; Кок, Джон ; Кеннеди, Кен (июнь 1981 г.). «Снижение силы оператора». В Джонс, Нил Д .; Мучник, Стивен Стэнли (ред.). Анализ потока программы: теория и применение . Прентис-Холл . ISBN 0-13729681-9.
  2. ^ Кеннеди, Кен (июнь 1981). «Обзор методов анализа потока данных». В Джонс, Нил Д .; Мучник, Стивен Стэнли (ред.). Анализ потока программы: теория и применение . Прентис-Холл . ISBN 0-13729681-9.
  3. ^ Cytron, Рон К .; Ферранте, Жанна ; Розен, Барри К .; Задек, Ф. Кеннет (1991). Эффективное вычисление статической формы единственного назначения и графика зависимости программы . ACM TOPLAS 13 (4).
  4. ^ Купер, Кейт Д .; Торчон, Линда (2003) [01.01.2002]. Разработка компилятора . Морган Кауфманн . стр. 498ff. ISBN 978-1-55860698-2.
  5. ^ a b c Пол, Матиас Р. (03.04.2002) [18.06.2001]. "[fd-dev] Ctrl + Alt + Del" . freedos-dev . Архивировано 9 сентября 2017 года . Проверено 9 сентября 2017 . […] Любой из […] параметров может быть «навсегда» исключен во время установки (также будет сохранена память для соответствующих фрагментов кода благодаря нашему динамическому устранению мертвого кода), или его можно отключить или включить в любое время с помощью функций API, если кто-то захочет помешать пользователю перезагрузить компьютер. […] Мы рассматриваем возможность добавления большего количества синхронных вызовов очистки кеша […] Благодаря нашему методу динамического удаления мертвого кода это не вызовет какого-либо вздутия, если оно не требуется в конкретной целевой конфигурации, поскольку конкретный вызов очистки кеша будет включен в Образ времени выполнения FreeKEYB только в том случае, если соответствующий дисковый кеш также загружен или FreeKEYB получил указание с помощью переключателей командной строки загрузить соответствующую поддержку.
  6. ^ a b c Пол, Матиас Р. (2002-04-06). "[fd-dev] Ctrl + Alt + Del" . freedos-dev . Архивировано 27 апреля 2019 года . Проверено 27 апреля 2019 .[…] FreeKEYB создает образ среды выполнения драйвера во время инициализации в зависимости от типа компьютера, на котором он загружается, типа клавиатуры, раскладки, страны и используемой кодовой страницы, типа установленной мыши и видеоадаптера (ов), другие драйверы, загруженные в эту систему, операционная система и используемые методы загрузки и перемещения, отдельные включенные функции и параметры конфигурации, указанные в командной строке. Из-за большого количества поддерживаемых переключателей и параметров командной строки […] (около пятидесяти переключателей […] с множеством возможных настроек) существует большое количество комбинаций функций с бесчисленными зависимостями […], что приводит к […] бесконечному количеству [ …] Разные целевые изображения. FreeKEYB 's Техника динамического удаления мертвого кода позволяет разрешить […] эти […] зависимости и […] удалить мертвый код и данные […] не ограничиваются […] включать или исключать несколько ограниченное количество модулей или целых подпрограмм и исправить некоторые таблицы диспетчеризации, как в классическом программировании TSR,но […] работает […] на […] байтовом уровне […] может удалять […] отдельные инструкции в середине более крупных подпрограмм […], распределенных по всему коду, для обработки конкретного случая или поддержки определенной функции [ …] Специальные инструменты используются для анализа кода […] и создания […] таблиц исправлений […] автоматически […] с использованием условных определений […] для объявления различных случаев […] не только необязательными во время сборки, но и при инициализации время […] без накладных расходов […] наличия хотя бы некоторого количества мертвого кода, оставшегося в образе среды выполнения […], чтобы отслеживать все зависимости между […] этими условными выражениями, динамически создавать и перемещать образ среды выполнения, исправлять вверх все ссылки между этими маленькими, изменяющимися и движущимися двоичными частями […], все еще позволяя использовать крошечный .COM /.Модель стиля SYS […] […] выполняется во время инициализации […] API для импорта и экспорта структур объектов между FreeKEYB и вызывающим приложением […] для прозрачного изменения размера и перемещения их внутри […] во время выполнения […]
  7. ^ a b Пол, Маттиас Р .; Фринке, Аксель К. (1997-10-13) [впервые опубликовано в 1991 году], FreeKEYB - Enhanced DOS keyboard and console driver (User Manual) (v6.5 ed.) [1] (NB. FreeKEYB - это основанный на Unicode динамически конфигурируемый преемник K3PLUS, поддерживающий большинство раскладок клавиатуры , кодовых страниц и кодов стран . Использование готового макроса ассемблера, а также рамки автоматической предварительной и последующей обработки инструменты анализа обработки для генерации метаданных зависимостей и преобразования кода для встраивания в исполняемый файл вместе с двоичным кодом и самоуничтожающимся, расслабляющим и перемещаемым загрузчиком , драйвер реализует гранулированное динамическое устранение мертвого кода на уровне байтов иметоды перемещения во время загрузки, а также самомодифицирующийся код и реконфигурируемость во время выполнения для минимизации занимаемой им памяти до закрытия канонической формы в зависимости от базового оборудования, операционной системы и конфигурации драйвера, а также выбранного набора функций и локали (около шестидесяти переключателей конфигурации с сотнями вариантов практически неограниченного количества возможных комбинаций). Эта сложность и динамика скрыты от пользователей, которые работают с одним исполняемым файлом так же, как с обычным драйвером. K3PLUS был расширенным драйвером клавиатуры для DOS.широко распространенный в то время в Германии, с доступной адаптацией к некоторым другим европейским языкам. Он уже поддерживал подмножество функций, но не реализовывал динамическое удаление мертвого кода.)
  8. ^ a b Пол, Маттиас Р. (10 апреля 2001 г.). «[ANN] Выпущена 6-я бета-версия FreeDOS» (на немецком языке). Группа новостейde.comp.os.msdos . Архивировано 9 сентября 2017 года . Проверено 2 июля 2017 . […] Brandneue [s] Feature, der Dynamischen Dead-Code-Elimination , die jeweils notwendigen Bestandteile des Treibers erst zum Installationszeitpunkt zusammenbastelt und reloziert, so daß keine ungenutzten Code- oder Datenbereiche mehr resident besentimesBeibn Feature nicht benötigt). […](NB. Это первая известная реализация гранулированного динамического удаления мертвого кода на уровне байтов для программного обеспечения, собранного или скомпилированного заблаговременно .)
  9. ^ Пол, Matthias R. (2001-08-21). "[fd-dev] Изменение кодовых страниц в FreeDOS" . freedos-dev . Архивировано 19 апреля 2019 года . Проверено 20 апреля 2019 . […] […] Уникальная функция […], которую мы называем динамическим устранением мертвого кода, чтобы вы могли во время установки […] указать, какие компоненты драйвера вам нужны, а какие нет. Это доходит до степени динамической загружаемой модульности и поздней компоновки, которых я до сих пор не видел в DOS. Если вам не нравятся заставка, макросы, калькулятор, поддержка мыши или <почти что-нибудь еще>, вы можете указать это в командной строке, и FreeKEYB, принимая во внимание все зависимости между подпрограммами, будет полностью удалите все фрагменты кода, которые имеют дело с этой функцией и не являются необходимыми для обеспечения запрошенной функциональности, прежде чем драйвер переместит изображение в целевое местоположение и станет резидентным. Удаление некоторых более мелких функций экономит всего пару байтов, но исключение более сложных компонентов может сэкономить пол КБ и более.Вы также можете указать размер областей данных […]
  10. ^ Пол, Матиас Р. (2001-12-30). "Внутренняя структура KEYBOARD.SYS" . Группа новостейcomp.os.msdos.programmer . Архивировано 9 сентября 2017 года . Проверено 3 июля 2017 . […] Загрузчик будет динамически оптимизировать резидентные области данных и разделы кода на уровне байтов, чтобы удалить любую избыточность из драйвера в зависимости от данной конфигурации оборудования / программного обеспечения / драйвера и локали. […]
  11. ^ a b Пол, Маттиас Р .; Фринке, Аксель К. (16 января 2006 г. ), FreeKEYB - Расширенный международный драйвер клавиатуры и консоли DOS (Руководство пользователя) (предварительная редакция версии 7 ).
  12. ^ Пол, Матиас Р. (2002-02-02). «Treiber Dynamisch nachladen (Внутрисегментное смещение-перемещение из загруженных TSR в HMA)» [Динамическая загрузка драйверов (перемещение внутрисегментного смещения для загрузки TSR в HMA)] (на немецком языке). Группа новостейde.comp.os.msdos . Архивировано 9 сентября 2017 года . Проверено 2 июля 2017 .
  13. ^ Пол, Matthias R. (2002-02-24). "Информация GEOS / NDO для RBIL62?" . Группа новостейcomp.os.geos.programmer . Архивировано 20 апреля 2019 года . Проверено 20 апреля 2019 . […] Поскольку FreeKEYB использует наше динамическое устранение мертвого кода для оптимизации своего образа памяти для целевой среды во время загрузки, я определенно хотел бы добавить специальную поддержку FreeKEYB для GEOS, которой можно было бы управлять с помощью параметра командной строки, поэтому дополнительный код загружается только при использовании GEOS. […]
  14. ^ Пол, Матиас Р. (2002-03-15). "Слой клавиатуры AltGr под GEOS?" . Группа новостейcomp.os.geos.misc . Архивировано 20 апреля 2019 года . Проверено 20 апреля 2019 . […] Я хотел бы добавить специальные перехватчики в FreeKEYB, наш очень продвинутый драйвер клавиатуры для DOS, если бы это улучшило удобство использования под GEOS […] Благодаря нашему новому сложному динамическому устранению мертвого кодатехнология, которая удаляет на уровне байтов любые фрагменты кода, которые не используются в конкретном драйвере, пользователе или конфигурации системы и аппаратной среде, когда установщик драйвера создает и перемещает свой загрузочный образ, это не повлияет на память для пользователей, не использующих GEOS. , так что не о чем беспокоиться (объем памяти и т. д.), как в традиционно кодируемых драйверах DOS. […]
  15. ^ Thammanur, Sathyanarayan (2001-01-31). Своевременная структура распределения регистров и оптимизации кода для встроенных систем (диссертация MS). Университет Цинциннати , Инженерия: Компьютерная инженерия. ucin982089462. [2] [3]
  16. ^ Glew, Энди (2011-03-02). «Динамическое устранение мертвого кода и будущее оборудования» . [4] [5]
  17. ^ a b Конвей, Эндрю (1995-12-04). «Циклические структуры данных» . Группа новостейcomp.lang.functional . Архивировано 9 сентября 2017 года . Проверено 3 июля 2017 . […] Ленивое вычисление - это, по сути, динамическое устранение мертвого кода . […](NB. Возможно, первое публичное использование термина динамическое устранение мертвого кода , но только концептуально и с акцентом на ленивую оценку на функциональных языках .)
  18. ^ Баттс, Дж. Адам; Сохи, Гури (октябрь 2002 г.). «Динамическое обнаружение и устранение мертвых инструкций» (PDF) . Сан-Хосе, Калифорния, США: Департамент компьютерных наук, Университет Висконсин-Мэдисон . ASPLOS X ACM 1-58113-574-2 / 02/0010 . Архивировано (PDF) из оригинала 20.04.2019 . Проверено 23 июня 2017 .
  19. ^ Джонг, Йессон; Даниэльссон, Пер; Ehnsiö, Per; Херманссон, Матс; Джоланки, Мика; Мур, Скотт; Страндер, Ларс; Веттергрен, Ларс (2008-11-08). «Глава 5. Обзор Java и реализация iSeries - 5.1.1. Разные компоненты». Intentia Movex Java на сервере IBM iSeries - Руководство по внедрению - Обзор Movex Java на сервере iSeries - Movex Java при установке и настройке iSeries - Рабочие советы и методы (PDF) . Красные книги. IBM Corp. стр. 41. ISBN  0-73842461-7. SG24-6545-00. Архивировано (PDF) из оригинала на 2013-10-08 . Проверено 20 апреля 2019 . [6]
  20. ^ Политыло, Гильермо (2015). «Поддержка виртуализации для специализации и расширения среды выполнения приложений - языки программирования» (PDF) . Университет наук и технологий Лилля . С. 111–124. HAL Id: tel-01251173. Архивировано (PDF) из оригинала 23.06.2017 . Проверено 23 июня 2017 .

Дальнейшее чтение [ править ]

  • Бодик, Растислав; Гупта, Раджив (июнь 1997 г.). «Частичное устранение мертвого кода с помощью преобразований нарезки». Материалы конференции ACM SIGPLAN 1997 по проектированию и реализации языков программирования (PLDI '97) : 682–694.
  • Ахо, Альфред Вайно ; Сетхи, Рави ; Ульман, Джеффри Дэвид (1986). Компиляторы - принципы, методы и инструменты . Издательство Эддисон Уэсли . ISBN 0-201-10194-7.
  • Мучник, Стивен Стэнли (1997). Расширенный дизайн и реализация компилятора . Издательство Морган Кауфманн . ISBN 1-55860-320-4.
  • Грун, Дик ; Бал, Анри Эль ; Джейкобс, Кериэль Дж. Х .; Лангендоэн, Коэн Г. (2000). Современный дизайн компилятора . ISBN компании John Wiley & Sons, Inc.  0-471-97697-0.
  • Кеннеди, Кен ; Аллен, Рэнди (2002). «Глава 4.4. Анализ потока данных - Глава 4.4.2. Устранение мертвого кода». Оптимизация компиляторов для современных архитектур: подход, основанный на зависимостях (цифровая печать 2011 г., 1-е изд.). Academic Press / Morgan Kaufmann Publishers / Elsevier . С.  137 , 145–147, 167. ISBN 978-1-55860-286-1. LCCN  2001092381 .

Внешние ссылки [ править ]

  • Как заставить компиляторы C / C ++ генерировать ужасный код?