(С) точно не я.
С естественными языками относительно просто - просто надо обладать большим словарем (запасом). "Субъект-объект-отношение" и ваш ломанный итальянский поймут даже в Канаде. Грамматики знать не надо, ибо ломанная ваша понимать иногда языка всегда.
С языками программирования по-другому. Здесь все однозначно.
Если естественный языки пошли, по неоригинальной версии, от Вавилонской башни, то программные языки пошли от различных моделей вычислений.
Тьюринг породил имперосятину, Чёрч, Карри и Шейнфинкель породили функциональщину. Марков породил марковские алгорифмы. Из популярного другое малоизвестно (по крайне мере мне).
Сделаем небольшой оффтопик: меня, оказывается, можно считать "внуком" Маркова, ибо учитель одного из двух моих научруков и был Марков мл. Для справки, Марков мл. являлся зав. кафедрой мат. логики и теории алгоритмов на мехмате МГУ в 70-х. У меня есть какое-то врожденное уважение к этой кафедре :) . А все результаты Маркова в тервере и близких вещах относятся к Маркову ст.
Итак, имперосятина. Сначала машинные коды, затем ассемблеры, затем нечто похожее на языки программирования, процедурщина, массовые расстрелы за goto, зачатки типизации, модульность, пакетность, и другие зачатки объектности, элементы параллельности, объектность.
С детства в нас формируют императивное мышление: скажи "мама", ложечку за папу, вымой руки и ложись спать. Выразить это декларативно понятное для ребенка затруднительно. Затем в школе будут показывать какую-нибудь процедурщину, так что к студенчеству в вас сидит закоренелый императивщик.
Функциональщина - нетипизированная лямбда, комбинаторы, типизация, лень, вывод типов, зависимые типы, куча абстракций для которых у меня пока не хватает мозга.
Рекурсия божественна.
Марковщина - выродилось в Рефал. Да, это не лямбда, но отнесем к функциональщине.
Каких-нибудь прологистов причислим к ним же. Побочная веточка, ибо близко.
Далее несколько слов о чистоте и нечистоте.
Чистых вещей очень мало. Если сложить две чистые вещи, то мы не получим чистую вещь. Поэтому есть с десяток чистых вещей, а все остальные десять тысяч языков - нечисть.
Что такое чистая имперосятина или функциональшина? Можно говорить лишь о степени фишек и чистоты. Про идеалы чистоты импреративщины как то сложно что-то сказать (это машина Тьюринга?), попробую высказаться про чистоту объектности.
Если не рассматривают пару пятен, то идеалом является smalltalk и self. Последний почти канул в реке, я лишь скачал/запустил образ машины и немного поигрался. С ST же можно полноценно играться, мне понравилось. Так вот - есть лишь понятие объекта, и ничего более. Даже Оккама с бритвой тоже нет. Объекту можем послать сообщение. Как я уже говорил, больше ничего нет. Просто, не так ли?
Послать сообщение - значит по слоту (объекту) передать какой-то другой объект. 2 + 3 - это вам не сложение двух интов, это объекту 2 посылается сообщение + (это объект), с параметром 3(это объект). Вместо +, можно кинуть другой объект, который не захардкоден, а получается в результате вычислений.
Исходный код - это объект. Его можно откомпилировать (послать сообщение), и запустить (послать сообщение). Классов нет - это тоже объекты (прототипная/акторная(?) модель, в js что-то такое же). Есть объект Boolean и еще два объекта True и False. Это все объекты. Нет даже циклов и условий - это все посылка сообщения.
Короче, можно поставить какой-нибудь dolphin ST и наслаждаться, наслаждаться и четыре раза.
Если взять любое
С чистотой у функциональщиков попроще, достаточно выкинуть всю
Элементы модульности/пакетности проникают и в ФП: какой-нибудь Typeclasses в haskell и какой-нибудь behavior в erlang можно рассматривать как интерфейсы. Проблема в том, что проникновение ФП в процедурщину меня все время толкает только на ха-ха.
А теперь главный философский вопрос: а зачем так много языков? Язык то на самом деле один, это та хрень, которая вертится у вас в голове. И если кто-то не сможет выразить эту мысль на любом языке программирования, то тут как минимум два варианта: или еще нет мысли, или все печально.
Конечно, нужны языки работающие на разных уровнях абстракции. В тех редких случаях, когда нужно выжать 10-20% скорости программы вам придется работать с чем-то низкоуровневым; с чем-то большим - то желательно типизированным; с чем-то маленьким - нетипизированным; но всегда хочется высокоуровневым.
Стоит сказать, что сейчас понятие язык слилось с понятием платформы/framework-a/среды_разработки/документирования/etc. И выбирать язык не приходится, приходится выбирать все остальное.