Я должен написать код, который при вводе текстового файла (исходный код) в качестве входного файла выводит его язык программирования. Это самое основное определение проблемы. Далее следуют следующие ограничения:Код для идентификации языка программирования в текстовом файле
- Я должен написать это на C++.
- Следует признать широкое разнообразие языков - html, php, perl, ruby, C, C++, Java, C# ...
- Количество ложных срабатываний (неправильное распознавание) должно быть низким - лучше выводить «неизвестно» "чем неправильный результат. (он будет в списке вероятностей, например, как неизвестно: 100%, см. ниже)
- Результат должен быть списком вероятностей для каждого языка, который знает код, поэтому, если он знает C, Java и Perl, вывод должен быть, например: C: 70%, Java: 50%, Perl: 30% (обратите внимание: нет необходимости иметь сумму вероятностей до 100%)
- Он должен иметь хорошее соотношение точности/скорости (скорость немного более благоприятствуется)
Было бы очень приятно, если бы код мог быть написан так, что добавление новых языков для распознавания будет довольно простым и включает просто добавление «настроек/данных» для данного конкретного языка. Я могу использовать что угодно - эвристику, нейронную сеть, черную магию. Что-нибудь. Я даже разрешил использовать существующие решения, но: решение должно быть бесплатным, открытым исходным кодом и разрешать коммерческое использование. Он должен быть в виде легко интегрируемого исходного кода или как статическая библиотека - не DLL. Однако я предпочитаю писать свой собственный код или просто использовать фрагменты другого решения, мне надоело интегрировать код других. Последнее примечание: возможно, некоторые из вас предложит FANN (быструю искусственную библиотеку нейронных сетей) - это единственное, что я не могу использовать, так как это то, что мы используем УЖЕ, и мы хотим это заменить.
Теперь возникает вопрос: как бы вы справились с такой задачей, что бы вы сделали? Любые предложения, как реализовать это или что использовать?
EDIT: Основываясь на комментариях и ответах, я должен подчеркнуть некоторые вещи, которые я забыл: скорость очень важна, так как это будет получать тысячи файлов и должно отвечать быстро, поэтому просмотр тысяч файлов должен давать ответы для всех из них в течение нескольких секунд (размер файлов будет небольшим, конечно, по несколько килобайт каждый). Поэтому пытаться скомпилировать каждый из них не может быть и речи. Дело в том, что я действительно хочу вероятности для каждого языка, поэтому я скорее хочу знать, что файл, скорее всего, будет C или C++, но вероятность того, что это сценарий bash, очень низок. Из-за обфускации кода, комментариев и т. Д., Я думаю, что поиск 100% точного кода - плохая идея и на самом деле не является целью этого.
Идея языка в щеке - запустить его через компилятор для каждого языка и выбрать тот, который не является ошибкой? ;). (да, я знаю - возможно, медленный, склонный быть абсолютно неправильным, если код не компилируется, или если пользователь пишет полигоны ... и т. д.) – Stephen
+1: Хороший вопрос. Но я думаю, что часть «вероятности» не имеет смысла: вход либо легален на определенном языке, либо нет. Я не понимаю, что это означает, что он имеет более высокую вероятность принадлежать языку A, чем языку B. – Job
Я ожидал бы, что это будет очень простой проблемой, единственное препятствие, которое является сходством в C/C++. Это сценарий, который можно было бы решить просто или слишком сложно. – Fosco