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

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/24542

Вопрос

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

Последний [курс] семестр, я был представлен в схеме. Я люблю это. Любила крайняя простота синтаксиса, гомоиконичность принцип, макросы (гигиеничный и негигиенический), n-orshity процедур и т. Д.

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

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

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

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

Это было полезно?

Решение

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

alt text

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

Но посмотрите, что происходит, когда мы добавляем схему в микс:

alt text

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

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

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

alt text

Если вы хотите исследовать действительно начальный диалект схемы, посмотрите на Ракетка.

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

Я закончил тем, что выбрал Клоджюр, который впоследствии оказался отличным выбором.

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
scroll top