Вывод подпрограммы - PullRequest
       41

Вывод подпрограммы

6 голосов
/ 07 декабря 2011

Есть ли статья, описывающая какой-либо алгоритм / технику для вывода подпрограмм из скомпилированной программы? Другими словами: существует ли алгоритм для поиска блоков кода, которые появляются в программе более одного раза? В этих блоках команды могут быть переупорядочены (без изменения поведения программы, разумеется), чтобы с большей вероятностью найти совпадение.

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

Мне кажется, что это очень сложная теоретическая проблема.

Ответы [ 3 ]

6 голосов
/ 07 декабря 2011

Ну, это интересная проблема.Люди действительно работали над этим.Быстрый поиск возвращает эти два:

Но есть, вероятно, еще много.Вы можете использовать Google Scholar , чтобы найти более свежие статьи, которые ссылаются на эти старые.

3 голосов
/ 07 декабря 2011

То, что вы ищете, называется «детектором клонов». Вы можете сделать это с помощью исходного кода или объектного кода. Основная идея состоит в том, чтобы решить, какие точки изменчивости вы хотите принять.

Вы можете прочитать о нашем детекторе клонов CloneDR , который находит дублированный код, сравнивая синтаксические деревья исходных файлов, находя точные совпадения и совпадения. Это относится ко многим файлам, а не только к одному исходному файлу. Это похоже на обнаружение «общего подвыражения», но оно работает как с объявлениями, так и с исполняемым кодом. Когда совпадение не точное, оно может определить параметры для «подпрограммы» (абстракция).

См. Мою статью о Обнаружении клонов с использованием абстрактных синтаксических деревьев для алгоритмического описания.

CloneDR делает это для многих языков, используя синтаксический анализатор с точным языком .

Сайт описывает, как работает CloneDR, и сравнивает CloneDR с рядом других инструментов обнаружения клонов.

CloneDR не обрабатывает "переупорядочение команд". Менее масштабируемые методы, которые находят дубликаты путем сравнения PDG, могут сделать это. Они очень близки к сравнению графиков потоков данных, которые могут быть полезны для поиска совпадений кода машинной инструкции.

0 голосов
/ 23 декабря 2011

Может быть, это глупо ... но рассмотрим "diff".Это в основном делает ограниченную версию этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...