Функциональное программирование изменит мир

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

Не могу не признать, что существенное влияние тут оказал и тот факт, что с недавнего времени я являюсь сотрудником компании Майкрософт, а следовательно, могу создать блог на такой популярной и уважаемой платформе как MSDN.

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

Но для начала несколько слов о себе.

Я не являюсь евангелистом и использую языки программирования по их прямому назначению. Более того, как многие из нас, я имею обширный опыт работы с преимущественно императивными языками программирования, такими как C#. Однако некоторое время назад со мной что-то произошло, и отношение мое к программированию кардинально изменилось. Нет, мне по-прежнему нравится писать программы, и я страшно доволен тем, что могу заниматься свои любимым делом и даже получать за это деньги. Но теперь, когда я смотрю на код, меня начинают удивлять казалось бы самые обычные вещи - передача параметров через ref, присваивание значений переменным, которые уже были вполне успешно проинициализированы, внутренние, скрытые от нашего глаза изменяемые состояния у обьектов, странные функции, которые ничего не принимают и ничего не возвращают. Что же в этом такого удивительного, спросите вы. Самые обычные вещи. Может, мне просто стоит взять отпуск и немного отдохнуть от программирования?

Но, увы - проверено. Отпуск не помогает. Я как будто просто потерял способность воспринимать эти самые обычные вещи так же, как и раньше. Помешательство? Да, возможно. И помешательство это называется "функциональное программирование".

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

Функциональное программирование изменит мир.

Да, я в курсе, что оно пытается сделать это с конца 50-х, но откуда вы знаете, что мир уже не изменился? Кто может сказать, на что была бы похожа современная индустрия, если бы в свое время, в 1958 году, Джон Маккарти не изобрел бы язык под названием Лисп. Но если даже и не мир, то наш собственный образ мышления, наше отношение к программированию, может весьма заметно измениться. Что хорошо видно на моем примере.

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

Ela относится к категории языков "решай задачи в функциональном стиле или же разбей клавиатуру о стену". Это значит, что Ela немного не похожа на C#. Например, в ней нет изменяемых переменных и конструкций для организации циклов. Нет многих "встроенных" в язык операторов, даже таких банальных как сложение или умножение (хотя вы, конечно, можете определить их сами). Нет классов, наследования, итераторов. Даже нет функций, которые принимают больше одного аргумента. Так что же в ней есть?

Наверняка вы сейчас думаете, что Ela похожа на какой-нибудь Brainfuck, но в действительности у нее куда более благородные намерения в отношении вашего мозга. Никакой эзотерики! Как раз напротив, Ela делает все для того, чтобы код был наиболее наглядным и читабельным. Оказывается, что для этого не нужны ни циклы, ни изменяемые переменные. Зачем нам циклы, если мы собираемся писать код в функциональном стиле?

Но что же все-таки означает "писать код в функциональном стиле"? Наверняка многие из вас уже пытались разобраться в том, что представляет собой функциональное программирование, и какие языки можно с уверенностью относить к функциональным, а какие - нет. И наверняка вы уже в курсе, что существует множество определений функциональной парадигмы, которые зачастую совершенно не помогают разобраться в том "что есть что". Действительно, если определений много - то какому из них верить? Один твердит, что JavaScript - это самый настоящий функциональный язык и вполне убедительно это аргументирует. Другой - что даже такие языки как Scala, Nemerle, Lisp - ни разу не функциональные. Кто прав?

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

Все дело в том, что язык программирования - это просто инструмент, а использовать любой инструмент можно по-разному. Не знаю, является ли тот же JavaScript "настоящим" функциональным языком или нет, но писать функциональный код на нем вполне можно. Как можно писать его и на C#.

Но обо всем этом, как говорится, в следующих сериях.