×Закрыть

«Почему ФЯ? » или Стоит ли учить что-то радикально отличное от C++/Java/Python

О чем эта статья?

В заголовке нет опечатки — это именно «ФЯ», а не «Я». Это сокращение означает «функциональные языки», и речь в статье пойдет о функциональном программировании (FP), точнее, даже не о нем самом, а о том, стоит ли тратить свое драгоценное время на знакомство с ним.

В сети можно найти десятки вводных статей о FP, как на русском, так и на английском. Зачем писать еще одну? Чем эта статья будет отличаться от уже существующих?

Большинство существующих источников начинаются с описания того, что такое FP (и зачастую этим и ограничиваются). Очевидно, предполагается, что читатель сам проникнется полезностью принципов FP, увидит области его применения, и на него снизойдет просветление

Но, как показывает практика, просветление (в виде способности с первого взгляда видеть корректное и элегантное решение проблемы в выбранной парадигме программирования) никогда не приходит вот так сразу, после первого знакомства с темой.

Как правило, первая реакция на знакомство с чем-то радикально новым — это «культурный шок», и FP в этом смысле не исключение. Типичная реакция может выглядеть так: «Как, жить без глобальных переменных? Что вы говорите, не просто без глобальных, а без переменных вообще? Без объектов и методов, без инкапсуляции? Тю, придурки, на дворе 21 век, а они без объектов... Нафига это надо? Пойду лучше GoF почитаю».

Так вот, эта статья ставит целью в первую очередь дать ответ на вопрос «нафига знать/изучать/использовать FP?».

Итак, не откладывая в долгий ящик:

Зачем же стоит изучать FP?

  1. Чтобы ознакомиться с новой парадигмой программирования. Изучение новой парадигмы программирования приведет к расширению вашего кругозора, освоению новых подходов и вообще позволит взглянуть на все, что вы делаете под новым ракурсом. Вы не обязательно начнете применять все изученное на практике, но знание наверняка пойдет вам на пользу. Если вы сомневаетесь — подумайте, будет ли полезно человеку, программирующему процедурно, изучить OOP, даже если он никогда не будет программировать на C++ или Java?

    Возможно, со стороны будет проще проникнуть в суть уже известных вещей и увидеть не только их положительные и отрицательные стороны. После знакомства с мультиметодами станут видны недостатки модели передачи управления в OOP и OOP-инкапсуляции вообще. После изучения параметрического полиморфизма станут видны ограничения «inclusion полиморфизма» (того самого, который входит в знаменитую OOP-тройку «полиморфизм, инкапсуляция, абстракция»).

    Знание слабых сторон ежедневно используемых инструментов, безусловно, позволит использовать их более эффективно.

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

    Взгляните на перечень языков, которыми пользовались победители соревнований ICFPC, в рамках которых необходимо за три дня реализовать довольно объемную алгоритмически сложную систему, или изучите статистику, собранную Project Euler. Вы обнаружите, что существенная часть тех, кто выступил лучше всех (или попал в верхние 20%) использовала тот или иной язык функционального программирования.

    Причем, если авторов ICFPC еще можно при желании заподозрить в предвзятом отношении к участникам, использовавшим функциональные языки, то projecteuler.net должны быть в этом смысле вне подозрений.

  3. Чтобы понять, как можно связать программирование и математику. Наконец-то можно будет получить ответ на вопрос, зачем вообще придумали эти чертовы частично-рекурсивные функции и лямбда-исчисление, или — о ужас — теорию категорий. Более того — окажется, что эта- и бета-редукции — это мощный инструмент оптимизации программ, а теория категорий помогает писать generic код.
  4. Чтобы поглубже узнать то, что вы уже наверняка и так использовали (хотя бы раз). Многие принципы и инструменты, впервые появившиеся в функциональных языках, рано или поздно просачиваются в mainstream языки и получают широкое распространение. Примерами могут служить функции «map» и «filter» («grep») в perl и python, list comprehensions в python, анонимные функции в этих же языках или анонимные методы в Java, весь язык XSLT целиком (хотя тех, кто придумал его синтаксис, убить мало), новомодный механизм LINQ и многое другое.
  5. Чтобы быть в курсе новинок в области языков программирования. В настоящее время в мире ведутся интенсивные исследования в области теории языков программирования.

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

    Примерами могут служить currying, монады, software transactional memory, polymorphic variants, функции-как-процессы, их автоматическая миграция и прозрачное масштабирование runtime. К сожалению, я отступаю от своего собственного правила, и даю ссылки на «что», без объяснения «зачем», т.к. тут материала еще на 10 статей.

PS

Традиционно те, кто впервые сталкивается с FP, одним из первых задают вопрос: «ну хорошо, если все так замечательно, то где серьезный софт, написаный на этих языках?». Почти наверняка это вопрос возникнет и у читателей этой статьи, и лучше ответить на него сразу:
  • на Erlang написан Jabber server ejabberd, который используется, в частности, на серверах jabber.kiev.ua и jabber.ru
  • на OCaml написан один из самых функциональных P2P клиентов mldonkey
  • на Haskell написана распределенная система контроля версий darcs
UPD:

Дополнения и исправления по материалам присланых комментариев:

  • Тот полиморфизм, который в OOP — это inclusion polymorphism. А ad-hoc — это из процедурного стиля. Fixed.
  • Вместо альфа-редукции следует читать эта-редукции. Fixed.

Дополнительный списко примеров real-world софта на ФЯ:

  • Единственная уже работающая реализация perl6 сделана на Haskell: pugs
  • Haskell используется для финансовой аналитики в Credit Suisse: статья
  • Galois Connectios разрабатывает на Haskell и OCaml инстументы и приложения в области криптографии и информационной безопасности

Надеюсь, что вы вынесли для себя из этой статьи что-то полезное. Я буду рад услышать ответную реакцию (в виде комментариев или писем на dastapov@gmail.com). Если статья вызовет интерес — возможно, на DOU появится постоянный раздел, посвященный FP.

  • Популярное

43 комментария

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Взагалі-то і Пітон вважається мовою «вищою» за С/С++ (на Java не програмував).Тому мене це і здивувало.

Що є в OCaml (ML) та нема в Пайтоні, так це Variants та Pattern matching (on datatypes), [див. посилання в попередній відповіді].І все ж таки, все залежить лише від конкретної мови програмування. Те, що мова програмування функціональна, не є свідченням того, що вона матиме якісь особливі переваги в плані системи типів даних, і навпаки.Мені так здається, можливо, я помиляюсь.

Я так понимаю списки — основная часть функциональных языков, иначе все эти редукции и рекурсии просто невозможны. А вот словари, например, там есть?

Це дивлячись про яку мову програмування йдеться. В Ліспах, окрім списків та атомів є ще дуже багато різних корисних “типів” даних. В OCaml як і в інших ML інший “базовий” набір даних та способи роботи з ними.Однак, будучи, загалом мовами програмування “вищого” за C/C++/Java рівня, як правило, функціональні мови програмування мають і багатші (потужніші) засоби (типи даних).

2CB: я думаю это как раз к F#; -) вообще, в microsoft research много людей работающих с функциональными языками и особенно много людей, известных по миру Haskell

Не знаю чи в тему, тільки що наткнувся на статтю: Mixing the Objective Caml and C# Programming Models in the.Net Framework

Может, меня тут и забросают банановыми кожурами любители ФЯ, но я так и не допер, а чем Питон не функциональный язык? Там функция вроде как «first class citizen». Как минимум было бы неплохо дать определение, что такое ФЯ и чем он отличается от C++/Java/Python

Есть большие коммерческие проекты, которые используют ФЯ.

О чем автор статьи забыл упомянуть — так это о том, что большинство ФЯ — академические поделки со всеми вытекающими — документации нет, библиотек нет, пишут на нем в основном студенты для академиков. Наиболее вразумительное впечатление (кроме erlang) производят ocaml и clean — для первого вроде как есть куча документации с библиотеками, а на втором вроде как делают реальные проекты для индустрии. Вот на примере ocaml и рассмотрим: 1) Документация — она как бы есть. Ажно целую книжку накатали. Толку с нее правда никакого. Вот например образчик, разъясняющий их систему модулей (модули — это очень отдаленные потомки Сишных header файлов): . Кто там без поллитры разобрался — поднимите руки.2) Сообщения от компилятора редкостно информативны — в большинстве случаев просто «syntax error» с указанием строчки. Типа, раз ты, мальчик, такой умный, что взялся за ФЯ — вот сам и разбирайся, где ты там точку с запятой забыл поставить.3) Библиотеки — вообще пестня: заходим на Camel Humps — это так у камловодов сборник ссылок на либы называется — тыкаем в раздел databases- смотрим на даты релизов и статус — и плачем. Ну хоть ODBC есть — и то хлеб.в разделе Graphical toolkits — та же картина. Ежели вы не под Линухом и работаете с чем отличным от GTK — вам сильно не повезло.в разделе XML — те же там же — бета версии 0.2 от 2004 года. Потом, видимо, студент, писавший этот курсовик, закончил универ — и дело встало. А господам академикам сей приземленный предмет неинтересен — оне все компилятор улучшають.

2MaximKat: в москве можно найти., а так — на соответствующих сайтах разработчиков, часто публикуют вакансии для соответствующих языков.для лиспа можете посмотреть вот тут — http://lispjobs.wordpress.com/

В реальных проектах сочетают ФЯ и C++...

в Киеве:) Есть контора. А то и не одна.

А вот например где находят работу программисты на ФЯ?

думайте, есть еще варианты...

понятно, т.е. вы сюда не на охоту ходите. Давайте не разводить полемику в подобном ключе в коллективном блоге, ок? Или как там надо написать: «аффтар — больше ни пиши», да?

А о реализации на подобных языках MPI и использовании для моделирования будущих процессоров со множеством ядер и исполнительных блоков внутри каждого? С динамическим переназначением и перепрограммированием исполнительных блоков...Есть ли другие альтернативы?

В этом вопросе я просто-напросто некомпетентен. Впрочем, чем-то подобным, возможно, занимается Сергей Зефиров (они периодически пишет о чем-то подобном в thesz.livejournal.com), если есть реальный интерес — возможно он может помочь.

похоже, она расплескалась где-то по дороге

думайте, есть еще варианты... аффтар, а если не секрет, существуют, какие-либо *объективные* предпосылки противопоставления С++ и ФП?...

смешно, король умер — да здравствует анархия!... аффтар, жду статью о форте, и о том, как на нем писали ПО для телескопа из не помню уже какой обсерватории... таки ведь написали, значит можно!...

Если вы пытались донести этим комментарием какую-то мысль, то, похоже, она расплескалась где-то по дороге. Вас не затруднит выразить свою мысль более доступно?

А о реализации на подобных языках MPI и использовании для моделирования будущих процессоров со множеством ядер и исполнительных блоков внутри каждого? С динамическим переназначением и перепрограммированием исполнительных блоков...Есть ли другие альтернативы?

смешно, король умер — да здравствует анархия!... аффтар, жду статью о форте, и о том, как на нем писали ПО для телескопа из не помню уже какой обсерватории... таки ведь написали, значит можно!...:)

ну реализации на лиспе/scheme — там не самые оптимальные. сравнивать перемножение на окамле в одну строку с перемножением на лиспе, разбитой на три строки — просто смешно. Непонятно почему была выбрана конкретная реализация Scheme, и т.п.В общем, данная ссылка оставляет больше вопросов, чем дает ответов

Однак, ті три рядка виконують саме те, що і рядок на OCaml і кількість рядків на швидкодію, в цьому випадку, не впливає.До того ж, Scheme — функціональна мова програмування (принаймні, всі так кажуть).Як варіант: http://www.ffconsultancy.com/l...Порівняння програми на імперативному C++ з програмою на функціональному OCaml.

ну реализации на лиспе/scheme — там не самые оптимальные. сравнивать перемножение на окамле в одну строку с перемножением на лиспе, разбитой на три строки — просто смешно. Непонятно почему была выбрана конкретная реализация Scheme, и т.п.В общем, данная ссылка оставляет больше вопросов, чем дает ответов

Полезно было бы скорее показать на каком-то примере, что при использовании ФП программа становится проще-логичнее-упорядоченей. Тогда вопрос “зачем? ” исчез бы сам собой:).

От доступний приклад-порівняння на C++ Java OCaml та Lisp: http://www.ffconsultancy.com/l...Він не те щоб вичерпний був, але загальне уявлення може дати.

А в реальных цифрах?

А скачать-посмотреть?

Почему ни слова ни сказано о том, как программы на ФЯ выполняются и соотностяся по скорости с классическими императивными языками?

Потому, что это потребует конкретных примеров и кучи специфики, что явно выходило за рамки вводной статьи. Я надеюсь, вы не предлагали обсуждать какую-то абстрактную «скорость вообще»?:) Кстати, в комментариях давали ссылку на «Great Language Shootout» — там, в принципе, достаточно материалов для того, чтобы делать для себя какие-то выводы.

Вы в курсе, что darcs ужасно медленный для серьезных применений?

Darcs бывает медленный только в том случае, если ему надо рассчитать кучу конфликтов в большом changeset-е. И то, этой особенности осталось жить до осени этого года — сейчас формат хранения патчей и алгоритм их применения переделывается, чтобы исключить возможность возникновения explosive blowup при рассчете конфликтов.Как я могу наблюдать, репозиторий GHC (http://www.haskell.org/ghc/), который был сконвертирован из репозитория CVS с 10-летней историей, живет себе и в ус не дует. Да и по моему собственному опыту слухи о медленности darcs несколько... эээ... преувеличены.

Самым большим открытым проектом на сегодняшний день является дерево исходников Mozilla.

Не факт, OpenOffice.org побольше будет.

Spasibo. Interesno. Sey4as na (s ispol’zovaniem) podobnuh veshah/yazukah/tehnologiyah rabotaet i finance SW. zhayu neskol’ko primerov, odin — lider runka.Klassno bulo bu uvidet’ ewe takie tekstu)

> Вы в курсе, что darcs ужасно медленный для серьезных применений? http://darcs.haskell.org/ — это серьезное применение или нет?

Почему ни слова ни сказано о том, как программы на ФЯ выполняются и соотностяся по скорости с классическими императивными языками?

OCaml демонструє кращі за Java результати

2bialix: потому-что это отдельная, большая тема: -) http://rmrfchik.livejournal.co... — некоторые результаты тестирования производительности

Если бы меня попросили раскрыть этот пункт отдельно, я бы чуть изменил формулировку и сказал, что хорошие результаты в ICFPC, сокращение времени написания программ, сокращение времени на отладку и т.п. коррелирует с использованием ФЯ. При этом причиной корреляции является, скорее всего, что-то третье.Согласен, конечно же.Нет, я вовсе не утверждаю, что ФЯ приводит к замечательным результатом сами по себе.Я не думаю, что Вы серьезно это утверждаете. Это только мое мнение о том, как воспринимается этот пункт в Вашем тексте. Ничего больше. В комментариях к Вашей записи в ЖЖ jerom говорил нечто подобное. Ваш ответ ему я уже прочитал. Ок.

Грубо говоря, они (победители) «зачастую выбирают ФЯ потому, что они лучшие», а не «они лучшие потому, что выбрали ФЯ». [...] Возникает впечатление перестановки причины и следствия.

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

Альтернативная трактовка заключается в том, что кол-во писателей на C/C++/Java в рядах участников изначально невелико (кстати, я бы рискнул утверждать, что это не так) или...? ...то, что у победителей определенный склад ума (это довольно-таки специализированные соревнования) и более широкий кругозор. Я уверен, что если бы команду Google’а на прошлом ICFPC заставили писать, например, только на Java, из первой пятерки они бы не вылетели.Грубо говоря, они (победители) «зачастую выбирают ФЯ потому, что они лучшие», а не «они лучшие потому, что выбрали ФЯ». На самом деле, может быть, это я неверно воспринял написанное Вами, но у меня создалось впечатление, что Вы утверждаете обратное, за счетМногочисленные статьи утверждают, что использование функциональных языков способно увеличить скорость написание программ, уменьшить время на отладку и т.п. Впрочем, сложно верить статьям, хочется примеров из реальной жизни. и затем Вы обнаружите, что существенная часть тех, кто выступил лучше всех (или попал в верхние 20%) использовала тот или иной язык функционального программирования.Возникает впечатление перестановки причины и следствия.

для заинтересовавшихся — вот сайт проекта перевода «Введения в функциональное программирование» — http://code.google.com/p/funpr.../можно читать то, что уже переведено: -)

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

Возможно, я правильно догадываюсь, но лучше бы «сверить часы». Альтернативная трактовка заключается в том, что кол-во писателей на C/C++/Java в рядах участников изначально невелико (кстати, я бы рискнул утверждать, что это не так) или...?

Большое спасибо за интересную статью о ФЯ. Жду продолжения:) В копилку ссылок и примеров использования ФЯ в успешных коммерческих проектах предложил бы добавить еще одну — о проекте Viaweb и преимуществах, которые дало использование Lisp:

Спасибо, ты открыл мне новые горизонты

Я десь чув, що мова для написання формул в Excel також функціональна.

Неплохо. Вам, как мне кажется, удалось добиться того, что по стилю изложения текст не вызывает ощущение чтения рекламного проспекта, чем он является по сути.Я бы добавил еще как минимум преимущества ФП для параллельного программирования. В качестве примера привести тот же MapReduce.И вот: Возможно, со стороны будет проще проникнуть в суть уже известных вещей и увидеть не только их положительные и отрицательные стороны.А какие еще? Я так понимаю, здесь пропущен союз «но». Вы обнаружите, что существенная часть тех, кто выступил лучше всех (или попал в верхние 20%) использовала тот или иной язык функционального программирования.Это факт, но трактовка которую Вы приводите неверна, имхо, и использовать ее не совсем честно. Думаю, Вы понимаете о чем я. язык XSLT целиком (хотя тех, кто придумал его синтаксис, убить мало) Вообще не понимаю, как пришло в голову разработать XML, при наличии s-выражений.

2Andrey: есть хорошее введение в функциональное программирование от Джона Харрисона — http://www.cl.cam.ac.uk/Teachi...Оно сейчас в процессе перевода на русский — там как раз и рассказывается про преимущества ФП, связь его с математикой, и области применения

2eGlyph: мне пиариться незачем — я там не работаю. Основные выигрыши от использования Схемы такие: — портабельность продукта — системно-зависимый слой очень мал и легко переносится- логика обработки почты очень хорошо ложиться в стандартную для ФЯ рекурсию- высокоуровневый язык позволяет быстро разрабатывать новые вещи (я сейчас вижу как почту обрабатывают на С++ — это просто ужас) — политика фильтрации — программа на Схеме, ее можно и написать самому

Статья интересная, но хотелось бы больше. Но чтобы снизошло «просветление» маловато. Полезно было бы скорее показать на каком-то примере, что при использовании ФП программа становится проще-логичнее-упорядоченей. Тогда вопрос «зачем? » исчез бы сам собой:).

что на функциональном языке Scheme написан коммерческий продукт СМАП «Дозор-Джет»

Alex, пиаритесь? Не заметно, чтобы «Дозор» что-то выиграл от использования Scheme.

В качестве комментария могу написать, что на функциональном языке Scheme написан коммерческий продукт СМАП «Дозор-Джет» (http://www.jetsoft.ru/product/...), который имеет большую инсталяционную базу в России и СНГ — на Scheme написано все — и подсистема фильтрации и веб-интерфейс. Использование данного языка позволило сделать продукт хорошо портабельным на разных платформах

На OCaml написана та програмуліна, що на Вікіпедії формули відображає.На якомусь із ML здається, що пишеться реалізація двигунця наступної версії ECMAScript.І багато чого іншого.OCaml генерує програми, які за швидкодією можуть змагатись з C та C++.

Подписаться на комментарии