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