Во-первых, на языках программирования (ЯП) пишут не файлы, а программы, для которых файл - это просто контейнер. Во-вторых, если речь идет о распознании ЯП, на котором была когда-то написана программа,
а теперь перед вами находится результат ее компиляции, т.е., как правило, двоичный файл, то определить
ЯП можно с помощью декомпилятора, если он есть, но и для его применения нужно знать
ЯП, использованный при написании программы, так как декомпиляторы обычно разрабатываются
в расчете на декомпиляцию только в строго определенный ЯП.
Если же задача стоит для файла, в котором находится программа в исходном виде, т.е. в виде текста,
то определить ЯП часто можно по расширению имени файла. Для большинства языков
программирования закреплены соответствующие им расширения, например, для С++ расширением будет "cpp".
Расширения можно легко найти поиском в Инете. И для программ после компиляции также
применяются соответствующие расширения.
Программист же часто может распознать язык программирования
просто по виду текста программы, если он знаком с этим языком.