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

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

Введение
На данный момент существует огромное количество языков на любой, как говорится, вкус и цвет. Есть и компилируемые и интерпретируемые языки, есть очень простые и просто таки мозгодробительные языки, есть серьезные и шуточные языки. Много их, в общем, есть. И каждый из них создавался с определенной целью. Выбор языка программирования во время создания программы является очень важным моментом, от которого зависит очень и очень многое – скорость создания программы, скорость тестирования, возможность переноса на другие платформы, возможность быстрого внесения изменений, быстрота выполнения конечного продукта и так далее. При этом стоит помнить, что идеального языка не существует, все они обладают своими положительными и отрицательными качествами, которые будут так или иначе влиять на процесс разработки.
Итак, по каким же критериям выбирать язык для своего проекта?

  1. Скорость работы конечного продукта.
    Требовательным к скорости выполнения могут быть программы с большим объемом математических вычислений, например моделирование физических систем, расчеты большого объема экономических данных, выведение трехмерной графики и прочее. Для данных целей хорошо подойдут компилируемые языки: ассемблер, С/С++, фортран и т.д. Почему именно такие? После сборки программа не требует (грубо говоря) ничего лишнего и содержит в себе машинные команды, которые выполняются без лишних задержек. Схема работы таких программ такая: 1) программа исполняется сразу, так сказать она самодостаточна и не требует дополнительных библиотек; 2) программа кроме своего кода содержит вызовы библиотек с машинным кодом (как системных, так и входящих в проект), поэтому, кроме исполнения собственно своих команд, программа вызывает функции из библиотек; 3) в дополнение случаям 1 и 2, программа может работать через прослойку драйверов, которые написаны на языках низкого уровня и работают по умолчанию быстро. Как видно, максимум в схеме возможны 4 блока: программа -> библиотеки -> драйвера -> железо.
  2. Объем занимаемой оперативной памяти.
    Данное требование появляется, когда программа разрабатывается для встраиваемых систем, мобильных платформ, микроконтроллеров и так далее. В данных случаях, чем меньше памяти расходует программа на данном языке – тем лучше. К таким языкам, опять же, относятся ассемблер, С/С++, Objective-C и другие. Список языков подобен списку пункта 1, так как чем меньше функциональных блоков в схеме исполнения, тем меньше занимается и памяти компьютера.
    Если данное требование некритично, то можно использовать «истинно высокоуровневые языки».
  3. Скорость разработки программы.
    Данное требование возникает тогда, когда начальник говорит «программа нужна не позже, чем вчера!» или еще какая срочность. Тогда выбор падает на высокоуровневые языки с максимально человеколюбивым синтаксисом. Это, например, Java, Flash и подобные. На данных языках время разработки может существенно сокращаться из-за обилия сторонних библиотек, максимально «очеловеченного» синтаксиса, и подобных вещей. Скорость выполнения программ, написанных на данных языках страдает, причем порой весьма ощутимо. Схема выполнения на примере Java:
    Программа в виде байт-кода -> виртуальная машина-анализатор -> системные библиотеки -> драйвера -> железо.
    Самым медленно работающим блоком в данной схеме является анализатор – он должен байт-код программы транслировать «на лету» в машинный код, при этом потратив много времени на точное определение инструкции. Поэтому быстрая разработка зачастую означает медленное выполнение.
  4. Ориентированность на компьютер или человека
    С кем будет работать программа в первую очередь? С человеком, или с компьютером? В пером случае программа должна обладать мощной графической частью, отвечающей требованиям дизайна и юзабилити. Разработка графической части зачастую требует достаточно много времени, т.к. отличается немалой сложностью. Здесь сложность возникает в том, что вывод графики – это немало математики, а значит присутствует требовательность к скорости исполнения, а из-за сложности разработки присутствует необходимость в высокоуровневом языке. В данном случае, на мой взгляд, очень хорошо подходит С++/C# с их одновременной и высокоуровневостью, и скоростью выполнения программ на них. Однако, если ГИП не очень сложный, но красивый, возможно использование Java и Flash, на которых создание красивых интерфейс гораздо проще, нежели на С++ и, тем более, С. Если программа ориентирована в первую очередь на «скрытую работу» с минимумом взаимодействия с пользователем, тогда выбор должен ложиться в сторону быстрых языков (ASM, C)
  5. Кроссплатформенность.
    Кроссплатформенность – возможность работы программы на различных платформах, в различных ОС с минимальными изменениями. В этой сфере можно выделить такие языки: Java, C#,Flash,C++ с различными библиотеками и другие, менее используемые, языки.
    Java создавался с тем условием, что программы на данном языке должны работать на любой платформе, где есть JVMJava Virtual Machine. Программы на Java вообще не требуют никаких изменений – после компиляции получается .jar файл, который будет работать и на Windows, и на Mac OS, и на Linux и еще немало где. Аналогичная ситуация и с Flash, только список платформ гораздо менее обширный. С С++ дело обстоит труднее. На чистом С++ написать кроссплатформенную программу довольно трудно, у кода возникает обширная избыточность, теряется достоинство в скорости выполнения. Облегчают задачу кроссплатформенные библиотеки, например, Qt, которые позволяют добиться принципа «один код на все платформы», однако на каждую платформу нужно программу собирать отдельно (при этом разными компиляторами).
    В этот раздел так же можно включить интерпретируемые, скриптовые языки – для их работы нужно наличие интерпретатора языка в системе. Данные языки очень удобны в плане разработки, но достаточно медлительны. Схема их работы напоминает схему работы Java/Flash, только анализатор стал еще медленнее – полумашинный байт код анализировать «на лету» гораздо проще, чем человеческий код. Так же, это влечет к большему потреблению памяти.
  6. Скорость внесения изменений, скорость тестирования
    Проект стремительно развивается, в него постоянно вносятся изменения, порой немало? Тогда выбор должен падать на высокоуровневые языки, где любой функциональный блок можно быстро переписать. Для подтверждения – я думаю, гораздо проще дебажить тот же С++, чем ассемблер. А еще проще Java. Но тут очень много тонкостей, которые таятся даже не сколько в языке, сколько в разработчике с его стилем программирования и компиляторах. Тем не менее, язык вносит свою долю в это дело, так или иначе упрощая/осложняя работу программиста.

Заключение.
Тему выбора языка программирования можно раздуть до очень больших размеров, перечисляя все возможные и невозможные тонкости в этом деле. Так же стоит учитывать, что большие программы могут писаться на разных языках в зависимости от их функционала. Например, критичные к скорости работы части пишутся на низкоуровневых языках, графическая часть — на высокоуровневых и медленных. В статье практически в каждом пункте упоминаются языки С и С++. Это действительно универсальные языки с большим количеством библиотек, с хорошей скоростью работы и еще многими другими плюсами. Но, кроме плюсов, они обладают еще довольно большим минусом – из-за этой универсальности данные языки довольно трудны в освоении, имеют очень много тонкостей (С++ больше, т.к. он содержит в себе больше парадигм, нежели С). Язык Java тоже универсален, более прост в изучении, но обладает на мой взгляд просто огромным минусом – крайне низкая скорость работы. Это сильно ограничивает его применение: большие программы на нем лучше не писать из-за возникающей потребности в мощном аппаратном обеспечении. Скриптовые/интерпретируемые языки хорошо подойдут для написания «одноразовых программ», автоматизации некоторых действий, а так же для работы в связке с другими языками. Ассемблер – вообще говоря это группа языков со схожим синтаксисом, но многими различными параметрами в зависимости от платформы (Например, ассемблер х86 это совсем не одно и то же, что и ассемблер SPARC). Выбрать нужный язык так же может помочь статья на вики «Сравнение языков программирования».

P.S. Хочется видеть в первую очередь конструктивные комментарии, которые могут дополнить статью или исправить мои ошибки (но так как топик из песочницы, комментарии выделить не смогу). Данная статья не основана на каких-либо источниках, писалась исключительно из своих соображений и из своей головы.