Подтвердить что ты не робот

Код для идентификации языка программирования в текстовом файле

Я должен написать код, который при заданном текстовом файле (исходный код) в качестве ввода выводит, какой язык программирования он является. Это самое основное определение проблемы. Далее следуют следующие ограничения:

  • Я должен написать это на С++.
  • Необходимо распознавать широкий спектр языков - html, php, perl, ruby, C, С++, Java, С#...
  • Количество ложных срабатываний (неправильное распознавание) должно быть низким - лучше выводить "неизвестный", чем неправильный результат. (он будет в списке вероятностей, например, как неизвестно: 100%, см. ниже).
  • Вывод должен быть списком вероятностей для каждого языка, который знает код, поэтому, если он знает C, Java и Perl, вывод должен быть, например: C: 70%, Java: 50%, Perl: 30% ( обратите внимание, что нет необходимости иметь сумму вероятностей до 100%)
  • Он должен иметь хорошее соотношение точности/скорости (скорость немного предпочтительнее).

Было бы очень приятно, если бы код мог быть написан таким образом, что добавление новых языков для распознавания будет довольно простым и включает просто добавление "настроек/данных" для этого конкретного языка. Я могу использовать что угодно - эвристику, нейронную сеть, черную магию. Что-нибудь. Я даже разрешил использовать существующие решения, но: решение должно быть бесплатным, открытым исходным кодом и разрешать коммерческое использование. Он должен быть в виде легко интегрируемого исходного кода или как статическая библиотека - не DLL. Однако я предпочитаю писать свой собственный код или просто использовать фрагменты другого решения, мне надоело интегрировать код других. Последнее замечание: возможно, некоторые из вас предложит FANN (быструю искусственную библиотеку нейронных сетей) - это единственное, что я не могу использовать, так как это то, что мы используем УЖЕ, и мы хотим это заменить.

Теперь возникает вопрос: как бы вы справились с такой задачей, что бы вы сделали? Любые предложения, как реализовать это или что использовать?

EDIT:, основываясь на комментариях и ответах, я должен подчеркнуть некоторые вещи, которые я забыл: скорость очень важна, так как это будет получать тысячи файлов и должно отвечать быстро, поэтому, глядя на тысячу файлы должны давать ответы для всех из них за несколько секунд (размер файлов будет небольшим, конечно, по несколько килобайт каждый). Поэтому пытаться скомпилировать каждый из них не может быть и речи. Дело в том, что я действительно хочу вероятности для каждого языка - поэтому я скорее хочу знать, что файл, скорее всего, будет C или С++, но вероятность того, что это bash script, очень низкая. Из-за обфускации кода, комментариев и т.д. Я считаю, что поиск 100% точного кода - плохая идея и на самом деле не является целью этого.

4b9b3361

Ответ 2

Одним из простых решений, о которых я мог подумать, является то, что вы можете просто определить ключевые слова, используемые на разных языках. Каждое идентифицированное слово имеет счет +1. Затем вычислите коэффициент = ident_words/total_words. Победителем является язык, который получает наибольшее количество баллов. Конечно, есть проблемы, такие как использование комментариев e.t.c. Но я думаю, что это очень простое решение, которое должно работать в большинстве случаев.

Ответ 3

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

Похоже, у вас есть тысячи файлов исходного кода, и вы не знаете, на каком языке программирования они были написаны. Какую среду программирования вы работаете? (Исправление возможности искусственного требования к домашнему заданию). Я имею в виду, что одна из основ разработки программного обеспечения, на которую я всегда могу положиться, - это то, что файлы кода С++ имеют расширение .cpp, что в java файлах кода есть расширение .java, это c файлы кода иметь расширение .c и т.д. Является ли ваша компания быстро и свободно играть с этими стандартами? Если так, я был бы очень обеспокоен.

Ответ 4

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

Если вы не можете использовать расширения файлов, лучшим способом было бы найти вещи между разными языками и использовать их для определения типа файла. Например, синтаксис оператора цикла не будет сильно отличаться между языками, но пакет должен содержать инструкции. Если у вас есть файл, включающий java.util. *, То вы знаете его как java файл.

Ответ 5

Взгляните на nedit. Он имеет систему распознавания синтаксиса, под синтаксисом Highlighting- > Recognition Patterns. Вы можете просматривать шаблоны распознавания образцов здесь или загрузить программу и проверить стандартные.

Здесь описывается система подсветки .

Ответ 6

Поскольку список языков известен заранее, вы знаете синтаксис/грамматику для каждого из них. Следовательно, вы можете в качестве примера написать функцию для извлечения зарезервированных слов из предоставленного исходного кода.

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

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

Ответ 7

Как было предложено dmckee, вы можете посмотреть программу Unix file, источник которой

Ответ 8

Возможно, вы можете попытаться подумать о различиях языков и смоделировать их с помощью двоичного дерева, например, "есть функция X найденная?", если да, действуйте в одном направлении, если нет, продолжайте в другом направлении.

Построим это дерево поиска эффективно, вы можете закончить довольно быстрый код.

Ответ 9

Это не быстро и может не удовлетворить ваши требования, а просто идея. Он должен быть легко реализован и должен давать 100% результат.

Вы можете попытаться скомпилировать/выполнить входной текст с разными компиляторами/интерпретаторами (с открытым исходным кодом или бесплатно) и проверить наличие ошибок за сценой.

Ответ 10

Алгоритм Sequitur предоставляет контекстно-свободные грамматики из последовательностей терминальных символов. Возможно, вы могли бы использовать это для сравнения с набором известных правил производства для каждого языка.