함수형 프로그래밍 언어 선택하기


48

최근에 함수형 프로그래밍 언어에 대한 많은 스레드를 읽었습니다 (실제로 지난 1 년 동안). 나는 하나를 골라서 철저히 배우고 싶습니다.

마지막 [코스] 학기, 나는 Scheme에 소개되었습니다. 나는 그것을 좋아했다. 구문의 극단적 단순성, 호모 닉 원리, 매크로 ( 위생적 및 비위생적), 절차의 n-arity 등을 좋아했습니다 .

Scheme의 문제는 그것이 학문적 언어라는 것입니다. 프로덕션 환경에서 실제로 사용되는 것은 아닙니다. 나는 우리 이력서를 가지고있는 것이 특히 좋다고 생각하지 않습니다. 그래서 대안을 찾고 있습니다. 그들 중 많은 수가 있으며 어떻게 든 비슷한 수준의 인기를 가지고있는 것 같습니다.

내가 아직 고려한 다른 기능적 언어들에 대한 생각들 :

  • Clojure : Java 세계에 액세스 할 수 있기 때문에 훌륭하게 들립니다. 확장 성과 동시성을 지향하지만 Java 세계가 우위에 있지 않습니까? 이미 Java를 잘 알고 있지만 JVM에 따라 더 많은 에너지를 추가하는 것이 현명합니까?
  • Haskell : 매우 감사하는 언어 인 것 같습니다. 그러나 제가 읽은 바에 따르면, 그것은 더 학문적 인 언어입니다.
  • Lisp : 그 이후로 영원히있었습니다. 내가 Scheme에서 가장 좋아하는 것 같습니다. 큰 커뮤니티가 있습니다. 내가 아는 바, 아마도 업계에서 가장 널리 사용되는 함수형 프로그래밍 언어일까요?
  • F # : 실제로는 고려하지 않았습니다. 나는 MS 물건의 큰 팬이 아닙니다. 나는 그들의 소프트웨어를 지불 할 돈이 없다 (나는 대학 동맹으로부터 자유로울 수는 있지만, 공동체 중심의 솔루션에 더 관심이있다). 그래도 ... 나는 그것이 직업 지향적 인 최선의 선택이라고 생각합니다.

오늘 밤, 나는 Lisp쪽으로 기울고 있습니다. 일주일 전, 하스켈이었습니다. 그 전에는 Clojure였습니다. 작년에, 나는 당신이 알고있는 이유로 그것을 밀지 않고 재미를 위해 계획을하고있었습니다. 이제 나는 진지하게 배우고 싶습니다 (하나를 배우고, 실제 프로젝트를 수행하고, 결국은 전문적으로 작업하는 것에 대해). 내 문제는 하나를 선택할 수 있기 전에 깊이있게 배울 필요가 있다는 것입니다.


5
무엇을 선택하든, 무언가에 사용 하는 많은 코드를 작성 하십시오.

8
스칼라 에 대해 생각하지 않았습니까 ?
ykombinator

@ ykombinator : 들어 보았지만 더 이상 검색하지 않았습니다. 내가 나열된 옵션보다 제공 할 것이 있는지 또는 각 옵션에서 흥미로운 옵션을 조합했을지 모르겠습니다 ... 모릅니다. 저명한 언어처럼 들리지만 인기가 높아지고 있습니다.
Joanis

1
Java 세계가 "가장자리에있다"는 말을 잘 모르겠습니다. 현재 a) OpenJDK가 표준 구현이 되었기 때문에 크게 르네상스를 겪고 있습니다. b) Scala 및 Clojure와 같은 새로운 JVM 언어와 c) The 사실 빅 데이터 / 클라우드 프로젝트는 JVM을 대상 플랫폼으로 선택하고 d) 안드로이드를 선택하고 있습니다. 2012 년 초 현재, 아마도 가장 흥미로운 플랫폼 일 것입니다 .....
mikera

1
@ mikera : 동의합니다. 오라클이 썬 마이크로 시스템즈를 인수 한 지 1 년이 지났는데, 통제력있는 기업이 통제하는 기업에 의해 Java의 미래에 대해 걱정하고 추측하는 모든 것이있었습니다. JVM은 현재 매우 안전 해 보입니다!
Joanis

답변:


35

실용적인  언어 를 원하기 때문에 :

대체 텍스트

Clojure와 F #에 대한 최근 관심이 있었지만 Haskell과 Lisp는 업계의 다른 것보다 더 많이 사용됩니다.

그러나 Scheme을 믹스에 추가하면 어떻게되는지 살펴보십시오.

대체 텍스트

흠, 지금 학업 언어처럼 보이지 않습니까?

실제로, 위의 그래프는 아마도 거짓말 일 것입니다. 'scheme'이라는 단어는 프로그래밍 언어 외에 다른 문맥에서 도움이 필요한 광고에 나타날 수 있습니다. :)

다음은 아마도 조금 더 대표적인 또 다른 그래프입니다.

대체 텍스트

정말 체계적인 방언을 탐색하려면 Racket을 살펴보십시오 .


와, 좋은 포스트. 라켓은 제가 사용하고있는 것입니다 ... PLT-Scheme은 제가 배우기 시작했을 때 그 이름이었습니다. 마지막 그래픽에서 그 빨간 선이 문제가됩니다. Scheme이 그렇게 많이 사용될 수 있다고 생각하지 않았습니다. 클로저는 확실히 이륙하는 것 같습니다. 흠 ...
Joanis

@엠. Joanis : 마지막 두 그래프를 소금 한 알로 가져 가십시오. 계단 모양과 마지막 그래프의 변동성은 그래프에 데이터 포인트가 많지 않다는 것을 시사하지만 누군가가 언어의 가치가 있다고 생각한다는 것을 나타냅니다.
Robert Harvey

@Robert Harvey, 두 번째 그래프에서 세 번째 그래프로 무엇이 바뀌 었습니까?
systemovich

@Geoffrey : 캡션을보십시오; 검색어에 "developer"라는 단어를 추가했습니다.
Robert Harvey

Haskell과 Lisp도 동종 어이며 실제로 데이터는 다른 세계로 일반화되지 않습니다. ITJobsWatch는 79 개의 스칼라 작업, 55 개의 F #, 47 개의 Haskell, 30 개의 Lisp 및 7 개의 Clojure 작업을 나열합니다.
Jon Harrop

17

함수형 프로그래밍을 배우려면 먼저 Haskell을 배우는 것이 좋을 것입니다. 그런 다음 원하는 언어를 사용하십시오. 다른 언어를 사용하여 함수형 프로그래밍을 배울 수 있지만 명령형 및 객체 지향 코드는 여전히 허용됩니다. Haskell에서 실제 프로그램을 작성하면 다른 패러다임을 사용할 수 없으므로 기능 프로그래밍을 더 빨리 배울 수 있습니다.

Haskell 프로그램을 작성한 후에는 모나드와 같은 도구와 포인트 프리 코딩과 같은 기술을 사용하여 원하는 언어를 사용할 수 있습니다. 개념은 특히 체계에 잘 어울리는 것 같습니다.


순수한 기능 언어를 먼저 선택하는 것이 옳다고 생각합니다. 순전히 기능적 언어의 순서를 보는 데 매우 관심이 있습니다.
Joanis

@엠. Joanis : 귀하의 질문에 나열된 언어 중에서 Haskell이 가장 순수하다고 말한 다음 Clojure, F # 및 Lisp가 있습니다.
Larry Coleman

15

실제로 Scheme에서 합리적으로 복잡한 시스템을 구현할 수 있다면 아마도 일하고 ​​싶은 회사에서 바람직 할 것입니다. 내 경력 초기에 나는 Scheme에서 상당한 양의 작업을 한 일부 학생들을 만났으며, 불리한 유일한 시간은 작업을 설명 할 수 없거나 기본 데이터를 구현하기에 실제로 그것을 잘 이해하지 못하는 경우였습니다. 합리적인 시간 내에 구조와 알고리즘. 나는 항상 응시자가 선호하는 언어로 그러한 질문에 대답하도록합니다. 나는 Scheme에서 가장 훌륭하다고 생각하는 사람들을 만났습니다. 연결 된 목록에 요소를 추가하는 것과 같이 쉬워야하는 것들로 꽤 어려움을 겪었습니다.

그러나 평균적인 웹 앱을 작성하기에 충분할 정도로 체계를 "가져올"수 있다면 대부분의 심각한 소프트웨어 회사에서 좋은 판매 지점이 될 것입니다.

"브루 브 (blub)"샵에서 인터뷰를했는데 개발자가 Scheme이나 Haskell 또는 F #에서의 숙련으로 인해 이상하다고 생각했다면 아마도 거기서 일하고 싶지 않을 것입니다. 대부분의 경우 유능한 개발자는 공연을 선택할 수 있으므로 미래에 상상할 수있는 유일한 옵션이 기업이 아니라면 "실용성"을 땀 내지 마십시오. 유능하고 유연하며 문제를 해결하기 위해 노력하십시오.

대학은 실용성이 아닙니다. 탐구하고 배우는 안전한 환경을 조성하는 것입니다. 사실, 당신이 나머지 직업을 위해 일반 소프트웨어를 작성하더라도 결국 유용합니다.

즉, 왜 당신이 그 선택 중 하나만 그렇게 빨리 제한하고 싶은지 모르겠습니다. 약 4 주만에 네 가지 언어를 모두 쉽게 이해할 수 있으며, 현재의 변덕에 가장 적합한 메시에 집중할 언어를 선택할 수 있습니다. 그런 다음 다른 옵션 중 하나로 돌아가서 비슷한 것을 구현하십시오. 더 복잡한 것으로 이동하여 옵션을 다시 고려하십시오. 실험은 좋습니다. 다음 달에 생계를 유지하려고하지 않는 한 아직 전문가가 될 필요는 없습니다.

Scheme, F #, Emacs Lisp 및 Common Lisp에 글을 쓰고 적어도 지난 몇 년 동안 적어도 Haskell을 읽었습니다. 나는 그들 중 하나에 대해 전문가라고 말할 수는 없지만, 그 언어에 대한 각 여행은 내가 전문적으로 일하는 다른 모든 언어 (C #, Java, Ruby, 때로는 Boo, Perl 및 Python)에서 나에게 도움이되었습니다. 호기심은 다른 어떤 것보다 더 오래 가고 만족스러운 커리어를 만들어 줄 것입니다.


2
"Curiosity는 다른 어떤 것보다 더 오래 가고 만족스러운 경력을 쌓을 것입니다." 이 말은 매우 고무적입니다. 네가 옳아. 너무 서둘러 요 나는 항상 배우는데 너무 많은 시간이 걸릴 것 같은 느낌이 든다. 만약 내가 12 년 전으로 돌아갈 수 있다면 VB와 C ++에 시간을 낭비하지 않을 것이다. 나는이 세월이 상당히 심하게 낭비 된 것 같아요. 나는 충분히 궁금하지 않았다. 나는 물건을 코딩하고 싶었다. 내가 아는 언어를 사용하는 것으로 충분했습니다. 나는 그 당시에 나는 상당한 액수를 알고 있다고 생각했지만 그렇게 끔찍한 일은 아니었다.
Joanis

10

나는 Haskell에 잠시 동안 뛰어 들었지만, 내가 온 결론은 그것이 너무 학문적이라는 것이었다. 실용적인 것을하기 란 매우 힘들었습니다. 순수한 기능적 언어에서 IO와 같은 것은 모델에 맞지 않기 때문에 모나드를 처리해야합니다. 간신히 유능한 사람이 되려면 엄청난 시간을 투자해야한다고 결정했습니다.

나는 대학에서 계획을했다. 사소한 소리로 들릴지 모르지만 모든 괄호는 실제로 산만 해집니다. 파이썬과 같은 언어를 사용한 후에는 그 문제로 돌아 가기가 어렵습니다.

최근에 나는 F #을 탐구하고 있습니다. 기능적이지만 원할 때 명령적이고 객체 지향적 일 수도 있습니다. 이를 통해 .NET 라이브러리를 사용할 수있을뿐만 아니라 순수 기능 파트를 GUI, IO 및 네트워킹과 같은보다 실용적인 것들과 쉽게 혼합 할 수 있습니다. 독립형 버전의 F #을 얻을 수 있습니다.

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


F #과 Clojure가 순전히 기능적이지 않다는 사실은 그들에게 유리한 역할을합니다. 어쩌면 F #은 언젠가 .Net 가족의 시작점이 될 수 있습니다.
Joanis

1
@MJoanis는 F #에 대한 비용으로 비용을 언급했지만 Erik이 지적한 것처럼 완전히 무료로 얻을 수 있습니다.
Benjol

약관을 올바르게 읽으면 기본적으로 사용하지 않거나 라이센스를 구매하는 조건에서 무료로 사용할 수 있습니다. 그러나 Visual Studio를 사용하는 회사에서 근무하는 경우 배우는 것이 여전히 좋은 일이라고 생각합니다. 좀 더 자유로운 기능적 프로그래밍 언어로 기능적이라면 한번 시도해 볼 것입니다.
Joanis

1
@엠. Joanis : 아니요. F #은 심지어 오픈 소스이므로 다른 플랫폼의 Mono에서 실행할 수 있습니다.
Jon Harrop

아마도 2010 년 이후 시간이 바뀌었을 수도 있지만, 지난 몇 달 동안 haskell을 배우기 시작한 사람으로서 haskell에서 IO를 수행하는 것이 전혀 어렵다고 생각하지 않습니다. 기본 사항에 대해서는 몇 가지 새로운 구문을 배워야합니다. 실제 기본 이해를 얻는 데 몇 주가 걸리지 만 모나드에 대한 퍼지가 무엇인지 실제로 알 수 없습니다. 클래스, 인스턴스, 정적 멤버 및 OOP의 다른 모든 주 관련 재즈보다 배우기가 더 어렵다고 생각하지 않습니다.
sara

9

실용적이고 범용적인 기능적 프로그래밍 언어를 원한다는 관점에서 1 년 또는 2 년 전에 모든 주요 기능 언어를 평가했습니다.

나는 Clojure 를 고르고 결국 훌륭한 선택으로 판명되었습니다.

주요한 이유는 다음과 같습니다.

  • 라이브러리 생태계 -언어가 유용하려면 좋은 라이브러리에 액세스해야합니다. JVM에 있다는 것은 가장 큰 오픈 소스 라이브러리 및 툴 에코 시스템에 쉽게 액세스 할 수 있다는 것을 의미하므로, 실제적인 관점에서 JVM 언어로가는 것은 쉬운 일이 아닙니다. 스칼라는 또한 높은 점수를 받았습니다.

  • 매크로-메타 프로그래밍-Lisp 의이 측면은 특히 나에게 호소력이있다. 특히 상당히 많은 코드 생성을 예상했기 때문이다. 폴 그레이엄의 짧은 에세이 " Beating The Averages "에 나온 주장에 대단히 감사합니다 . 다양한 리스프는 모두 여기에서 강하게 득점했습니다.

  • 성능 은 "충분히 좋았습니다"– Clojure는 항상 컴파일되며 JVM JIT 최적화 프로그램과 뛰어난 GC의 이점을 얻습니다. 항상 그렇듯이 기능적 언어를 사용하는 데 약간의 오버 헤드가 있지만 Clojure를 사용하면 약간의 노력으로 Java 속도에 근접 할 수 있다는 것이 분명했습니다 (Clojure는 Java 프리미티브 및 필요한 경우 정적 입력 옵션을 지원합니다). 내 추정에 따르면 Clojure는 최적화 된 Java 또는 C ++ 코드로 달성 할 수있는 것보다 2-5 배 느린 야구장이며 결함이있는 벤치 마크 에서 볼 수있는 것과 일치하며 시간이 지남에 따라 그 간격이 더 좁아 질 것으로 예상합니다. 또한 순수한 Java로 성능에 특히 민감한 코드를 작성하여 Clojure에서 호출하는 것만으로도 쉽습니다.

  • 동시성 -Clojure는 특히 다중 코어 동시성에 대해 매우 독특하고 강력한 동시성 접근 방식을 제공합니다. 설명하기가 약간 어렵지만 이 비디오는 원리를 맛보 는 데 탁월 합니다. Clojure는 현재 "기능적 프로그래밍 언어에서 공유, 동시 및 변경 가능한 상태를 어떻게 관리해야합니까?"라는 까다로운 질문에 대한 최선의 답변이라고 생각합니다.

  • 언어 디자인 -Clojure는 IMO가 잘 생각한 언어 디자인입니다. 예제에는 정규 Lisp 괄호 외에 벡터 [] 및 맵 {} 리터럴, 불변의 영구 데이터 구조 사용, 시퀀스 추상화를 통해 언어 전체에 게으름 지원 및 다양한 문제를 해결하기 위해 프로그래머에게 다양한 직교 기능 제공 . 참조 추상화의 예술쉽게 만들어 간단 .

  • 커뮤니티 -항상 주관적이지만 Clojure 커뮤니티에서 본 것을 좋아했습니다. 태도는 매우 도움이되고 건설적이고 실용적이었습니다. Rich Hickey를 포함하여 많은 Clojure 직원이 복잡한 엔터프라이즈 시스템을 구축 한 배경에서 온다는 사실을 반영하는 강력한 "작업 완료"강조가 있습니다. Clojure 커뮤니티가 Java 커뮤니티와 강력한 연계성을 가지고 있다는 사실은 Clojure가 "틈새 시장"에 갇힐 위험을 감수하지 않을 것이라는 확신을주는 데 중요했습니다.

Clojure의 몇 가지 사소한 단점을 말하면 다음과 같습니다.

  • 동적 타이핑 -종종 생산성 측면에서 이점이 있지만 평균적으로 더 강력한 유형 검사 및 추론을 위해 이것을 교환한다고 생각합니다. 대부분 자동화 된 테스트 스위트를 통해이를 완화 할 수 있지만, 컴파일러가 정적으로 검증 한 유형을 선호한다면 Haskell 또는 Scala가 더 많은 차를 마실 수 있습니다.

  • 최첨단 -Clojure는 매우 빠르게 발전하고 있으며 많은 혁신이 진행되고 있습니다. 이것의 단점은 많은 실험이 있고 일부 라이브러리와 도구가 아직 미숙하고 Clojure 메이저 버전간에 간헐적으로 변경이 있다는 것입니다. 계속 지켜봐야합니다

전반적으로, 훌륭하고 실용적인 현대 기능 언어를 원한다면 Clojure에 잘못 갈 수 있다고 생각하지 않습니다!


1
감사! 좋은 포스트! 저는 요즘 나무와 재귀에 크게 기반을 둔 회사 내부 프로젝트에 사용하는 것을 고려하고있었습니다. 또한 Clojure와 함께 재사용 할 수있는 많은 Java 코드가 있습니다.
Joanis

6

숙제를 한 것처럼 보이므로 이미 알고 있을지 모르지만 Scheme은 Common Lisp와 같은 Lisp의 방언입니다. Scheme에 대해 많은 것을 좋아하지만 학문적 성격을 좋아하지 않는다면 Common Lisp을 사용해보십시오. TIOBE 지수 에 따르면 26 위에있는 13 번째로 가장 많이 사용되는 언어입니다.

언급 한 언어 중 일부가 최근에 본 작업 설명에 표시되지만 작은 샘플 세트 일 수도 있습니다. 직장에서 직접 해당 언어를 사용하지는 않더라도 개인적으로 Haskell을 배우게됩니다. 함수형 프로그래밍의 개념은 언어 자체의 직접적인 시장성보다 미래의 프로그램 설계에있어 더 가치가 있습니다.


흥미로운 링크 인 TIOBE 링크에 감사드립니다. 기능 프로그래밍 측면에서 Haskell의 순도를 선택했다고 생각하십니까?
Joanis

1
@ M.Joanis : 나도 나중에 Lisp도 집어들 생각입니다. programmers.stackexchange.com/questions/18838/…
Zeke

선택된 대답은 의미가 있습니다. 순전히 기능적인 패러다임 전체를 파악할 때까지가는 길인 것 같습니다.
Joanis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.