Существует искусство определения языка, на котором написана программа. Это возможно, но жестких и быстрых правил не существует. Это требует большого опыта (и это также приводит к вопросу «Почему вы хотите ...», но вот несколько идей о том, как это сделать.
То, что вы ищете, это "подпись". Сигнатура может быть определенной строкой, включенной компилятором, ссылкой на API, довольно распространенным в используемом инструменте программирования, или даже стилем программирования, который является общим для используемых инструментов, видимым в содержащихся строках. в приложении.
Кроме того, существуют стили для развертывания приложения: различные файлы конфигурации, найденные в каталоге развертывания, библиотеки и сборки и даже изображения, каталоги или значки.
Java-приложения, помещенные в самозапускаемый исполняемый файл, будут содержать ссылки на java-библиотеки и, вероятно, будут содержать определенные библиотеки или файлы, включенные в тот же каталог, которые указывают, что это java.
Как указано в других ответах, управляемая сборка также будет показывать определенные признаки: вы можете открыть ее в Reflector и т. Д. Хотя верно, что c # и VB являются «взаимозаменяемыми» после компиляции, неверно, что они идентичны. Если вы используете Reflector для дизассемблирования кода VB, вы часто будете видеть, что сборка ссылается на сборку Microsoft.VisualBasic.dll. Вы сможете увидеть разницу между Mono приложениями, потому что они, скорее всего, будут содержать ссылки на моно сборки.
Многие компиляторы собирают и связывают код определенным образом и оставляют следы. Например, изучив исполняемый файл окна с помощью вкладки "strings:" в Process Explorer , вы увидите много строк. Используя их, вы сможете определить стили программирования, вызываемые методы, ошибки или методы трассировки с помощью Отлично.
Примером является то, что компиляторы используют разные механизмы для локализации: Microsoft хранит локализованные строки в файлах XML или файлах ресурсов. Другие компиляторы будут использовать другую тактику.
Другим примером является c ++ искажение имени . Компилятор CodeWarrior использует другой алгоритм для управления именами переменных-членов и функций вызова, отличных от Visual Studio.
Полагаю, вы могли бы написать книгу на тему точного определения происхождения любого исполняемого файла. Этот предмет, вероятно, будет называться «археология программирования».