Поиск шаблонов в исходном коде - PullRequest
2 голосов
/ 10 февраля 2009

Если бы я хотел узнать о распознавании образов в целом, с чего бы начать (рекомендую книгу)?

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

Спасибо

Редактировать: Я не против математически интенсивных книг. На самом деле, это было бы хорошо.

Ответы [ 8 ]

2 голосов
/ 10 февраля 2009

Если вы достаточно математически уверены в своих силах, то книги Криса Бишопа «Распознавание образов и машинное обучение» или «Нейронные сети для распознавания образов» очень хороши для изучения распознавания образов.

1 голос
/ 10 февраля 2009

Помогает, если у вас есть доступ к дереву разбора, сгенерированному во время компиляции. Таким образом, вы можете искать части дерева, которые похожи, игнорируя узлы, которые глубже, чем вы смотрите, таким образом, вы можете выбрать, например, узлы, которые умножают вместе два подвыражения, игнорируя содержимое подвыражений. Вы можете применить ту же логику к совокупности узлов, например, Вы хотите найти умножение двух подвыражений, где эти два подвыражения являются дополнением большего количества подвыражений. Сначала вы ищите умножения, затем проверяете, являются ли два узла под умножением сложениями, игнорируя что-либо еще глубже.

0 голосов
/ 24 марта 2010

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

CloneDR работает с различными языками: C, C ++, C #, Java, JavaScript, PHP, COBOL, Python, ... На сайте представлены отчеты об обнаружении клонов для различных языков программирования.

0 голосов
/ 10 февраля 2009

Это характерно для .Net и visual studio, но в вашем проекте он находит дублирующийся код. Он сообщает о некоторых ложных срабатываниях, которые я обнаружил, но это может быть хорошим началом.

Детектив-клон

0 голосов
/ 10 февраля 2009

Еще один проект, который вы можете посмотреть, это Duplo - это проект с открытым исходным кодом / GPL, поэтому вы можете изучить их подход, взяв код из SourceForge .

0 голосов
/ 10 февраля 2009

Другие интересные проекты: PMD и Eclipse .

Eclipse использует AST (деревья абстрактного синтаксиса) для всего исходного кода в любом проекте. Инструменты могут затем зарегистрироваться для определенных типов AST (таких как исходный код Java) и получить предварительно обработанное представление, в которое они могут добавить дополнительную информацию (например, ссылки на документацию, маркеры ошибок и т. Д.).

0 голосов
/ 10 февраля 2009

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

0 голосов
/ 10 февраля 2009

Я бы посоветовал взглянуть на код какого-либо проекта с открытым исходным кодом (например, FindBugs или SIM ) это то, о чем вы говорите.

...