Программа распознавания языка программирования

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Defining a programming language from source code using machine learning

batogov/programming-language-detection

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

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

Используемые инструменты и библиотеки

  • Python 3;
  • Pandas для работы с данными;
  • BeautifulSoup4 для парсинга данных;
  • Scikit-Learn для применения алгоритмов машинного обучения и т.д.

Одна из самых сложных частей данной работы – создание обучающей выборки. Необходимо было найти большое количество размеченных исходных кодов (исходный код + метка языка програмирования, на котором этот код написан). В качестве сайтов для парсинга рассматривались сервисы, предоставляющие в свободном доступе короткие программные коды на разных языках программирования. Например, gist.github.com или ideone.com. Сайтом для парсинга был выбрал ideone.com по причине удобства парсинга, большего разнообразия и качества исходных кодов.

Главная страница сайта ideone.com представляет из себя текстовый редактор с возможностью написания кода и дальшейшего его выполнения. В данной задаче нас интересует не она, а страница с адресом ideone.com/recent. На ней отображаются последние исполненные на сайте сниппеты кода. На странице внизу присутствует блог пагинации, с помощью которого можно просматривать более старые сниппеты (так же навигацию можно осуществлять с помощью дописывания к адресу ideone.com/recent/ номер интересующей страницы). Каждый блок с исходным кодом помимо прочего содержит ссылку на страницу сниппета и полезные для нас строки: строку с языком кода и строку с результатом выполнения (компилируется, ошибка компиляции, успешно и т.д.). Перейдя по ссылке из блока мы попадаем на страницу исходного кода, на которой полностью отображается исходный код и ссылка на файл.

Парсер работает следующим образом:

  1. Проходит по страницам от n до k (от ideone.com/recent/n до ideone.com/recent/k);
  2. На каждой странице просматривает все блоки кода и отбирает те, у которых строка с результатом выполнения сигнализирует об успешности;
  3. Для отобранных блоков кода запоминает язык и скачивает исходный файл (парсить исходных код со страницы каждого кода сложно из-за структуры html-кода);
  4. Финальный отбор – скрипт оставляет только те исходные коды, количество строк в которых не превышает 50. Это необходимо для того, чтобы отсеять громоздкие сниппеты, которые будут вредить алгоритму машинного обучения из-за того, что скорее всего помимо «полезной выжимки» кода будут содержать много мусора;
  5. Если это первый запуск скрипта, то он создаёт файл raw_data.csv и записывает в него результат. Иначе открывает этот файл и дозаписывает результат.

Парсер в процессе своей работы посылает много запросов на сайт ideone.com, из-за чего часто возникают http-ошибки. Чтобы ошибки не прерывали процесс парсинга, написана функция-обёртка с обработчиком исключений, который при возникновении ошибки продолжает процесс парсинга.

Код отвечающий за парсинг и сохранение его результатов в .csv находится в файле data_parsing.py.

С помощью вышеописанного алгоритма была собрана выборка размером 12923 объектов. Из-за нехватки времени и того факта, что скрипт-парсер работает медленно, создать выборку большего объёма не представилось возможным. Так же из недостатков собранной выборки стоит отметить дисбаланс классов. Например, исходных кодов на языке «C» в десятки раз больше, чем на языке «Python».

Следующий этап работы – обработка выборки. Идеальным алгоритмом обработки сырых данных в данной работе будет алгоритм, который сможет удалить из исходных кодов все «малозначащие» элементы. Забегая вперёд стоит отметить, что алгоритм машинного обучения, который мы будем использовать далее, будет оперировать численными представлениями слов наших исходных кодов. Соответственно, классификация будет основана на различии комбинаций этих численных представлений. Чтобы качественно выполнить эту задачу, алгоритму необходимо подготовить данные таким образом, чтобы тексты кодов на разных языках программирования имели разные особенности, т.е. нужно удалить всё общее, что имеют коды на разных языках программирования. Эти общие части я и называю в данном контексте «малозначащами» элементами (например, имена переменных и их значения или комментарии в тексте кода).

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

Однако, небольшую обработку кодов сделать можно. А именно:

  • Удалить все символы переноса строк и табуляции;
  • Удалить все цифры;
  • Удалить лишние пробелы – оставить только пробелы между словами.

Построение модели и результаты

После обработки текстов можно приступить к построению модели. В этой работе я использую линейный классификатор (минимизация с помощью стохастического градиентного спуска), векторизацию данных с помощью TF-IDF и схему n-грамм (1, 4).

По результатам валидации, лучшая модель имеет следующие параметры: alpha – 0.0001, penalty – none, loss – hinge.

Источник

Автоопределение языка программирования по коду?

Добрый день! Существуют ли готовые решения (опенсорс) для автоматического определения языка программирования по заданному исходнику? Насколько сложно создать подобное самому?
Достаточно ли детектировать несколько ключевых слов или нужно более глубоко парсить код?
Спасибо.

Оценить 1 комментарий

bobrovskyserg

bobrovskyserg

IonDen

bobrovskyserg

Нескольких ключевых слов не хватит — для лиспа нужны скобочки, для питона — отступы и тд.
Если список языков задан, а код валидный, скормив его по очереди компиляторам/интерпретаторам можно узнать, какие языки считают этот код своим. Если код невалидный — всё плохо, например, склеив кусок питона и кусок лиспа, я получу код, который куда отнести? Правильно, в мусор.

Поочередно скармливать компиляторам/интерпретаторам нужно, если вам необходимо 100% знать на каком языке написан код. Для обычных ситуаций достаточно его разбирать анализом текста.

bobrovskyserg

egorsmkv:
Ваше замечание сложно оспорить — ведь вы же не поясняете, что есть «обычная ситуация» и что есть «анализ текста».
Придётся согласиться )))

bobrovskyserg: в этом случае — узнать язык программирования файла. Поднимать сотню компиляторов/интерпретаторов не очень выгодня, например, для какого-нибудь git-viewer’a, который подсвечивает код по узнанному языку программирования.

bobrovskyserg

egorsmkv:
Автор задал вопрос, как задал. Для гита ситуация отличается — у файлов правильные расширения, и отличить лисп от питона можно так. А если какой извращенец шифрует расширения — он сам себе буратино.

Источник

Как узнать язык программирования в коде программы?

Бывают случаи, что на вашем пути встречается какой-нибудь годный софт и тогда
возникает вопрос, как узнать язык программирования ?. Для чего этого
нужно?
Ситуации могут быть разные:

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

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

Как определить язык программирования

Пока единого сервиса, чтобы определить язык программирования по коду, не
существует. Реализация этой идеи связана с большим разнообразием ЯП. Многие
из них происходят друг от друга и по этому вроде похожи, но в целом — это разные
языки и используются для разных целей.
Но все же, чтобы узнать на каком языке написана программа, можно по крайней
мере попытаться использовать некоторые хитрости. Это не даст 100%-ой гарантии,
что вам удастся определить, но по крайней мере существенно снизит круг поиска.

Способы определения языка программирования в коде программы

Итак, несколько хитростей, как узнать на каком языке написана программа:

  1. Языков очень много — это факт. Но основных, которые используются всего
    несколько десятков. И все же им присущи определенные отличительные
    черты. Поэтому имеет смысл в первую очередь посмотреть синтаксис
    программы и его конструкцию. Если вы уже имеете определенный опыт в
    программировании, тогда вам будет легче это сделать. Если опыта нет, тогда
    нужно будет найти в сети пример кода основных популярных языков и
    сравнить код на схожесть с вашим исходником. Часто языки отличаются
    наличием и использованием тех или иных операторов, которые бросаются в
    глаза. Или в некоторых языках есть специфичность использования скобок пробелов, табуляции, знаков препинания и т. д. На это нужно обратить
    внимание и как и сравнить ваш исходник с найденным примером.
  2. Еще одна хитрость – это использовать онлайн-компиляторы кодов. Иногда,
    чтобы определить язык программирования по коду — достаточно его
    пропустить через соответствующий компилятор. Так как популярных языков не
    так много, по многим из них есть онлайн-компиляторы. Поэтому можно ваш
    исходник пропускать поочередно по каждому из них, пока не «сработает». Как
    только код «сработает», можно будет предположить, что ваш код написан на
    том коде, чей компилятор вы используете.
  3. Можно воспользоваться небольшой программой PeiD. Нужно будет найти ее в
    интернете, скачать актуальную версию и установить к себе на компьютер. Он а
    может помочь вам в вопросе, как узнать на каком языке написана программа и
    определить язык программирования по исходному коду. Это не ее прямое
    предназначение, но она может помочь, компилятор, а соответственно и язык
    программирования.

Заключение

Утилита PeiD не всегда дает 100%-ый результат, но во всех случаях ограничивает
список возможных языков. Если обобщить все написанное выше, то получается
чтобы определить язык программирования с большой точностью,
необходимо иметь хотя бы небольшие познания в программировании. Потому что
«докручивать» результат придется самостоятельно анализируя полученные данные.
Потому что только по синтаксису и конструкции кода, можно определить язык
программирования. Соответственно нужно как минимум понимать что такое
синтаксис, оператор, конструкция и другие базовые вещи.

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

Источник

Читайте также:  Смета разработки мобильного приложения пример
Оцените статью