четверг, 28 апреля 2011 г.

Язык

Ничто так не ограничивает мысль программиста, как компилятор.
(С) точно не я.

С естественными языками относительно просто - просто надо обладать большим словарем (запасом). "Субъект-объект-отношение" и ваш ломанный итальянский поймут даже в Канаде. Грамматики знать не надо, ибо ломанная ваша понимать иногда языка всегда.

С языками программирования по-другому. Здесь все однозначно.

Если естественный языки пошли, по неоригинальной версии, от Вавилонской башни, то программные языки пошли от различных моделей вычислений.

Тьюринг породил имперосятину, Чёрч, Карри и Шейнфинкель породили функциональщину. Марков породил марковские алгорифмы. Из популярного другое малоизвестно (по крайне мере мне).

Сделаем небольшой оффтопик: меня, оказывается, можно считать "внуком" Маркова, ибо учитель одного из двух моих научруков и был Марков мл. Для справки, Марков мл. являлся зав. кафедрой мат. логики и теории алгоритмов на мехмате МГУ в 70-х. У меня есть какое-то врожденное уважение к этой кафедре :) . А все результаты Маркова в тервере и близких вещах относятся к Маркову ст.

Итак, имперосятина. Сначала машинные коды, затем ассемблеры, затем нечто похожее на языки программирования, процедурщина, массовые расстрелы за goto, зачатки типизации, модульность, пакетность, и другие зачатки объектности, элементы параллельности, объектность.

С детства в нас формируют императивное мышление: скажи "мама", ложечку за папу, вымой руки и ложись спать. Выразить это декларативно понятное для ребенка затруднительно. Затем в школе будут показывать какую-нибудь процедурщину, так что к студенчеству в вас сидит закоренелый императивщик.

Функциональщина - нетипизированная лямбда, комбинаторы, типизация, лень, вывод типов, зависимые типы, куча абстракций для которых у меня пока не хватает мозга.

Рекурсия божественна.

Марковщина - выродилось в Рефал. Да, это не лямбда, но отнесем к функциональщине.
Каких-нибудь прологистов причислим к ним же. Побочная веточка, ибо близко.

Далее несколько слов о чистоте и нечистоте.

Чистых вещей очень мало. Если сложить две чистые вещи, то мы не получим чистую вещь. Поэтому есть с десяток чистых вещей, а все остальные десять тысяч языков - нечисть.

Что такое чистая имперосятина или функциональшина? Можно говорить лишь о степени фишек и чистоты. Про идеалы чистоты импреративщины как то сложно что-то сказать (это машина Тьюринга?), попробую высказаться про чистоту объектности.

Если не рассматривают пару пятен, то идеалом является smalltalk и self. Последний почти канул в реке, я лишь скачал/запустил образ машины и немного поигрался. С ST же можно полноценно играться, мне понравилось. Так вот - есть лишь понятие объекта, и ничего более. Даже Оккама с бритвой тоже нет. Объекту можем послать сообщение. Как я уже говорил, больше ничего нет. Просто, не так ли?

Послать сообщение - значит по слоту (объекту) передать какой-то другой объект. 2 + 3 - это вам не сложение двух интов, это объекту 2 посылается сообщение + (это объект), с параметром 3(это объект). Вместо +, можно кинуть другой объект, который не захардкоден, а получается в результате вычислений.

Исходный код - это объект. Его можно откомпилировать (послать сообщение), и запустить (послать сообщение). Классов нет - это тоже объекты (прототипная/акторная(?) модель, в js что-то такое же). Есть объект Boolean и еще два объекта True и False. Это все объекты. Нет даже циклов и условий - это все посылка сообщения.

Короче, можно поставить какой-нибудь dolphin ST и наслаждаться, наслаждаться и четыре раза.

Если взять любое г из ++/#/java и иже с ними, то там все сложнее и наслаждаться не хочется.

С чистотой у функциональщиков попроще, достаточно выкинуть всю г имперосятину из языка (мутабельность и внешний мир).

Элементы модульности/пакетности проникают и в ФП: какой-нибудь Typeclasses в haskell и какой-нибудь behavior в erlang можно рассматривать как интерфейсы. Проблема в том, что проникновение ФП в процедурщину меня все время толкает только на ха-ха.

А теперь главный философский вопрос: а зачем так много языков? Язык то на самом деле один, это та хрень, которая вертится у вас в голове. И если кто-то не сможет выразить эту мысль на любом языке программирования, то тут как минимум два варианта: или еще нет мысли, или все печально.

Конечно, нужны языки работающие на разных уровнях абстракции. В тех редких случаях, когда нужно выжать 10-20% скорости программы вам придется работать с чем-то низкоуровневым; с чем-то большим - то желательно типизированным; с чем-то маленьким - нетипизированным; но всегда хочется высокоуровневым.

Стоит сказать, что сейчас понятие язык слилось с понятием платформы/framework-a/среды_разработки/документирования/etc. И выбирать язык не приходится, приходится выбирать все остальное.

Комментариев нет: