Выбор функционального языка программирования [закрыто]

48

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

В прошлом семестре [курс] я познакомился со Схемой. Я люблю это. Мне очень понравилась крайняя простота синтаксиса, принцип гомойконичности , макросы ( гигиенические и негигиенические), множество процедур и т. Д.

Проблема со Схемой в том, что это академический язык. Я не думаю, что это действительно используется в производственных средах. Я тоже не верю, что это особенно хорошо иметь в нашем резюме. Итак, я искал альтернативы. Их много, и все они, похоже, имеют одинаковый уровень популярности.

Некоторые мысли о некоторых других функциональных языках, которые я уже рассмотрел:

  • Clojure: Звучит замечательно, потому что он может получить доступ к миру Java, он ориентирован на масштабируемость и параллелизм, но разве сейчас мир Java не на грани? Я уже достаточно хорошо знаю Java, но было бы разумно добавить еще больше энергии в зависимости от JVM?
  • Хаскелл: Похоже, очень ценится язык, но из того, что я прочитал, это также больше академический язык.
  • Лисп: Это было вокруг с незапамятных времен. Кажется, есть большая часть того, что мне нравится в Схеме. У него большое сообщество. Насколько я знаю, это, пожалуй, самый широко используемый в промышленности язык функционального программирования (?).
  • F #: действительно не учел это. Я не большой поклонник MS. У меня нет денег, чтобы заплатить за их программное обеспечение (я мог бы освободить их от университетских альянсов, но я более склонен использовать решения, основанные на сообществах). Хотя ... я думаю, это будет лучший выбор для карьеры.

Сегодня вечером я склоняюсь к Лиспу. Неделю назад это был Хаскелл. До этого это был Clojure. В прошлом году я занимался какой-то Схемой для удовольствия, а не продвигал ее по той причине, которую вы знаете. Теперь я хотел бы серьезно (об изучении одного, о выполнении реальных проектов с ним, о, возможно, в конечном итоге профессионально работать с ним). Моя проблема в том, что мне нужно изучить их все подробно, прежде чем я смогу выбрать один.

Joanis
источник
5
Что бы вы ни выбрали, напишите много кода, который вы используете для чего-то в нем.
8
Не думал о Скале ?
екомбинатор
@ykombinator: я слышал об этом, но я не искал дальше. Я не знаю, будет ли что-то, что я мог бы предложить по сравнению с теми, что я перечислил, или, может быть, это принесет комбинацию интересных вариантов от каждого из них ... Не знаю. Звучит как довольно скромный язык, хотя, похоже, набирает популярность.
Джоанис
1
Я не знаю, откуда вы узнали, что мир Java находится "на грани" - в настоящее время он переживает большой ренессанс, во многом благодаря: а) OpenJDK становится стандартной реализацией; б) новым языкам JVM, таким как Scala и Clojure, и в) тот факт, что большие объемы данных / облачные проекты растут, выбирая JVM в качестве целевой платформы и d) Android. По состоянию на начало 2012 года, это, пожалуй, самая захватывающая платформа для работы .....
mikera
1
@mikera: Согласен. Этому больше года, сразу после того, как Oracle приобрела Sun Microsystems, и все это волновало и размышляло о том, что будущее Java может быть скомпрометировано более контролирующей корпорацией, захватившей контроль ... JVM, к счастью, в данный момент выглядит достаточно безопасным!
Джоанис

Ответы:

35

Так как вы хотите практический  язык:

альтернативный текст

Обратите внимание, что Haskell и Lisp используются больше, чем другие в промышленности, хотя в последнее время наблюдается некоторый интерес к Clojure и F #.

Но посмотрите, что произойдет, когда мы добавим Scheme в смесь:

альтернативный текст

Хм, не похоже ли это на академический язык сейчас, не так ли?

На самом деле, приведенный выше график, вероятно, является ложью; Слово «схема» может появляться в объявлениях о поиске помощи в других контекстах, кроме языков программирования. :)

Итак, вот еще один график, который, вероятно, (немного) более представительный:

альтернативный текст

Если вы хотите изучить по-настоящему крутой диалект схемы, взгляните на Racket.

Роберт Харви
источник
Вау, хороший пост. Ракетка - это именно то, что я использую ... PLT-схема была ее названием, когда я начал изучать ее. Эта красная линия на последнем рисунке беспокоит меня. Никогда не думал, что Схема может быть использована так много. И, похоже, Clojure взлетает. Хм ...
Джоанис
@M. Джоанис: возьмите последние два графика с зерном соли; Лестничный вид и волатильность последнего графика позволяют предположить, что на графике не так много точек данных, хотя это указывает на то, что кто-то считает, что за языки стоит платить.
Роберт Харви
@ Роберт Харви, что изменилось со второго на третий график?
Системович
@ Джеффри: Посмотрите на подписи; Я добавил слово «разработчик» в условия поиска.
Роберт Харви
Обратите внимание, что Haskell и Lisp также являются омонимами, и что данные действительно не распространяются на остальной мир. ITJobsWatch перечисляет 79 заданий Scala, 55 F #, 47 Haskell, 30 Lisp и 7 Clojure.
Джон Харроп
17

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

После написания вашей программы на Haskell у вас будут инструменты, такие как монады, и методы, такие как бессмысленное кодирование, для перевода на язык по вашему выбору. Концепции, кажется, особенно хорошо соответствуют Схеме.

Ларри Коулман
источник
Я думаю, что вы правы, выбирая сначала чистый функциональный язык. Мне было бы очень интересно увидеть упорядоченность функциональных языков по чистоте.
Джоанис
@M. Joanis: из языков, перечисленных в вашем вопросе, я бы сказал, что Haskell - самый чистый, за ним следуют Clojure, F # и Lisp.
Ларри Коулман
15

На самом деле, если бы вы смогли внедрить достаточно сложную систему в Scheme, вы бы были весьма желательны в компаниях, где вы, вероятно, хотели бы работать. Ранее в моей карьере я столкнулся с несколькими студентами, которые проделали значительную работу в Схеме, и единственным недостатком было то, что они не могли объяснить свою работу или не понимали ее достаточно хорошо для реализации базовых данных. структуры и алгоритмы в разумные сроки. Я всегда позволяю кандидатам отвечать на такие вопросы на их предпочитаемом языке; Я столкнулся с некоторыми людьми, которые думали, что они лучшие в Схеме, и которые сумели немало потрудиться с такими легкими вещами, как добавление элемента в связанный список, что меня озадачило.

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

Если вы брали интервью в магазине "blub" и разработчики просто подумали, что вы странные из-за вашего мастерства в Scheme, Haskell или F #, вы, вероятно, не захотите работать там. В большинстве случаев компетентные разработчики выбирают свои концерты, поэтому не отказывайтесь от «практичности», если только в будущем вы не представите единственные варианты, которые вы можете себе представить. Работайте над тем, чтобы быть компетентным, гибким и устранять проблемы.

Колледж не о практичности. Речь идет о создании безопасной среды для изучения и изучения. Это, на самом деле, полезно, даже если вы закончите писать обычное программное обеспечение до конца своей карьеры.

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

Я написал кое-что на Scheme, F #, Emacs Lisp и Common Lisp и прочитал хотя бы немного на Haskell, по крайней мере, иногда за последние несколько лет. Не могу сказать, что я являюсь экспертом в любом из них, но каждая экскурсия по этим языкам приносила мне пользу на всех других языках, с которыми я профессионально работаю (C #, Java, Ruby, а иногда и Boo, Perl и Python). Любопытство построит вам более прочную, успешную карьеру, чем что-либо еще.

JasonTrue
источник
2
«Любопытство создаст вам более прочную и успешную карьеру, чем все остальное». Это утверждение очень вдохновляет. Вы правы. Я слишком спешил. Я всегда чувствую, что все это займет слишком много времени, чтобы учиться ... Если бы я мог вернуться на 12 лет назад, когда я начинал, я бы знал, что не стоит тратить все свое время на VB и C ++. Я чувствую, что эти годы были ужасно потрачены впустую. Я не был достаточно любопытен. Я хотел кодировать вещи. Использовать языки, которые я знал, было достаточно. В то время я думал, что знаю достаточное количество, но это так ужасно было совсем не так.
Джоанис
10

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

Я делал схемы в колледже. Звучит банально, но все парни действительно отвлекают / раздражают. Трудно вернуться к этому после использования таких языков, как Python.

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

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=en

Erik
источник
Тот факт, что F # и Clojure не являются чисто функциональными, играют важную роль в их пользу. Возможно, F # когда-нибудь станет моей отправной точкой в ​​семье .Net ...
Joanis
1
@MJoanis, вы указали стоимость как очко против F #, но, как указывает Эрик, вы можете получить ее совершенно бесплатно.
Бенджол
Если я правильно прочитал условия, вы получите его бесплатно при условии, что вы его не используете (или не покупаете лицензии). Но я понимаю, что это может быть очень полезно, если я попаду в компанию, использующую Visual Studio. Я, вероятно, попробую, когда стану работать с более свободным функциональным языком программирования.
Джоанис
1
@M. Джоанис: Нет, F # даже с открытым исходным кодом, и вы можете попробовать запустить Mono на других платформах.
Джон Харроп
Может быть, времена изменились с 2010 года, но как человек, который начал изучать haskell в последние несколько месяцев, я не думаю, что делать IO в haskell вообще сложно. Для базовых вещей вам просто нужно выучить новый синтаксис do. Достижение истинного фундаментального понимания занимает несколько недель, но я действительно не понимаю, в чем суть монад. Я не думаю, что их было сложнее выучить, чем классы, экземпляры, статические члены и все остальные связанные с состоянием джаз в ООП.
Сара
9

Год или два назад я оценил все основные функциональные языки с точки зрения необходимости практического универсального языка функционального программирования.

В итоге я выбрал Clojure , который впоследствии оказался отличным выбором.

Вообще говоря, основными причинами были:

  • Библиотечная экосистема - для того, чтобы язык был полезным, вам нужен доступ к хорошим библиотекам. Участие в JVM означает, что у вас есть легкий доступ к крупнейшей общедоступной библиотеке и инструментальной экосистеме, поэтому с прагматической точки зрения переходить на язык JVM было не сложно. Скала также очень высоко ценится здесь.

  • Макро-метапрограммирование. Этот аспект Lisp всегда привлекал меня, особенно потому, что я ожидал довольно много времени для генерации кода. Я очень высоко оценил аргументы, приведенные в коротком эссе Пола Грэма " Beating The Averages ". Все лиспы здесь сильно забили.

  • Производительность была «достаточно хорошей» - Clojure всегда компилируется и получает преимущества оптимизатора JIT JVM и превосходного GC. Как всегда, есть некоторые издержки при использовании функционального языка, но с Clojure было ясно, что вы можете немного приблизиться к скорости Java, приложив немного усилий (Clojure поддерживает примитивы Java и необязательную статическую типизацию для тех ситуаций, где вам это нужно). По моим оценкам, Clojure примерно в 2-5 раз медленнее, чем вы могли бы достичь с помощью оптимизированного кода Java или C ++, что согласуется с тем, что вы видите в некорректных тестах , и со временем я ожидаю, что этот разрыв будет сокращаться и дальше. Также достаточно просто написать особенно чувствительный к производительности код на чистой Java и вызвать его из Clojure.

  • Параллелизм - Clojure имеет довольно уникальный и мощный подход к параллелизму, особенно для многоядерного параллелизма. Это немного сложно объяснить, но это видео отлично, чтобы дать представление о принципах. Я думаю, что Clojure в настоящее время имеет лучший ответ на хитрый вопрос «как вам следует управлять общим, одновременным и изменяемым состоянием в функциональном языке программирования?».

  • Языковой дизайн - Clojure IMO - очень хорошо продуманный языковой дизайн. В качестве примеров можно привести литералы vector [] и map {} в дополнение к обычным скобкам Lisp, использование неизменяемых постоянных структур данных, поддержку ленивости по всему языку с помощью абстракции последовательности и предоставление программисту разнообразных ортогональных функций для решения различных задач. , Увидеть искусство абстракции и просто сделано легко .

  • Сообщество - всегда субъективно, но мне понравилось то, что я увидел в сообществе Clojure. Отношение было очень полезным, конструктивным и прагматичным. Особое внимание уделяется принципу «добейся успеха», что, возможно, отражает тот факт, что многие люди из Clojure (включая самого Рича Хики) пришли из опыта создания сложных корпоративных систем. Тот факт, что сообщество Clojure имеет прочные связи с сообществом Java, также важно убедить меня в том, что Clojure не рискует застрять в «нише».

Если бы мне пришлось назвать пару незначительных недостатков Clojure, это было бы:

  • Динамическая типизация - часто это преимущество с точки зрения производительности, но в среднем, я думаю, я бы обменял это на более строгую проверку типов и вывод. Главным образом это можно избежать, имея хороший автоматизированный набор тестов, но если вам нравятся ваши типы, статически проверенные компилятором, тогда Haskell или Scala могут быть больше вашей чашкой чая.

  • Ультрасовременный - Clojure развивается очень быстро и происходит много инноваций - недостатком этого является то, что существует множество экспериментов, некоторые библиотеки и инструменты все еще незрелые, и между основными версиями Clojure иногда возникают серьезные изменения, которые вы нужно следить за.

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

mikera
источник
1
Спасибо! Отличный пост! В эти дни я просто подумывал об использовании его для внутреннего проекта компании, который будет в значительной степени основан на деревьях и рекурсивности. Кроме того, у нас достаточно много Java-кода, который мы можем использовать с Clojure.
Джоанис
6

Похоже, вы сделали свою домашнюю работу, так что вы, вероятно, уже знаете это, но Scheme - это диалект Lisp, как Common Lisp. Если вам нравится Схема, но вам не нравится ее академическая природа, попробуйте Common Lisp. Согласно индексу TIOBE , это 13-й по популярности язык против Scheme на позиции 26.

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

Зик
источник
Спасибо за ссылку TIOBE, это интересная ссылка. Я полагаю, вы выбираете Haskell за его чистоту с точки зрения функционального программирования?
Джоанис
1
@ M.Joanis: Довольно много, хотя я думаю о том, чтобы потом забрать Лисп. См. Programmers.stackexchange.com/questions/18838/…
Зик
Выбранный ответ имеет большой смысл. Чистота, кажется, способ идти до тех пор, пока я действительно не пойму всю функциональную парадигму.
Джоанис