“Почему ФЯ?” или Стоит ли учить что-то радикально отличное от C++/Java/Python
ADEptОпубликовано 20.04.2007 в Разработка, статьи
О чем эта статья?
В заголовке нет опечатки - это именно “ФЯ”, а не “Я”. Это сокращение означает “функциональные языки”, и речь в статье пойдет о функциональном программировании (FP), точнее, даже не о нем самом, а о том, стоит ли тратить свое драгоценное время на знакомство с ним.
В сети можно найти десятки вводных статей о FP, как на русском, так и на английском. Зачем писать еще одну? Чем эта статья будет отличаться от уже существующих?
Большинство существующих источников начинаются с описания того, что такое FP (и зачастую этим и ограничиваются). Очевидно, предполагается, что читатель сам проникнется полезностью принципов FP, увидит области его применения, и на него снизойдет просветление
Но, как показывает практика, просветление (в виде способности с первого взгляда видеть корректное и элегантное решение проблемы в выбранной парадигме программирования) никогда не приходит вот так сразу, после первого знакомства с темой.
Как правило, первая реакция на знакомство с чем-то радикально новым - это “культурный шок“, и FP в этом смысле не исключение. Типичная реакция может выглядеть так: “Как, жить без глобальных переменных? Что вы говорите, не просто без глобальных, а без переменных вообще? Без объектов и методов, без инкапсуляции? Тю, придурки, на дворе 21 век, а они без объектов… Нафига это надо? Пойду лучше GoF почитаю”.
Так вот, эта статья ставит целью в первую очередь дать ответ на вопрос “нафига знать/изучать/использовать FP?”.
Итак, не откладывая в долгий ящик:
Зачем же стоит изучать FP?
- Чтобы ознакомиться с новой парадигмой программирования. Изучение новой парадигмы программирования приведет к расширению вашего кругозора, освоению новых подходов и вообще позволит взглянуть на все, что вы делаете под новым ракурсом. Вы не обязательно начнете применять все изученное на практике, но знание наверняка пойдет вам на пользу. Если вы сомневаетесь - подумайте, будет ли полезно человеку, программирующему процедурно, изучить OOP, даже если он никогда не будет программировать на C++ или Java?
Возможно, со стороны будет проще проникнуть в суть уже известных вещей и увидеть не только их положительные и отрицательные стороны. После знакомства с мультиметодами станут видны недостатки модели передачи управления в OOP и OOP-инкапсуляции вообще. После изучения параметрического полиморфизма станут видны ограничения “inclusion полиморфизма” (того самого, который входит в знаменитую OOP-тройку “полиморфизм, инкапсуляция, абстракция”).
Знание слабых сторон ежедневно используемых инструментов, безусловно, позволит использовать их более эффективно.
- Чтобы повысить свою производительность. Многочисленные статьи утверждают, что использование функциональных языков способно увеличить скорость написание программ, уменьшить время на отладку и т.п. Впрочем, сложно верить статьям, хочется примеров из реальной жизни.
Взгляните на перечень языков, которыми пользовались победители соревнований ICFPC, в рамках которых необходимо за три дня реализовать довольно объемную алгоритмически сложную систему, или изучите статистику, собранную Project Euler. Вы обнаружите, что существенная часть тех, кто выступил лучше всех (или попал в верхние 20%) использовала тот или иной язык функционального программирования.
Причем, если авторов ICFPC еще можно при желании заподозрить в предвзятом отношении к участникам, использовавшим функциональные языки, то projecteuler.net должны быть в этом смысле вне подозрений.
- Чтобы понять, как можно связать программирование и математику. Наконец-то можно будет получить ответ на вопрос, зачем вообще придумали эти чертовы частично-рекурсивные функции и лямбда-исчисление, или - о ужас - теорию категорий. Более того - окажется, что эта- и бета-редукции - это мощный инструмент оптимизации программ, а теория категорий помогает писать generic код.
- Чтобы поглубже узнать то, что вы уже наверняка и так использовали (хотя бы раз). Многие принципы и инструменты, впервые появившиеся в функциональных языках, рано или поздно просачиваются в mainstream языки и получают широкое распространение. Примерами могут служить функции “map” и “filter” (”grep”) в perl и python, list comprehensions в python, анонимные функции в этих же языках или анонимные методы в Java, весь язык XSLT целиком (хотя тех, кто придумал его синтаксис, убить мало), новомодный механизм LINQ и многое другое.
- Чтобы быть в курсе новинок в области языков программирования. В настоящее время в мире ведутся интенсивные исследования в области теории языков программирования.
Практическая реализация результатов этих исследований происходит в виде расширения одного из существующих функциональных языков, поскольку функциональное программирование органично вытекает из теории вычислений, мат. логики и прочих математических дисциплин.
Примерами могут служить 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.
Понравилась статья? Подпишись на обновления по RSS/E-mail



На OCaml написана та програмуліна, що на Вікіпедії формули відображає.
На якомусь із ML здається, що пишеться реалізація двигунця наступної версії ECMAScript.
І багато чого іншого.
OCaml генерує програми, які за швидкодією можуть змагатись з C та C++.
В качестве комментария могу написать, что на функциональном языке Scheme написан коммерческий продукт СМАП “Дозор-Джет” (http://www.jetsoft.ru/product/dozor/purpose.html), который имеет большую инсталяционную базу в России и СНГ - на Scheme написано все - и подсистема фильтрации и веб-интерфейс.
Использование данного языка позволило сделать продукт хорошо портабельным на разных платформах
Alex, пиаритесь? Не заметно, чтобы “Дозор” что-то выиграл от использования Scheme.
Статья интересная, но хотелось бы больше. Но чтобы снизошло “просветление” маловато. Полезно было бы скорее показать на каком-то примере, что при использовании ФП программа становится проще-логичнее-упорядоченей. Тогда вопрос “зачем?” исчез бы сам собой:).
2eGlyph: мне пиариться незачем - я там не работаю.
Основные выигрыши от использования Схемы такие:
- портабельность продукта - системно-зависимый слой очень мал и легко переносится
- логика обработки почты очень хорошо ложиться в стандартную для ФЯ рекурсию
- высокоуровневый язык позволяет быстро разрабатывать новые вещи (я сейчас вижу как почту обрабатывают на С++ - это просто ужас)
- политика фильтрации - программа на Схеме, ее можно и написать самому
2Andrey:
есть хорошее введение в функциональное программирование от Джона Харрисона - http://www.cl.cam.ac.uk/Teaching/Lectures/funprog-jrh-1996/index.html
Оно сейчас в процессе перевода на русский - там как раз и рассказывается про преимущества ФП, связь его с математикой, и области применения
Неплохо. Вам, как мне кажется, удалось добиться того, что по стилю изложения текст не вызывает ощущение чтения рекламного проспекта, чем он является по сути.
Я бы добавил еще как минимум преимущества ФП для параллельного программирования. В качестве примера привести тот же MapReduce.
И вот:
Возможно, со стороны будет проще проникнуть в суть уже известных вещей и увидеть не только их положительные и отрицательные стороны.
А какие еще? Я так понимаю, здесь пропущен союз «но».
Вы обнаружите, что существенная часть тех, кто выступил лучше всех (или попал в верхние 20%) использовала тот или иной язык функционального программирования.
Это факт, но трактовка которую Вы приводите неверна, имхо, и использовать ее не совсем честно. Думаю, Вы понимаете о чем я.
язык XSLT целиком (хотя тех, кто придумал его синтаксис, убить мало)
Вообще не понимаю, как пришло в голову разработать XML, при наличии s-выражений.
Я десь чув, що мова для написання формул в Excel також функціональна.
Спасибо, ты открыл мне новые горизонты
Большое спасибо за интересную статью о ФЯ. Жду продолжения
В копилку ссылок и примеров использования ФЯ в успешных коммерческих проектах предложил бы
добавить еще одну - о проекте Viaweb и преимуществах, которые дало использование Lisp:
Возможно, я правильно догадываюсь, но лучше бы “сверить часы”. Альтернативная трактовка заключается в том, что кол-во писателей на C/C++/Java в рядах участников изначально невелико (кстати, я бы рискнул утверждать, что это не так) или …?
для заинтересовавшихся - вот сайт проекта перевода “Введения в функциональное программирование” - http://code.google.com/p/funprog-ru/
можно читать то, что уже переведено
Альтернативная трактовка заключается в том, что кол-во писателей на C/C++/Java в рядах участников изначально невелико (кстати, я бы рискнул утверждать, что это не так) или …?
…то, что у победителей определенный склад ума (это довольно-таки специализированные соревнования) и более широкий кругозор.
Я уверен, что если бы команду Google`а на прошлом ICFPC заставили писать, например, только на Java, из первой пятерки они бы не вылетели.
Грубо говоря, они (победители) «зачастую выбирают ФЯ потому, что они лучшие», а не «они лучшие потому, что выбрали ФЯ».
На самом деле, может быть, это я неверно воспринял написанное Вами, но у меня создалось впечатление, что Вы утверждаете обратное, за счет
Многочисленные статьи утверждают, что использование функциональных языков способно увеличить скорость написание программ, уменьшить время на отладку и т.п. Впрочем, сложно верить статьям, хочется примеров из реальной жизни.
и затем
Вы обнаружите, что существенная часть тех, кто выступил лучше всех (или попал в верхние 20%) использовала тот или иной язык функционального программирования.
Возникает впечатление перестановки причины и следствия.
Нет, я вовсе не утверждаю, что ФЯ приводит к замечательным результатом сами по себе.
Если бы меня попросили раскрыть этот пункт отдельно, я бы чуть изменил формулировку и сказал, что хорошие результаты в ICFPC, сокращение времени написания программ, сокращение времени на отладку и т.п. коррелирует с использованием ФЯ. При этом причиной корреляции является, скорее всего, что-то третье.
Если бы меня попросили раскрыть этот пункт отдельно, я бы чуть изменил формулировку и сказал, что хорошие результаты в ICFPC, сокращение времени написания программ, сокращение времени на отладку и т.п. коррелирует с использованием ФЯ. При этом причиной корреляции является, скорее всего, что-то третье.
Согласен, конечно же.
Нет, я вовсе не утверждаю, что ФЯ приводит к замечательным результатом сами по себе.
Я не думаю, что Вы серьезно это утверждаете. Это только мое мнение о том, как воспринимается этот пункт в Вашем тексте. Ничего больше. В комментариях к Вашей записи в ЖЖ jerom говорил нечто подобное. Ваш ответ ему я уже прочитал. Ок.
Почему ни слова ни сказано о том, как программы на ФЯ выполняются и соотностяся по скорости с классическими императивными языками?
Вы в курсе, что darcs ужасно медленный для серьезных применений?
2bialix: потому-что это отдельная, большая тема
http://rmrfchik.livejournal.com/178383.html - некоторые результаты тестирования производительности
OCaml демонструє кращі за Java результати
>Вы в курсе, что darcs ужасно медленный для серьезных применений?
http://darcs.haskell.org/ - это серьезное применение или нет?
>>Вы в курсе, что darcs ужасно медленный для серьезных применений?
>http://darcs.haskell.org/ - это серьезное применение или нет?
Самым большим открытым проектом на сегодняшний день является дерево исходников Mozilla. Против него даже исходники ядра Линукса кажутся мелкими (55 тыс. против 10 тыс.). Считать размер дерева по вашей ссылке мне откровенно лень.
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 )
Не факт, OpenOffice.org побольше будет.
>> Самым большим открытым проектом на сегодняшний день является дерево исходников Mozilla.
> Не факт, OpenOffice.org побольше будет.
А в реальных цифрах?
Потому, что это потребует конкретных примеров и кучи специфики, что явно выходило за рамки вводной статьи. Я надеюсь, вы не предлагали обсуждать какую-то абстрактную “скорость вообще”?
Кстати, в комментариях давали ссылку на “Great Language Shootout” - там, в принципе, достаточно материалов для того, чтобы делать для себя какие-то выводы.
Darcs бывает медленный только в том случае, если ему надо рассчитать кучу конфликтов в большом changeset-е. И то, этой особенности осталось жить до осени этого года - сейчас формат хранения патчей и алгоритм их применения переделывается, чтобы исключить возможность возникновения explosive blowup при рассчете конфликтов.
Как я могу наблюдать, репозиторий GHC (http://www.haskell.org/ghc/), который был сконвертирован из репозитория CVS с 10-летней историей, живет себе и в ус не дует. Да и по моему собственному опыту слухи о медленности darcs несколько … эээ … преувеличены.
А скачать-посмотреть?
сами качайте и смотрите. я цифры назвал.
От доступний приклад-порівняння на C++ Java OCaml та Lisp:
http://www.ffconsultancy.com/languages/ray_tracer/index.html
Він не те щоб вичерпний був, але загальне уявлення може дати.
ну реализации на лиспе/scheme - там не самые оптимальные. сравнивать перемножение на окамле в одну строку с перемножением на лиспе, разбитой на три строки - просто смешно. Непонятно почему была выбрана конкретная реализация Scheme, и т.п.
В общем, данная ссылка оставляет больше вопросов, чем дает ответов
Однак, ті три рядка виконують саме те, що і рядок на OCaml і кількість рядків на швидкодію, в цьому випадку, не впливає.
До того ж, Scheme — функціональна мова програмування (принаймні, всі так кажуть).
Як варіант: http://www.ffconsultancy.com/languages/ray_tracer/comparison.html
Порівняння програми на імперативному C++ з програмою на функціональному OCaml.
смешно, король умер - да здравствует анархия!.. аффтар, жду статью о форте, и о том, как на нем писали ПО для телескопа из не помню уже какой обсерватории… таки ведь написали, значит можно!..
А о реализации на подобных языках MPI и использовании для моделирования будущих процессоров со множеством ядер и исполнительных блоков внутри каждого? С динамическим переназначением и перепрограммированием исполнительных блоков…
Есть ли другие альтернативы?
Если вы пытались донести этим комментарием какую-то мысль, то, похоже, она расплескалась где-то по дороге. Вас не затруднит выразить свою мысль более доступно?
думайте, есть еще варианты… аффтар, а если не секрет, существуют, какие-либо *объективные* предпосылки противопоставления С++ и ФП?…
В этом вопросе я просто-напросто некомпетентен. Впрочем, чем-то подобным, возможно, занимается Сергей Зефиров (они периодически пишет о чем-то подобном в thesz.livejournal.com), если есть реальный интерес - возможно он может помочь.
понятно, т.е. вы сюда не на охоту ходите. Давайте не разводить полемику в подобном ключе в коллективном блоге, ок? Или как там надо написать: “аффтар - больше ни пиши”, да?
А вот например где находят работу программисты на ФЯ?
в Киеве
Есть контора. А то и не одна.
В реальных проектах сочетают ФЯ и C++ …
2MaximKat:
в москве можно найти. а так - на соответствующих сайтах разработчиков, часто публикуют вакансии для соответствующих языков.
для лиспа можете посмотреть вот тут - http://lispjobs.wordpress.com/
О чем автор статьи забыл упомянуть - так это о том, что большинство ФЯ - академические поделки со всеми вытекающими - документации нет, библиотек нет, пишут на нем в основном студенты для академиков. Наиболее вразумительное впечатление(кроме erlang) производят ocaml и clean - для первого вроде как есть куча документации с библиотеками, а на втором вроде как делают реальные проекты для индустрии. Вот на примере ocaml и рассмотрим:
1) Документация - она как бы есть. Ажно целую книжку накатали. Толку с нее правда никакого. Вот например образчик, разъясняющий их систему модулей(модули - это очень отдаленные потомки Сишных header файлов): . Кто там без поллитры разобрался - поднимите руки.
2) Сообщения от компилятора редкостно информативны - в большинстве случаев просто “syntax error” с указанием строчки. Типа, раз ты, мальчик, такой умный, что взялся за ФЯ - вот сам и разбирайся, где ты там точку с запятой забыл поставить.
3) Библиотеки - вообще пестня: заходим на Camel Humps - это так у камловодов сборник ссылок на либы называется - тыкаем в раздел
databases
- смотрим на даты релизов и статус - и плачем. Ну хоть ODBC есть - и то хлеб.
в разделе Graphical toolkits - та же картина. Ежели вы не под Линухом и работаете с чем отличным от GTK - вам сильно не повезло.
в разделе XML - те же там же - бета версии 0.2 от 2004 года. Потом, видимо, студент, писавший этот курсовик, закончил универ - и дело встало. А господам академикам сей приземленный предмет неинтересен - оне все компилятор улучшають.
Есть большие коммерческие проекты, которые используют ФЯ.
Может, меня тут и забросают банановыми кожурами любители ФЯ, но я так и не допер, а чем Питон не функциональный язык? Там функция вроде как “first class citizen”.
Как минимум было бы неплохо дать определение, что такое ФЯ и чем он отличается от C++/Java/Python
http://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F
Не знаю чи в тему, тільки що наткнувся на статтю:
Mixing the Objective Caml and C# Programming Models in the .Net Framework
2CB:
я думаю это как раз к F#
вообще, в microsoft research много людей работающих с функциональными языками и особенно много людей, известных по миру Haskell
По ссылкам из википедии вышел на эту статью на сайте софткрафт:
http://www.softcraft.ru/paradigm/fp/whyfp.shtml
Сразу почему-то вспоминается цитата кого-то из великих про разницу между алгоритмами и данными, повторяю по памяти, неточно: скройте от меня структуры данных и покажите код — и я скорее всего ничего не пойму в вашей программе. Покажите мне структуры данных — и скорее всего глядеть на код не понадобится.
Не понимаю, почему в заголовке статьи вынесен в качестве противопоставления Питон. Если брать за оценку производительность программиста, то нативные высокоуровневые типы данных питона (как-то: строки, списки, словари) дают офигительный ускоритель для написания толковых программ, по сравнению с Це++.
Почему, когда разговаривают о функциональных языках, никогда не говорят о нативных типах данных, как будто их не существует вообще в этих языках, а есть только функции-функции-функции. Я так понимаю списки — основная часть функциональных языков, иначе все эти редукции и рекурсии просто невозможны. А вот словари, например, там есть?
Це дивлячись про яку мову програмування йдеться. В Ліспах, окрім списків та атомів є ще дуже багато різних корисних «типів» даних. В OCaml як і в інших ML інший «базовий» набір даних та способи роботи з ними.
Однак, будучи, загалом мовами програмування «вищого» за C/C++/Java рівня, як правило, функціональні мови програмування мають і багатші (потужніші) засоби (типи даних).
Взагалі-то і Пітон вважається мовою “вищою” за С/С++ (на Java не програмував).
Тому мене це і здивувало.
Що є в OCaml (ML) та нема в Пайтоні, так це Variants та Pattern matching (on datatypes), [див. посилання в попередній відповіді].
І все ж таки, все залежить лише від конкретної мови програмування. Те, що мова програмування функціональна, не є свідченням того, що вона матиме якісь особливі переваги в плані системи типів даних, і навпаки.
Мені так здається, можливо, я помиляюсь.