Как сравнивать языки программирования
Языки для решения задач
Как правило, ЯП создаются для решения какой-то практической задачи, будь то написание алгоритма решения задачи, математические вычисления, создание интерфейсов и так далее.
Но это верно не всегда. Иногда языки создаются шутки ради. Например, YoptaScript, первый в мире скриптовый язык программирования для гопников и реальных пацанов или TrumpScript, основанный на высказываниях Дональда Трампа.
Конечно, это не более чем шутка, имеющая, впрочем, под собой неплохую технологическую основу.
Бывают более серьезные ЯП, которые на первый взгляд кажутся шуткой, например BrainFuck, появившийся из идеи написания минимально возможного компилятора для языка программирования. Этот язык входит в группу т.н. эзотерических языков, разработанных для исследования тех или иных возможностей в языках программирования. Самым экстремальным из этой группы, на мой взгляд, является язык Whitespace, операторами которого являются символы пробела, табуляции и переводы каретки. Можно представить, как выглядит программа на этом языке!
Языков программирования очень много, и они очень разные.
Можно ли как-то сравнивать языки между собой? Правомерен ли вопрос, что язык А “лучше” языка Б?
Тьюринг-полнота
Есть общий критерий, понимание которого автоматически делает вопрос “лучше” неправомерным.
В 1936 году английский математик Алан Тьюринг написал работу “О вычислимых числах применительно к проблеме разрешимости”, положив начало целой научной области, известной сейчас как теория вычислений или вычислимости.
В рамках этой работы Тьюринг создал умозрительную машину, позже названную “машиной Тьюринга”.
Эта простая машина способна производить любые вычисления, на которое способен современный (да и в принципе любой) компьютер.
И если на языке программирования можно создать машину Тьюринга, то оказывается, что на нем можно производить любые вычисления. Это свойство называется Тьюринг-полнотой.
В этом смысле языки программирования являются эквивалентными. Т.е. если два языка Тьюринг-полные, на них можно написать эквивалентные программы. Разумеется, они будут различатся по тому, как они выглядят, запускаются и выполняются. Но это будут другие свойства языков, не вычислимость. Так, например, язык Whitespace является Тьюринг-полным .
А раз так, то необходимо для сравнения ЯП брать другие критерии оценки и сравнения.
Кстати, существуют не Тьюринг-полные языки, например, конечные автоматы и регулярные выражения.
Парадигмы программирования
Для меня значимым критерием оценки ЯП является парадигма программирования. Это набор концепций, идей и понятий, стоящих за действиями, выполняемыми компьютером с помощью ЯП.
Парадигм много.
Наиболее привычная, применяемая еще до подхода к компьютеру - императивная парадигма. Слово “императив” означает “указание, приказ”. Т.е. мы (буквально) объясняем исполнителю, как нужно добиться результата. Это то самое “слыш ты, подь сюды”, “дай сигу”, “а если найду?” и т.д. Пример, конечно, утрированный, но, все-же, точно отражающий указанный подход.
Вторая по значимости (для меня, опять же) парадигма - это функциональная парадигма.
Мы, с помощью ЯП, объясняем исполнителю, как входные и выходные данные связаны между собой, указывая функциональную зависимость.
Функциональная парадигма примечательна тем, что позволяет создавать “чистые” функции, т.е. функции, в которых нет никаких других явлений, кроме зависимости между входными и выходными данными. В этом случае говорят об отсутствии побочных эффектов.
Функциональная чистота наряду с функциями высших порядков позволяют писать код для параллельных вычислений и т.н. ленивый (отложенный) код, т.е. код, который будет выполнен ровно тогда, когда он будет нужен.
Сегодня функциональная парадигма постепенно проникает во все промышленные ЯП.
Существует масса других способов сравнивать языки программирования между собой.
Зачем я это прочитал?
Для программиста важно знать не один и не два ЯП. Важно понимать сильные и слабые стороны как реализаций ЯП, так и используемых в языках парадигм. Это позволит выбирать язык под задачу, а не решать задачи на языках, для этого не приспособленных.