«Почему ФЯ? » или Стоит ли учить что-то радикально отличное от C++/Java/Python
О чем эта статья?
В заголовке нет опечатки — это именно «ФЯ», а не «Я». Это сокращение означает «функциональные языки», и речь в статье пойдет о функциональном программировании (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 инстументы и приложения в области криптографии и информационной безопасности
Надеюсь, что вы вынесли для себя из этой статьи что-то полезное. Я буду рад услышать ответную реакцию (в виде комментариев или писем на [email protected]). Если статья вызовет интерес — возможно, на DOU появится постоянный раздел, посвященный FP.
43 коментарі
Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.