как по коду определить язык программирования
Как узнать на чём написана программа и на чём она сделана
Для того, чтобы написать компьютерную программу, необходимо использовать определенный язык программирования. И после того, как исходный код скомпилируется, можно получить исполняемый файл.
Сложность определения языка написания программы состоит в том, в каком виде вам попала данное программное приложение, поскольку это может быть, как и исходный код, так и исполняемый файл.
В первом случае, определить язык очень легко, так как достаточно лишь взглянуть на код, чтобы узнать его конструкцию. И не смотря на то, что языков программирования существует на сегодня большое количество, широко известными стали лишь некоторые из них.
Если вы увидели, что исходный код программы содержит такие операторы, как begin и end, тогда это язык программирования под названием Delphi, который ведет свое начало еще от Паскаля. И если вы посмотрите исходник, написанный на языке Делфи, вы больше не спутаете его с другим.
Распознать язык программы, которая написана в С++, также не представляет особого труда, поскольку у него есть свои характерные черты. Если впервые взглянуть на данный программный код, то перед вашим взором откроется большое количество фигурных скобок. Вместе с тем, для языка С++ характерно наличие комментариев, которые указываются после двойного слеша (//), тем более, что каждый комментарий имеет следующую конструкцию: /* текст комментария */.
Такой язык программирования, как C#, появился совсем недавно и активно используется для создания программных приложений компанией Microsoft. Он достаточно удобен, а также имеет некие черты с языком С++.
Распознать Visual Basic достаточно просто, благодаря своеобразному синтаксису. Аналогично распознается и Ассемблер. Данный язык имеет не столь много уровней, как другие языки программирования. Создавать программы с его помощью достаточно сложно, но полученное в результате приложение имеет небольшой размер и функционирует очень быстро.
Если же вам нужно узнать язык уже откомпилированной программы, тогда придется прибегнуть к утилите Protection ID, поскольку большинство из программных приложений закриптованы от взлома. Для этого вначале распакуйте скачанный архив, а затем распакуйте сам установочный файл при помощи специальной утилиты.
Чтобы узнать, на каком языке программирования написана программа, воспользуйтесь утилитой PEID, скачать которую вы можете в интернете. Установите ее и запустите. Откройте интересующий вас исполнимый файл. И результат не заставит себя ждать, так как в нижнем окошке появится интересующая вас информация о языке программирования.
Как по коду определить язык программирования
Реализовать алгоритм, который сможет определить язык программирования небольшого фрагмента исходного кода (сниппета), подаваемого ему на вход. Задача должна решаться с помощью машинного обучения.
Используемые инструменты и библиотеки
Одна из самых сложных частей данной работы – создание обучающей выборки. Необходимо было найти большое количество размеченных исходных кодов (исходный код + метка языка програмирования, на котором этот код написан). В качестве сайтов для парсинга рассматривались сервисы, предоставляющие в свободном доступе короткие программные коды на разных языках программирования. Например, gist.github.com или ideone.com. Сайтом для парсинга был выбрал ideone.com по причине удобства парсинга, большего разнообразия и качества исходных кодов.
Главная страница сайта ideone.com представляет из себя текстовый редактор с возможностью написания кода и дальшейшего его выполнения. В данной задаче нас интересует не она, а страница с адресом ideone.com/recent. На ней отображаются последние исполненные на сайте сниппеты кода. На странице внизу присутствует блог пагинации, с помощью которого можно просматривать более старые сниппеты (так же навигацию можно осуществлять с помощью дописывания к адресу ideone.com/recent/ номер интересующей страницы). Каждый блок с исходным кодом помимо прочего содержит ссылку на страницу сниппета и полезные для нас строки: строку с языком кода и строку с результатом выполнения (компилируется, ошибка компиляции, успешно и т.д.). Перейдя по ссылке из блока мы попадаем на страницу исходного кода, на которой полностью отображается исходный код и ссылка на файл.
Парсер работает следующим образом:
Парсер в процессе своей работы посылает много запросов на сайт ideone.com, из-за чего часто возникают http-ошибки. Чтобы ошибки не прерывали процесс парсинга, написана функция-обёртка с обработчиком исключений, который при возникновении ошибки продолжает процесс парсинга.
С помощью вышеописанного алгоритма была собрана выборка размером 12923 объектов. Из-за нехватки времени и того факта, что скрипт-парсер работает медленно, создать выборку большего объёма не представилось возможным. Так же из недостатков собранной выборки стоит отметить дисбаланс классов. Например, исходных кодов на языке «C» в десятки раз больше, чем на языке «Python».
Следующий этап работы – обработка выборки. Идеальным алгоритмом обработки сырых данных в данной работе будет алгоритм, который сможет удалить из исходных кодов все «малозначащие» элементы. Забегая вперёд стоит отметить, что алгоритм машинного обучения, который мы будем использовать далее, будет оперировать численными представлениями слов наших исходных кодов. Соответственно, классификация будет основана на различии комбинаций этих численных представлений. Чтобы качественно выполнить эту задачу, алгоритму необходимо подготовить данные таким образом, чтобы тексты кодов на разных языках программирования имели разные особенности, т.е. нужно удалить всё общее, что имеют коды на разных языках программирования. Эти общие части я и называю в данном контексте «малозначащами» элементами (например, имена переменных и их значения или комментарии в тексте кода).
К сожалению, реализовать такой алгоритм не получится, т.к. найти общее правило обработки для разных языков программирования не представляется возможным.
Однако, небольшую обработку кодов сделать можно. А именно:
Построение модели и результаты
После обработки текстов можно приступить к построению модели. В этой работе я использую линейный классификатор (минимизация с помощью стохастического градиентного спуска), векторизацию данных с помощью TF-IDF и схему n-грамм (1, 4).
По результатам валидации, лучшая модель имеет следующие параметры: alpha – 0.0001, penalty – none, loss – hinge.
Как по коду определить язык программирования
Как узнать язык программы, на которой она была написана?
Для того, чтобы написать компьютерную программу, необходимо использовать определенный язык программирования. И после того, как исходный код скомпилируется, можно получить исполняемый файл.
Сложность определения языка написания программы состоит в том, в каком виде вам попала данное программное приложение, поскольку это может быть, как и исходный код, так и исполняемый файл.
В первом случае, определить язык очень легко, так как достаточно лишь взглянуть на код, чтобы узнать его конструкцию. И не смотря на то, что языков программирования существует на сегодня большое количество, широко известными стали лишь некоторые из них.
Если вы увидели, что исходный код программы содержит такие операторы, как begin и end, тогда это язык программирования под названием Delphi, который ведет свое начало еще от Паскаля. И если вы посмотрите исходник, написанный на языке Делфи, вы больше не спутаете его с другим.
Распознать язык программы, которая написана в С++, также не представляет особого труда, поскольку у него есть свои характерные черты. Если впервые взглянуть на данный программный код, то перед вашим взором откроется большое количество фигурных скобок. Вместе с тем, для языка С++ характерно наличие комментариев, которые указываются после двойного слеша (//), тем более, что каждый комментарий имеет следующую конструкцию: /* текст комментария */.
Такой язык программирования, как C#, появился совсем недавно и активно используется для создания программных приложений компанией Microsoft. Он достаточно удобен, а также имеет некие черты с языком С++.
Распознать Visual Basic достаточно просто, благодаря своеобразному синтаксису. Аналогично распознается и Ассемблер. Данный язык имеет не столь много уровней, как другие языки программирования. Создавать программы с его помощью достаточно сложно, но полученное в результате приложение имеет небольшой размер и функционирует очень быстро.
Если же вам нужно узнать язык уже откомпилированной программы, тогда придется прибегнуть к утилите Protection ID, поскольку большинство из программных приложений закриптованы от взлома. Для этого вначале распакуйте скачанный архив, а затем распакуйте сам установочный файл при помощи специальной утилиты.
Чтобы узнать, на каком языке программирования написана программа, воспользуйтесь утилитой PEID, скачать которую вы можете в интернете. Установите ее и запустите. Откройте интересующий вас исполнимый файл. И результат не заставит себя ждать, так как в нижнем окошке появится интересующая вас информация о языке программирования.
Определение языка программирования из сниппета
Как лучше всего определить, какой язык программирования используется во фрагменте кода?
Я думаю, что метод, используемый в спам-фильтрах, будет работать очень хорошо. Вы разбиваете фрагмент на слова. Затем вы сравниваете употребление этих слов с известными фрагментами и вычисляете вероятность того, что этот фрагмент написан на языке X для каждого интересующего вас языка.
Если у вас есть базовый механизм, добавлять новые языки очень просто: просто обучите детектор с помощью нескольких фрагментов на новом языке (вы можете скормить ему проект с открытым исходным кодом). Таким образом, он узнает, что «System» может появиться во фрагментах кода C # и «положить» в фрагменты Ruby.
Я действительно использовал этот метод, чтобы добавить определение языка во фрагменты кода для программного обеспечения форума. Он работал 100% времени, за исключением неоднозначных случаев:
Я не смог найти код, поэтому сделал новый. Это немного упрощенно, но для моих тестов это работает. В настоящее время, если вы скармливаете ему гораздо больше кода Python, чем кода Ruby, он может сказать, что этот код:
— это код Python (хотя на самом деле это Ruby). Это потому, что у Python тоже есть def ключевое слово. Поэтому, если он видел 1000x def в Python и 100x def в Ruby, он все равно может говорить Python, хотя puts и end является специфичным для Ruby. Вы можете исправить это, отслеживая количество слов, отображаемых для каждого языка, и делясь на них где-нибудь (или вводя равное количество кода на каждом языке).
Надеюсь, это вам поможет:
Определение языка решено другими:
Также есть SourceClassifier:
Я заинтересовался этой проблемой после того, как нашел в статье блога код, который мне не удалось идентифицировать. Добавляем этот ответ, так как этот вопрос был первым поисковым запросом «определить язык программирования».
Это очень сложно, а иногда и невозможно. На каком языке написан этот короткий фрагмент?
(Подсказка: это может быть любой из нескольких.)
Можно попробовать проанализировать разные языки и попробовать определиться с помощью частотного анализа ключевых слов. Если определенные наборы ключевых слов встречаются с определенной частотой в тексте, вероятно, что это язык Java и т. Д. Но я не думаю, что вы получите что-либо полностью защищенное от дурака, поскольку вы могли бы назвать, например, переменную в C с тем же именем как ключевое слово в Java, и частотный анализ будет обманут.
Если вы поднимете его на ступеньку выше по сложности, вы можете искать структуры, если определенное ключевое слово всегда идет после другого, это даст вам больше подсказок. Но также будет намного сложнее спроектировать и реализовать.
ОБНОВЛЕНИЕ: я пробовал это, и это не сработало. Сжатый JavaScript полностью запутал его, т. Е. Токенизатор чувствителен к пробелам. Как правило, простой подсчет хитов не кажется надежным. Более сильный синтаксический анализатор или, возможно, несовпадающее количество разделов могут работать лучше.
Во-первых, я бы попытался найти конкретные ключевые слова языка, например
Это будет зависеть от того, какой у вас тип фрагмента, но я бы пропустил его через серию токенизаторов и посмотрел, для какого языка BNF он подходит.
Я думаю, что невозможно обнаружить все языки. Но вы можете запускать ключевые токены. (определенные зарезервированные слова и часто используемые комбинации символов).
Бен, есть много языков с похожим синтаксисом. Так что это зависит от размера сниппета.
В основном это подсветка синтаксиса, но, вероятно, есть способ извлечь часть обнаружения для определения языка из сниппета.
Его очень легко расширить, добавив обучающий файл в нужную папку. Написано на C #. Но я полагаю, что код легко конвертируется на любой другой язык.
И, возможно, еще кое-что, что должно быть в большинстве языков. Тогда используйте балльную систему. Если регулярное выражение найдено, присудите не более 1 балла за каждый элемент. Очевидно, что в некоторых языках будет использоваться один и тот же синтаксис (циклы for часто пишутся так, for(int i=0; i чтобы каждый из нескольких языков мог получить балл за одно и то же, но, по крайней мере, вы уменьшаете вероятность того, что это будет совершенно другой язык). Некоторые из них могут получить 0 баллов по всем направлениям (например, фрагмент вообще не содержит функции), но это прекрасно.
Объедините это с решением Жюля, и оно должно работать хорошо. Может быть, также поищите частоту ключевых слов для дополнительного балла.
Интересный. У меня аналогичная задача по распознаванию текста в разных форматах. Свойства YAML, JSON, XML или Java? Например, даже с синтаксическими ошибками я должен с уверенностью отличать JSON от XML.
Наконец, если я выберу классификатор, например случайный лес, я буду сканировать github и собирать весь общедоступный исходный код. Большая часть файла исходного кода может быть помечена суффиксом файла. Для каждого файла я случайным образом разделю его по пустым строкам на фрагменты разного размера. Затем я извлечу функции и обучу классификатор, используя помеченные фрагменты. После завершения обучения классификатор можно проверить на точность и отзывчивость.
После того, как у вас будет приложение rails для его использования, добавьте его gem ‘github-linguist’ в свой Gemfile (буквально только что вызванный Gemfile в каталоге вашего приложения, без расширения ).
Затем установите ruby-dev ( sudo apt-get install ruby-dev )
Затем установите cmake ( sudo apt-get install cmake )
Теперь вы можете запустить gem install github-linguist (если вы получите сообщение об ошибке, в котором говорится, что требуется icu, выполните sudo apt-get install libicu-dev и попробуйте еще раз)
(Возможно, вам придется выполнить sudo apt-get update или sudo apt-get install make или, sudo apt-get install build-essential если вышеуказанное не сработало)
Кажется, это требует много дополнительной работы, особенно если у вас еще нет рельсов, но на самом деле вам не нужно НИЧЕГО знать о рельсах, если вы выполните эти шаги, и я просто действительно не нашел лучшего способа обнаружить рельсы. язык файла / фрагмента кода.
У меня есть совет. В настоящее время я пишу небольшой фрагмент кода для своего веб-сайта, который можно использовать для определения языков программирования. Как и в большинстве других сообщений, может быть огромное количество языков программирования, о которых вы просто не слышали, вы не можете учесть их все.
Что я сделал, так это то, что каждый язык можно идентифицировать по набору ключевых слов. Например, Python можно идентифицировать несколькими способами. Вероятно, будет проще, если вы выберете «черты», которые также определенно уникальны для языка. Для Python я выбираю черту использования двоеточия для начала набора операторов, что, на мой взгляд, является довольно уникальной чертой (поправьте меня, если я ошибаюсь).
Если в моем примере вы не можете найти двоеточие для начала набора операторов, перейдите к другой возможной характеристике, скажем, используя def ключевое слово для определения функции. Теперь это может вызвать некоторые проблемы, потому что Ruby также использует ключевое слово def для определения функции. Ключом к различению этих двух (Python и Ruby) является использование различных уровней фильтрации для получения наилучшего соответствия. Ruby использует ключевое слово end для завершения функции, тогда как Python не имеет ничего для завершения функции, только удаление отступа, но вы не хотите туда идти. Но опять же, это end также может быть Lua, еще один язык программирования, который можно добавить.
Вы можете видеть, что языки программирования просто перекрывают друг друга. Одно ключевое слово, которое может быть ключевым словом на одном языке, может оказаться ключевым словом на другом языке. Использование комбинации ключевых слов, которые часто идут вместе, как в Java, public static void main(String[] args) помогает устранить эти проблемы.
9 отличных сервисов для проверки кода
Работу программиста можно оценивать по многим критериям, но главные – это, наверно, чистота кода и его качество. Мы рассмотрим 9 сервисов для проверки кода.
Правильно работающий код – это уже прекрасно, но не нужно забывать, что вы должны еще чистить его от “мусора” и делать максимально понятным для тех разработчиков, которые будут задействованы в обслуживании в дальнейшем.
Обычно ревью кода в крупных компаниях делают сеньоры. Но это дорого и неэффективно. Альтернативный вариант – пользоваться онлайн-сервисами, которые дают оценку готовому коду. Если вы хотите выбрать для себя один из таких инструментов, читайте обзоры в статье.
Reshift
Этот сервис дает разработчикам ПО возможность находить и устранять уязвимости до того, как отправлять конечный вариант своего кода в продакшн.
Reshift получил большое количество положительных отзывов. Кроме поиска проблем сервис также помогает соблюдать требования регуляторов, касающиеся разработки программного обеспечения.
Collaborator
Данная система относится к одним из самых продвинутых инструментов рецензирования кода. Подходит и отдельным разработчикам, и тем, кто работает в команде.
Codestriker
Достаточно неплохой ревью-инструмент с открытым исходным кодом. Дает возможность быстро отыскивать проблемы и повышать качество кода.
Gerrit
С помощью онлайн-сервиса Gerrit можно бесплатно проверить код просто в браузере, в процессе отклоняя или принимая изменения. Сочетает в себе багтрекер и код-ревью инструмент.
Crucible
Приложение, которое в онлайн-режиме позволяет делать ревью кода, находить проблемы, обсуждать изменения в каждой отдельной ветке, осуществлять шеринг данных и пр. Это платный сервис с двумя версиями: для маленьких команд и крупных корпораций. Первая стоит 10 долларов и предоставляет безлимитные репозитории на пятерых пользователей. Стоимость корпоративной версии составляет 1100 долларов и включает безлимитный репозиторий на десятерых пользователей. Существует также демо-доступ – он дается на 30 суток.
GitHub
Каждый разработчик знает, что такое GitHub. Но что этот сервис может делать автоматическую проверку кода, известно далеко не всем. В данном плане имеется 2 версии: бесплатная с ограниченным числом пользователей и платная, стоимостью 7 долларов в месяц.
Помимо стандартных инструментов здесь можно просматривать историю изменений, оставлять к участкам кода комментарии и с помощью веб-интерфейса решать простые конфликты. Также GitHub позволяет применять и сторонние аналогичные ревью-инструменты.
Review Board
Этому сервису уже около 10 лет, тем не менее, он продолжает развиваться и совершенствоваться. Проект бесплатный, можно испытать демо на официальном сайте или установить Review Board на собственном сервере. Большой плюс инструмента в том, что он позволяет напрямую сравнивать 2 версии кода: до изменений и после. К тому же не может не радовать простой интерфейс.
Rhodecode
Платный сервис с поддержкой Mercurial, Git, а также Subversion. Стартовая цена – 8 долларов в месяц для каждого пользователя. Можно оплатить сразу весь год, так будет экономнее, потому что цена составит 75 долларов. Те, кто не хочет тратить деньги, могут скачать community-edition и установить ее на собственном сервере.
Phabricator
Очередной набор инструментов с открытым исходным кодом, которые облегчают процесс code review. Есть облачная версия, но она с ограничениями, стоит 20 долларов в месяц. Цена полной версии достигает 1000 долларов в месяц (есть несколько и более дешевых предложений). Все платные продукты включают техподдержку и 30-дневный демо-режим.
В завершение
В статье описаны очень полезные инструменты для проверки кода, но они не способны стать полноценной заменой человека. Тем не менее, эти сервисы в несколько раз ускоряют проверку, а значит, позволяют существенно экономить ресурсы, в том числе самый главный и дорогой – время.