2009-02-10 3 views
2

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

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

Благодарности

Edit: Я не возражаю, математически интенсивные книги. На самом деле это было бы хорошо.

ответ

2

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

+0

Я не думаю, что это было бы очень эффективно для исходного кода, особенно для больших систем. Сколько входов делает нейронную сеть проверять миллион строк кода? Сколько выходных узлов у него было бы, и что бы они хотели бы узнать? См. Ответ CloneDR для практического инструмента, который делает это хорошо (не используя нейронные сети). –

+0

Вполне возможно, что проблема представления не будет тривиальной. Но, с другой стороны, использование продукта, который вы продаете, не поможет помоему, узнав об общем распознавании образов. :-) –

+0

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

0

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

0

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

0

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

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

1

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

+0

«Ищите куски дерева, которые похожи». Одно дело сказать это, совсем другое, чтобы эффективно реализовать его. См. Ответ CloneDR, который делает именно это. –

0

Другой проект, который вы можете посмотреть, это Duplo - это проект с открытым исходным кодом/GPL, поэтому вы можете порывать их подход, захватив код с SourceForge.

0

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

Clone Detective

0

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

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

Смежные вопросы