От редактора
Языки программирования, используемые в разработке промышленных систем1, не стоят на месте. Вводятся в оборот новые идиомы, да и сами языки расширяются с целью добавления возможности оперировать абстракциями более высокого порядка. Языки C# и Visual Basic обзавелись абстракцией LINQ, позволяющей декларативно производить запросы к структурированной информации, базам данных. В язык Java добавили обобщённые типы данных («generics»); велись жаркие дебаты по добавлению замыканий в стандарт Java 7 [1]. Замыкания и лямбда-выражения появляются в новой редакции стандарта C++. Да и предлагавшаяся2 абстракция «концептов» в C++, структурирующая описание полиморфных интерфейсов, возникла из необходимости бороться с нарастающей сложностью создаваемых человеком информационных систем. Есть ли что-то общее между этими нововведениями, или разные языки развиваются независимо и разнонаправленно?
Как оказывается, общий вектор развития языков прослеживается без особого труда. С целью повышения уровня абстракции от аппаратуры и приближения к проблемным областям всё большее количество концепций, созданных в рамках парадигмы функционального программирования, находят своё место в императивных языках.
Функциональная парадигма программирования и функциональные языки уже долгое время являются источником «новых» идей в массовых языках программирования. Отказ от ручного управления памятью и использование сборщика мусора (Smalltalk, Java, C#) пришли из функциональных языков типа LISP, где сборка мусора появилась ещё в 1959 году. Генераторы списков3 в языке Python и новом стандарте JavaScript пришли из функциональных языков Haskell и Miranda, впервые появившись в функциональном языке NPL. Некоторые абстракции в императивных языках разработаны почти независимо от соответствующих абстракций в функциональных языках, но развиваются десятилетиями позже. Так, например, проект «концептов» в новом стандарте C++ соответствовал «классам типов» в языке Haskell, появившимся в нём в 1989 году [4].
Технология LINQ в .Net тоже является прямым результатом мышления в функциональном стиле. Не случайно, что автор LINQ, Эрик Мейер [5, 6], является одним из дизайнеров функционального языка Haskell. Вот что говорит ведущий архитектор языка C#, а также создатель Turbo Pascal и Delphi, Андерс Хейлсберг [2]:
Функциональное программирование, по-моему, — чрезвычайно интересная парадигма. Если взглянуть на C# 3.0, то станет видно, что именно идеи из мира функционального программирования послужили источником вдохновения для LINQ и составляющих его элементов языка. Мне кажется, сейчас, наконец, наступил момент, когда функциональному программированию пора выйти в массы.
Как мы видим, элементы функционального программирования проникают в массы путём постепенного внедрения в обычные, императивные языки. Что необходимо программисту для эффективного использования этих элементов? Мы убеждены, что для наиболее эффективного усвоения того или иного метода или парадигмы программирования их нужно изучать в максимально чистом виде, удалённом от «мусора» альтернативных подходов. Владение функциональной парадигмой в её «чистом» виде позволяет эффективно применять новые функциональные элементы современных языков для управления сложностью разрабатываемых систем, а также существенно обогащает набор инструментов, доступных для решения той или иной задачи.
Практика функционального программирования
Вашему вниманию представляется первый выпуск журнала, посвящённого практике функционального и декларативного программирования. Мы ставим своей задачей помочь вам сориентироваться в инструментарии функционального программирования, в используемых в функциональной парадигме подходах к декомпозиции задач, способах упрощения программирования и снижения количества дефектов в разрабатываемых системах.
Первый номер журнала посвящён погружению в предмет функционального программирования. Вводные статьи Сергея Зефирова «Лень бояться» и Романа Душкина «Функции и функциональный подход» затрагивают философию парадигм программирования. Более практически направленная часть журнала представлена статьёй Евгения Кирпичёва «Изменяемое состояние: опасности и борьба с ними», классифицирующей типы проблем, возникающих при небрежном использовании сущностей с изменяемым состоянием, и следующей за ней статьёй Дмитрия Астапова «Давно не брал я в руки шашек», на протяжении нескольких страниц раскрывающей подход проектирования «сверху вниз» на подробном примере написания игры в шашки на языке Haskell. Статья Дэна Пипони «Моноиды в Haskell и их использование» в переводе Кирилла Заборского простым языком обьясняет практическое применение моноидов для создания элегантных полиморфных алгоритмов. Номер завершается внушительным «Обзором литературы о функциональном программировании» Алексея Отта, содержащим множество ссылок на русскоязычную и англоязычную литературу по разным языкам и аспектам декларативного программирования.
Авторский коллектив журнала состоит из профессионалов промышленного программирования, участников международных олимпиад, конкурсов и конференций по функциональному программированию и преподавателей вузов России, стран ближнего и дальнего зарубежья.
Приятного чтения!
Лев Валкин, vlm@fprog.ru
Список литературы
- [1]
- Closures for the Java Programming Language (v0.5). Предложенное дополнение к языку Java: http://www.javac.info/closures-v05.html.
- [2]
- The A-Z of Programming Languages: C#. Статья в Computerworld: http://www.computerworld.com.au/article/261958/-z_programming_languages_c, 2008. Интервью с ведущим архитектором языка C#, Андерсом Хейлсбергом.
- [3]
- The Removal of Concepts From C++0x. Статья в InformIT: http://www.informit.com/guides/content.aspx?g=cplusplusseqNum=441, 2009. Рассматриваются причины отказа от включения «концептов» в стандарт языка C++.
- [4]
- Jean-Philippe Bernardy, Patrik Jansson, Marcin Zalewski, Sibylle Schupp, and Andreas Priesnitz. A comparison of C++ concepts and Haskell type classes. In WGP ’08: Proceedings of the ACM SIGPLAN workshop on Generic programming, pages 37–48, New York, NY, USA, 2008. ACM.
- [5]
- Erik Meijer. On LINQ. Видеоинтервью: http://www.infoq.com/interviews/erik-meijer-linq, 2007. Создатель LINQ, Эрик Мейер, рассказывает о дизайне и возможностях LINQ, о том, как его использовать, зачем его использовать, чем LINQ отличается от XQuery, как LINQ связывается с ORM и о многом другом.
- [6]
- Erik Meijer. Functional Programming. Канал 9 MSDN: http://channel9.msdn.com/shows/Going+Deep/Erik-Meijer-Functional-Programming/, 2008. Видео, в котором Эрик Мейер, архитектор Microsoft SQL Server, Visual Studio и .Net, рассказывает о функциональном программировании, академических и промышленных применениях функциональных языков.
- 1
- Неформальный термин «промышленная система» или «промышленный язык» используется для контраста с «академическими», «учебными» или «экспериментальными» системами и языками.
- 2
- Пока верстался номер, комитет по стандартизации C++ принял решение воздержаться от включения «концептов» в новый стандарт языка [3], не сумев упростить предложенное расширение до состояния работоспособности.
- 3
- List comprehensions, нотация, позволяющая создавать и фильтровать списки элементов декларативным путём.
Этот документ был получен из LATEX при помощи HEVEA