Термин «мертвый код» имеет несколько определений. Некоторые используют этот термин для обозначения кода (т. е. инструкций в памяти), который никогда не может быть выполнен во время выполнения. [1] [2] [3] В некоторых областях компьютерного программирования «мертвый код» — это раздел исходного кода программы, который выполняется, но результат которого никогда не используется в других вычислениях. [4] [5] Выполнение «мертвого кода» приводит к потере времени вычислений и памяти.
Хотя результат мертвого вычисления может никогда не использоваться, он может вызывать исключения или влиять на некоторое глобальное состояние, поэтому удаление такого кода может изменить вывод программы и внести непреднамеренные ошибки . Оптимизации компилятора обычно консервативны в своем подходе к удалению мертвого кода, если есть какая-либо двусмысленность относительно того, повлияет ли удаление мертвого кода на вывод программы. Программист может помочь компилятору в этом вопросе, дополнительно используя статические и/или встроенные функции и включив использование оптимизации времени компоновки .
int foo ( int iX , int iY ) { int iZ = iX / iY ; вернуть iX * iY ; }
В приведенном выше примере, хотя деление iX на iY вычисляется и никогда не используется, оно выдаст исключение, когда произойдет деление на ноль. Поэтому удаление мертвого кода может изменить вывод программы.
Устранение мертвого кода — это форма оптимизации компилятора , при которой мертвый код удаляется из программы. Анализ мертвого кода может быть выполнен с использованием анализа живых переменных , формы статического анализа кода и анализа потока данных . Это отличается от анализа недостижимого кода, который основан на анализе потока управления .
Метод устранения мертвого кода относится к тому же классу оптимизаций, что и устранение недостижимого кода и устранение избыточного кода .
В крупных проектах программирования иногда сложно распознать и устранить мертвый код, особенно когда целые модули становятся мертвыми. Тестовый скаффолдинг может создать видимость того, что код все еще жив, и порой язык контракта может требовать поставки кода, даже если код больше не актуален. [6]
Некоторые среды разработки (например, Xcode, Visual Studio 2010 [7] и Eclipse Galileo [8] ) имеют возможность обнаруживать мертвый код на этапе компиляции.
В то время как большинство методов оптимизации стремятся удалить мертвый код в реализации, в крайних формах оптимизации по размеру иногда может быть желательно намеренно ввести и тщательно сформировать, казалось бы, мертвый код, когда это позволяет свернуть иначе не связанные разделы кода вместе (и тем самым уменьшить их объединенный размер), так что дополнительный код фактически не будет вредить первому пути выполнения через код, но используется для выполнения действий, необходимых для альтернативных путей выполнения, для которых другие разделы кода могут стать мертвым кодом. На более функциональном уровне это можно рассматривать как искусственное введение безвредных/полезных побочных эффектов и уменьшение избыточности кода, но это также может использоваться вплоть до уровня кода операции, чтобы разрешить использование более коротких инструкций, что было бы невозможно при сворачивании последовательностей кода без согласованного введения побочных эффектов, вызванных мертвым кодом.