기능적 프로그래밍이 증가하고 있습니까?


42

최근에 함수형 프로그래밍 언어 가 인기를 얻고 있음을 알게되었습니다 . 나는 최근 에이 인덱스에 따르면 Tiobe 인덱스 가 작년에 비해 인기가 증가한 것을 보았지만 대부분이이 언어에 따라 가장 인기있는 상위 50 개 언어에 도달하지는 못했습니다.

그리고 이것은 꽤 오랫동안 사실이었습니다. 함수형 프로그래밍은 다른 모델 (즉, 객체 지향 프로그래밍)만큼 인기가 없었습니다.

함수형 프로그래밍의 힘에 대한 관심이 다시 나타났습니다. 이제 멀티 코어가 점점 더 대중화되면서 개발자들은 Haskell 및 Erlang과 같은 언어로 과거에 이미 살펴본 다른 동시성 모델에 대한 관심을 보이기 시작했습니다.

커뮤니티의 수용이 부족함에도 불구하고 점점 더 많은 언어가 계속 등장하고 있습니다. Clojure (2007), Scala (2003), F # (2002)는 최근 10 년의 세 가지 예일뿐입니다.

나는 하스켈과 스칼라를 배우는 데 시간을 투자했다. 그리고 나는 오랫동안 거기에 있었음에도 불구하고 새로운 패러다임에서 큰 잠재력을 발견했습니다.

물론 가장 큰 문제는 이들 중 하나라도 노력할만큼 충분히 인기를 얻게 될지에 대한 것입니다. 그러나 이것은 사람들이 겪고있는 모든 소란에도 불구하고 맨드레이크조차도 대답 할 수없는 질문입니다.

내가 묻고 싶은 것은 :

  • 어떤 시나리오에서 주어진 작업을 수행하는 데 더 적합한 기능적 프로그래밍 언어를 고려해야합니까? 병렬 프로그래밍의 최근에 인기있는 멀티 코어 문제 외에도.
  • 함수형 프로그래밍 언어로 전환하기로 결정했다면 내가 직면하게 될 가장 큰 함정이라고 생각하십니까? (패러다임 변화와 게으른 평가로 인한 성과 평가의 어려움 외에도).
  • 너무 많은 기능적 프로그래밍 언어가 존재하므로 필요에 가장 적합한 언어를 어떻게 선택 하시겠습니까?

추가 연구에 대한 권장 사항은 환영합니다.

웹에서 의견을 찾아 보았는데,이 새로운 인기가 모두 무어의 법칙 에 부딪 히고 기능 프로그래밍 언어가 등장하여 영웅적으로 우리를 구할 것이라는 생각에서 비롯된 것 같습니다. 그러나 이것이 사실이라면, 패러다임에 적응하는 기존의 인기있는 언어의 확률이 더 많다고 말할 것입니다.

아마도 이러한 언어로 매일 일한 경험이 더 많은 사람들은 그 주제에 대해 더 많은 통찰력을 제공 할 수 있습니다. 귀하의 모든 의견은 더 잘 이해되고 신중하게 고려 될 것입니다.

미리 감사드립니다!


4
Earlang이 아니라 Erlang입니다 (게시물을 편집했지만 시스템에서 1 글자 편집을 허용하지 않습니다).
quant_dev

6
가치있는 말-기능적 언어와 명령형 언어 사이에는 딱딱한 선이 없습니다. ML 패밀리 언어는 부작용이 없으며 명령형 설명과 구조 및 가변 변수를 지원합니다. 필자의 머리 위에있는 파이썬과 자바 스크립트의 일부 명령형 언어는 함수형 프로그래밍에서 가져온 중요한 기능을 가지고 있습니다. 개인적으로 저는 주류 사용에서 더 많은 기능적 아이디어, 특히 패턴 매칭을보고 싶습니다.
Steve314

1
기능적 언어에 공통적 인 몇 가지 기능이 있다고해서 언어가 "기능적"인 것은 아닙니다. 함수형 프로그래밍은 특정 언어 기능과 마찬가지로 프로그램을 생각하고 디자인하는 방법에 관한 것입니다.
mipadi

2
@mipadi-사용 가능한 도구가 허용하는 정도까지 모든 언어로 기능 철학을 적용 할 수 있습니다. 함수형 코드를 제한없이 파이썬으로 작성할 수 있으며, 그 범위 내에서 파이썬은 함수형 언어입니다. 그리고 당신은 ML로 명령형 코드를 작성할 수 있으며, ML은 명령형 언어입니다. 이것은 "나쁜 프로그래머가 어떤 언어로든 포트란을 쓸 수있다"는 것과는 완전히 다릅니다.
Steve314

1
@mipadi-그러나 명령형 언어가 모든 정상적인 기능적 구성을 가지고 있다면, 기능적 언어로 할 수있는 모든 것을 할 수 있습니다. 격차는 사라질 것이며, 질문은 "이를 수행하는 가장 좋은 방법은 무엇입니까?" "기능적 / 제 국적 방식은 무엇입니까". ML 패밀리는 이미 그 격차를 좁혔지만 실제로 기능적 이라고 하기 때문에 단순히 좋은 스타일이 아니라 기능적 스타일로 생각합니다.
Steve314

답변:


24

어떤 시나리오에서 주어진 작업을 수행하는 데 더 적합한 기능적 프로그래밍 언어를 고려해야합니까? 병렬 프로그래밍의 최근에 인기있는 멀티 코어 문제 외에도.

여러 변환 단계를 사용하여 파생 된 데이터 요소 시퀀스를 작성하는 것과 관련된 모든 것.

본질적으로 "스프레드 시트 문제". 해당 데이터에 적용 할 초기 데이터 및 행 단위 계산 세트가 있습니다.

우리의 생산 응용 프로그램은 여러 가지 통계 데이터 요약을 수행합니다. 이것은 기능적으로 가장 잘 접근하는 것입니다.

우리가하는 일 중 하나는 세 개의 괴물 데이터 세트 사이의 일치 병합입니다. SQL 조인과 유사하지만 일반화되지는 않습니다. 그런 다음 파생 된 데이터를 여러 번 계산합니다. 이것은 단지 기능적인 변형 일뿐입니다.

이 응용 프로그램은 Python으로 작성되었지만 생성기 함수와 불변의 명명 된 튜플을 사용하여 기능적 스타일로 작성되었습니다. 하위 수준의 기능으로 구성되어 있습니다.

다음은 기능성 구성의 구체적인 예입니다.

for line in ( l.split(":") for l in ( l.strip() for l in someFile ) ):
    print line[0], line[3]

이것은 함수형 프로그래밍이 파이썬과 같은 언어에 영향을 미치는 한 가지 방법입니다.

때때로 이런 종류의 것은 다음과 같이 쓰여집니다 :

cleaned = ( l.strip() for l in someFile )
split = ( l.split(":") for l in cleaned )
for line in split:
     print line[0], line[3]

함수형 프로그래밍 언어로 전환하기로 결정했다면 내가 직면하게 될 가장 큰 함정은 무엇입니까? (패러다임 변화와 게으른 평가로 인한 성과 평가의 어려움 외에도).

불변의 물체는 가장 어려운 장애물입니다.

기존 객체를 업데이트하는 대신 새 객체를 생성하는 값을 계산하는 경우가 종종 있습니다. 그것이 객체의 변경 가능한 속성이라는 생각은 깨기 힘든 정신 습관입니다.

파생 속성 또는 메서드 함수가 더 나은 방법입니다. 상태 저장 개체는 깨기 힘든 습관입니다.

너무 많은 기능적 프로그래밍 언어가 존재하므로 필요에 가장 적합한 언어를 어떻게 선택 하시겠습니까?

처음에는 중요하지 않습니다. 배울 언어를 선택하십시오. 일단 무언가를 알게되면, 당신은 당신의 요구에 더 잘 맞도록 다른 것을 선택하는 것을 고려합니다.

나는 파이썬이 부족한 것을 이해하기 위해 Haskell을 읽었습니다.


5
@edalorzo : 파이썬은 약하게 타이핑되지 않았습니다. 매우 강력하게 입력되었습니다. 캐스트 연산자가 없으므로 Java 또는 C ++보다 형식이 강력합니다.
S.Lott

5
@ S.Lott-정적 타입 검사가 IDE 리팩토링 도구 및 인텔리전스 유형에 도움이되지 않습니까? 백그라운드 컴파일을 진행 중이고 유형을 정적으로 검사하는 경우 도구에서 더 많은 것을 자동화 할 수 있습니까? 테스트에 100 % 코드 적용 범위가 있으면이를 포착 할 것에 동의합니다. 기업에서 생산 코드의 50 % 미만이 실제로 단위 테스트 적용 범위를 가지고 있다는 것을 인식해야합니다. :) 우리가 살아야 할 실제 세계가 있습니다.
Scott Whitlock

8
@ S.Lott "정적 유형 검사는 그다지 도움이되지 않습니다. 컴파일러에 의한 정적 검사 나 런타임 검사는 중요하지 않습니다. 여전히 같은 양의 코드와 같은 수의 단위 테스트를 작성합니다. " 어, 아니 정적 유형 검사의 요점은 버그를 잡아서 필요한 테스트 양을 크게 줄인다는 것입니다.
Jon Harrop 11:27에

3
@ S.Lott "Python은 약하게 입력되지 않았습니다. 매우 강력하게 입력되었습니다." 파이썬은 암시 적으로 숫자 유형 사이에 캐스트되며 약한 유형입니다.
Jon Harrop 2019

3
@ Steve314 "결국 정적 유형 검사는 일부 기본 규칙에 맞는 오류를 포착합니다. 원칙적으로 단위 테스트는 이러한 모든 오류를 포착 할 수 있습니다." 정적 검사는 프로그램 측면의 정확성을 증명합니다. 단위 테스트는 정확성을 반증하려고하지만, 정확성을 입증하지는 않습니다. 단위 테스트는 정적 유형 검사 나 다른 종류의 증거를 대체하지 않습니다.
Jon Harrop

23

"기능"은 여러 가지 다른 기능으로, 각각 독립적으로 유용하며 각각 개별적으로 보는 것이 더 유용합니다.

불변성

이제 익숙해 졌으므로 불변의 결과를 반환 할 때마다 객체 지향 프로그램에서도 항상 그렇게하려고합니다. 값 유형 데이터가있는 경우 프로그램에 대해 추론하기가 더 쉽습니다. 일반적으로 GUI 및 성능 병목 현상과 같은 경우에는 변경 가능성이 필요합니다. 내 엔티티 (NHibernate 사용)도 변경 가능합니다 (데이터베이스에 저장된 데이터를 모델링하기 때문에 의미가 있습니다).

퍼스트 클래스 타입으로서의 기능

호출, 대의원, 작업 또는 함수를 전달하는 것은 "중간 패턴의 구멍"과 같은 실제 문제의 전체 클래스를 해결하는 정말 편리한 방법입니다. 또한 델리게이트, 액션 또는 함수를 객체에 전달하는 것이 해당 클래스가 이벤트를 선언하고 해당 이벤트를 연결하는 것 (일반적으로 "리스너"가 하나만 있다고 가정하는 것)보다 더 깨끗하다는 것을 알았습니다. 리스너가 하나 있다는 것을 알면 콜백 액션은 생성자 매개 변수로 전달 될 수 있습니다 (불변 멤버에 저장 될 수 있습니다).

기능을 구성 할 수있는 것 (예 : Action<T>단지 하나의 기능으로 전환 하는 Action것도 일부 시나리오에서 매우 유용합니다.

또한 함수를 첫 번째 클래스 유형으로 승격 할 때 Lambda 구문 만 가져 오기 때문에 여기서 Lambda 구문을 참고해야합니다. 람다 구문은 매우 표현적이고 간결 할 수 있습니다.

모나드

분명히 이것은 약점이지만 워크 플로와 같은 F #의 계산 워크 플로 async는 모나드 라는 것을 이해하고 있습니다. 이것은 미묘하지만 매우 강력한 구조입니다. C #에서 클래스 yield를 만드는 데 사용되는 키워드 만큼 강력합니다 IEnumerable. 본질적으로 그것은 당신을 위해 상태 머신을 구축하고 있지만 논리는 선형으로 보입니다.

게으른 평가 및 재귀

함수형 프로그래밍의 기능으로 항상 집중되어 있지만 더 이상 기능적이지 않은 다른 언어로 빠르게 전환되어 더 이상 기능적이라고 부르기가 어렵 기 때문에 이러한 기능들을 통합했습니다.

S- 표현

나는 이것을 어디에 넣을 지 잘 모르겠지만 Lisp S-Expressions 또는 LINQ Expressions와 같이 컴파일되지 않은 코드를 객체로 처리하고 검사 / 수정하는 기능은 어떤면에서 가장 강력한 기능적 프로그래밍 도구. 대부분의 새로운 .NET "유창한"인터페이스와 DSL은 람다 구문과 LINQ 표현식의 조합을 사용하여 매우 간결한 API를 만듭니다. C # 코드가 C # 코드 대신 SQL로 "매직 적으로"실행되는 Linq2Sql / Linq2Nhibernate는 말할 것도 없습니다.

그것은 당신의 질문의 첫 부분에 대한 긴 대답이었습니다 ... 지금 ...

함수형 프로그래밍 언어로 전환하기로 결정했다면 내가 직면하게 될 가장 큰 함정은 무엇입니까? (패러다임 변화와 게으른 평가로 인한 성과 평가의 어려움 외에도).

내가 직면 한 가장 큰 함정은 기능적 솔루션과 명령형 솔루션 사이의 경계를 찾는 것이 었습니다. 그러나 두 가지 방법을 모두 몇 번 시도한 후에는 효과가 더 좋아질 것입니다.

너무 많은 기능적 프로그래밍 언어가 존재하므로 필요에 가장 적합한 언어를 어떻게 선택 하시겠습니까?

.NET에 익숙하다면 F #을 적극 권장합니다. 반면에 JVM에 익숙하다면 항상 Clojure가 있습니다. 당신이 실용적보다 더 학문적이라면 Common Lisp 또는 Scheme과 함께 갈 것입니다. 이미 파이썬을 알고 있다면 이미 사용할 수있는 많은 기능적 구성이 있다고 생각합니다.


@Scott 자세한 설명을 주셔서 감사합니다. 가장 큰 함정이라고 묘사 한 것은 Haskell과 같은 순수한 함수형 프로그래밍 언어를 사용하여 방정식에서 벗어날 것입니다. 그래서 나는 평생 동안 꼭 필요한 프로그래머 였고, 불완전한 프로그래밍 언어로 별을보고 싶지 않아서 좋은 길을 배우지 않을 위험이 있기 때문에 시작했습니다. 저에게 다른 질문을하는 것이 마음에 들지 않는다면 : 저를 걱정하는 두 가지는 도구와 라이브러리입니다. 다른 .Net 도구 및 라이브러리와 F #의 통합은 얼마나 좋습니까?
edalorzo

런타임 및 런타임 코드 생성 및 함수형 프로그래밍으로 검사에서 코드를 덩어리로 만드는 이유를 이해하지 못합니다. 두 사람은 서로 관계가 없습니다. 설명하는 메타 프로그래밍 기능은 기능에 관계없이 거의 모든 언어에 추가 할 수 있습니다. lisp가 코드를 데이터 트렌드로 시작했다고 생각하지만 이제는 루비 및 기타 비 기능 언어로 제공됩니다.
davidk01

1
@edalorzo-F #과 .NET의 통합은 GUI 디자이너없이 단 하나의 예외를 제외하고는 매우 훌륭합니다. C # 어셈블리에서 GUI를 디자인하고 F #에서 참조하거나 F # 내부에서 GUI를 코드에서만 생성 (디자이너가 아님)하여 문제를 해결할 수 있습니다.
Scott Whitlock

@ davidk01-메타 프로그래밍에 대한 좋은 질문. 람다 구문과 메타 프로그래밍이 서로를 구축한다는 것을 알았습니다. 그러나 옳습니다. 분리 될 수 있습니다. 기능적 언어로 메타 프로그래밍을 할 가능성이 더 높습니다.
Scott Whitlock

1
@ 스콧 : 여러 가지면에서 더 쉽다고 생각합니다. 예를 들어 부작용에 대해 걱정할 필요가 없을 때 훨씬 더 자신감을 가지고 즉시 코드 섹션을 수정할 수 있습니다. 변경해야 할 내용이 제한됩니다.
Michael K

15

그리고 이것은 꽤 오랫동안 사실이었습니다. 함수형 프로그래밍은 다른 모델 (즉 객체 지향 프로그래밍)만큼 인기가 없었습니다.

전문 프로그래머가 개발 한 프로그램 (또는 최소한 자신을 보는 사람들)을 셀 수있는 경우에 해당됩니다. 자신을 그렇게 고려하지 않는 사람들이 개발 한 프로그램을 포함하기 위해 인터넷을 넓히면 FP (또는 최소한 기능적 스타일의 프로그래밍)는 OO (Excel, Mathematica, Matlab, R ... 심지어 '현대적인'JavaScript)와 매우 가깝습니다. ).

어떤 시나리오에서 주어진 작업을 수행하는 데 더 적합한 기능적 프로그래밍 언어를 고려해야합니까? 병렬 프로그래밍의 최근에 인기있는 멀티 코어 문제 외에도.

내 개인적인 의견은 멀티 코어가 FP의 킬러 기능이 아니라는 것입니다 (적어도 Haskell, Scala, Clojure, F # 컴파일러가 캐시 위치 문제를 해결할 때까지). 범인의 특징은 map, filter, fold친구되는 알고리즘의 큰 그룹의 더 간결 표현을 할 수 있습니다. 이것은 대부분의 인기있는 OO에 비해 더 간결한 구문을 가진 FP 언어에 의해 합성됩니다.

또한 관계형 모델에 더 가까운 FP는 RDBMS와의 임피던스 불일치를 줄입니다. 이것은 적어도 프로그래머가 아닌 사람에게는 아주 좋습니다.

또한 '정확성'요구 사항을 충족하기 어려운 경우-테스트하기 어려운 형태 (이전의 목표를 미리 알 수없고 결과를 지정할 수없는 과학적 컴퓨팅 / 대량 데이터 분석에서 일반적 임)가 FP가 제공 할 수있는 경우 장점.

함수형 프로그래밍 언어로 전환하기로 결정했다면 내가 직면하게 될 가장 큰 함정은 무엇입니까?

  • 도구 지원 부족 (F # 및 일부 Lisp는 예외, Scala는 진행 중임)
  • 하드웨어에서 마지막 성능의 비트를 짜기가 더 어렵습니다.
  • 대규모 상용 소프트웨어 개발 프로젝트 그룹이 직면 한 문제와 다른 문제에 초점을 맞추는 커뮤니티
  • 산업 환경에서 FP 사용에 경험이있는 개발자는 거의 없으며 , 이를 찾을 수 있다면 급여 및 경쟁 업체와 금융 업계가 제공 할 수있는 혜택과 경쟁해야 할 것입니다
  • 함수형 프로그래밍 방식은 디버깅하기가 더 어려운 경향이 있습니다. 즉, 일련의 구성된 함수 체인에서 결과 사이를 관찰하는 것은 대부분의 (모두?) 디버거에서 일반적으로 불가능합니다

너무 많은 기능적 프로그래밍 언어가 존재하므로 필요에 가장 적합한 언어를 어떻게 선택 하시겠습니까?

  • 어떤 플랫폼 (예 : JVM 또는 .Net)에서 라이브러리 / 프레임 워크를 이미 종료하여 몇 가지 문제를 해결할 수 있습니까? 이러한 문제를 직접 표현할 수있는 언어 구성이 있습니까?

  • 애플리케이션의 공간 및 시간 성능에 대해 얼마나 낮은 수준의 제어가 필요합니까?

  • "정확성"요구 사항은 얼마나 엄격합니까?

  • SW 개발에서 수익성이 높은 틈새 시장이 제공하는 이점을 개발자에게 재교육하거나 경쟁 할 여유가 있습니까?


+1 @Alexander 이것은 분명히이 토론에서 가장 좋은 답변 중 하나입니다. 인적 요소, 숙련 된 개발자를 찾고 동기를 부여하는 어려움을 소개함으로써 토론에 새로운 차원의 논쟁을 가져 왔습니다. 나는 매일 FP 언어의 킬러 기능에 대한 당신의 비전에 전적으로 동의합니다. 왜냐하면 매일 더 많은 명령형 언어가 그것들을 채택하고 있기 때문입니다. 그러나 귀하의 게시물은 FP에 대해 아직도 알지 못하는 많은 것들이 있음을 깨닫기 위해 눈을 뜨었습니다. 마지막으로 .Net 또는 Java와 같은 기존 플랫폼을 기반으로하는 요점은 확실히 매우 유효하고 완전히 합리적입니다.
edalorzo

9

함수형 프로그래밍 언어로 전환하기로 결정했다면 내가 직면하게 될 가장 큰 함정은 무엇입니까? (패러다임 변화와 게으른 평가로 인한 성과 평가의 어려움 외에도).

업계에서 C ++ / C # / Java 개발자라고 가정하면 ...

아무 것도 배우고 싶지 않은 심술 peer은 동료들을 위해 준비하십시오. "한 번 코더 였기 때문에"나쁜 언어 선택을 강요하는 뾰족한 머리 상사를 위해 준비하십시오. monoids에 대해 당신을 애용하는 포럼에서 음란 한 학계를 준비하십시오. Scala는 테일 콜 제거 기능이 없으며 Clojure는 모든 브래킷에 발 페달이 필요하고 Erlang을 시작하지 않기 때문에 끝없는 언어 전쟁에 대비하십시오.

당신이 웹 프로그래머라면 가장 큰 함정은 아마도 당신의 머리카락 일 것입니다.

너무 많은 기능적 프로그래밍 언어가 존재하므로 필요에 가장 적합한 언어를 어떻게 선택 하시겠습니까?

나는 플랫폼으로 시작할 것이다 :

  • OCaml은 Linux에서는 훌륭하고 Windows에서는 끔찍합니다.
  • F #은 Windows에서는 훌륭하고 Linux에서는 끔찍합니다.
  • Scala와 Clojure는 JVM에서 훌륭합니다.

1
"무엇을 배우고 싶지 않은 심술 rump은 동료들을 위해 준비하십시오." 나는 소리 지르고 싶었다 : "그래요! 너무 젠장!" 하지만 정말 슬프다.
Zelphir Kaltstahl

3

이 질문에 대한 (한 편견이있는) 관점에 대해서는 Bob Harper의 블로그 Existential Type을 확인하십시오 . 카네기 멜론 (Carnegie Mellon)은 최근 기능 프로그래밍을 가르치기 위해 CS 커리큘럼을 재 작업했으며, 기능 프로그래밍에 대한 확고한 근거가 확립 된 후에 만 ​​다른 패러다임을 가르치고 하퍼는 실제로 새로운 커리큘럼이 출시됨에 따라 불타고 있습니다. .

Harper는 Standard ML 프로그래밍 언어의 주요 개발자 중 하나이므로 문제에 대한 자신의 의견을 미리 추측 할 수 있다고 주장하는 것은 공평합니다. 그의 사건은 잘됐다.


1
+1이 기사는 확실히 흥미롭고 앞으로도 즐겨 찾기에 보관하겠습니다. FP를 먼저 가르치는 것은 확실히 좋은 접근 방법이라고 생각합니다. 그렇지 않으면 명령 적 사고를 제거하는 것이 실제로 어렵 기 때문에 순전히 기능적인 프로그래밍 언어를 사용하지 않으면 구식을 깨기가 어렵습니다. 버릇. 또한 주요 OOP 언어가 기능적 기능을 통합하고 있으므로 기능 프로그래머의 기술과 마음의 상태를 얻는 것이 가까운 미래에 실제로 유용해야한다는 것을 알았습니다. 흥미로운 통찰력, 감사합니다!
edalorzo

@jimwise : Harper의 기사에 +1. 나는 그의 접근 방식이 매우 적절하다고 생각합니다. @edalorzo : 기능적으로 생각하기 시작하면 프로그램이 충분히 빠르지 않을 때 프로그램을 최적화하기 위해 적용해야하는 최후의 수단으로 명령형 패러다임을 보게됩니다. 나는 최근에 스칼라에서 아주 크지 않지만 사소하지 않은 도구와 실제 기능을 갖춘 작은 도구를 작성해 왔습니다. 놀랍게도 var한 번도 사용하지 않았 거나 변경 가능한 컬렉션을 사용하지 않았습니다 . 따라서 명령 적 사고는 우리 모두가 알다시피, 모든 악의 근원 인 일종의 조기 최적화 IMO입니다.
Giorgio

2

어떤 시나리오에서 주어진 작업을 수행하는 데 더 적합한 기능적 프로그래밍 언어를 고려해야합니까? 병렬 프로그래밍의 최근에 인기있는 멀티 코어 문제 외에도.

함수형 프로그래밍을 사용하는시기를 알려주는 마술 공식은 없습니다. 그것은 객체 지향 프로그래밍이 현재의 프로그래밍 상황에 더 적합하지 않습니다. 그것은 또 다른 추상화 세트로 프로그램을 구성하는 또 다른 방법입니다.

함수형 프로그래밍 언어로 전환하기로 결정했다면 내가 직면하게 될 가장 큰 함정은 무엇입니까? (패러다임 변화와 게으른 평가로 인한 성과 평가의 어려움 외에도).

함수형 프로그래밍은 게으름과 관련이 없습니다. ML과 OCaml은 기능적이고 엄격한 언어입니다. 가장 큰 장애물은 불변 값으로 용어를 구조화하고 부작용에 대한 유형 시스템에서 사용되는 추상화를 머리에 감싸는 것입니다. 함수형 언어는 타입 시스템에서 부작용을 매우 명백하게하기 때문에 최적화에 더 적합합니다. Haskell은 모나드를 사용하지만 순수 기능 언어에서 효과를 사용하는 다른 방법이 있습니다. Clean에는 고유 유형이 있으며 개발중인 다른 언어에는 다른 것도 있습니다.

너무 많은 기능적 프로그래밍 언어가 존재하므로 필요에 가장 적합한 언어를 어떻게 선택 하시겠습니까?

내가 아는 프로그래밍 언어 중에서 Haskell과 Clean 만 기능적 언어라고 할 수 있다고 말할 것입니다. 다른 모든 것들은 타입 시스템에서 그 효과를 명시 적으로 만들지 않고 부작용을 허용합니다. 따라서 함수형 프로그래밍을 배우는 데 시간을 할애한다면 Haskell이 아마도이 법안에 맞는 유일한 것일 것입니다. 내가 알고있는 다른 모든 Erlang, Scala, Clojure 등은 명령형 언어 위에 기능적 추상화를 제공합니다. 따라서 기능적 패러다임에 조금씩 접근하고 싶다면 Scala 또는 Erlang을 추천하고 모든 것을 한 번에 해결하고 좌절감을 포기하고 싶다면 Haskell과 함께 가야합니다.


@ Dadivk01 +1 저는 FP 랭이 다른 툴과 마찬가지로 경쟁력있는 도구이며 다른 모델로 해결 된 것과 동일한 문제를 해결하는 데 사용될 수 있다는 추론을 좋아합니다. 그렇다면 왜 덜 인기가 있다고 생각하십니까? 그리고 대부분의 OOP 언어보다 병렬 컴퓨팅 문제를 해결하는 데 더 적합하다는 데 여전히 동의하십니까? 불변 데이터 유형이 명령 언어와 비교할 때 메모리 풋 프린트 및 성능에 영향을 준다고 말할 수 있습니까? 당신이 "좌절에 포기"말을하는 이유는, 하스켈에 기회를 제공하고, 당신이있는 거 무서운 날, 친구 :)
edalorzo

@edalorzo : 함수형 프로그래밍이 병렬 알고리즘에 더 좋다고 생각하지 않습니다. 사람들은 선언적 프로그래밍과 기능적 프로그래밍을 혼동합니다. 함수형 프로그래밍은 선언적 특성과 선언적 코드를 기계 코드로 변환하기 위해 우수한 컴파일러를 작성하는 정말 똑똑한 사람들입니다. 사소한 세부 사항을 명시 적으로 철자하는 대신 문제를 설명하는 데 더 중점을 둔 다른 언어는 병렬 프로그래밍에 적합합니다.
davidk01

@edalorzo : "절망에 빠지다"에 관해서는 명령형 프로그래밍이 모두 알고 있다면 haskell의 타입 시스템과 효과를 설명하는 모나드 접근법이 너무 많을 수 있다고 말합니다. Erlang과 Scala와 같은 부작용에보다 실용적인 접근법을 취하는 언어로 시작하는 것이 좋습니다.
davidk01

0

나는 기능적 언어에서 인터의 현재 상승이 병렬 컴퓨팅에 이상적이라는 사실에 기인한다. 예를 들어 map-reduce의 전체 아이디어는 기능적 패러다임을 기반으로합니다. 그리고 현재 스케일 아웃이 스케일 업보다 훨씬 쉽고 저렴하다는 것이 확실하기 때문에 병렬 컴퓨팅이 증가 할 것이라는 데는 의심의 여지가 없습니다. 소비자 시장에서도 CPU는 더 많은 GHz가 아닌 더 많은 코어를 얻습니다.

편집 : 모두에게 분명하지 않기 때문에.

순수 기능 프로그래밍에서 함수는 입력을 받고 출력을 생성하며 부작용이 없습니다. 부작용이 없다는 것은 공유 상태가 없으므로 동기화 메커니즘이 필요하지 않다는 것을 의미하며, 그렇지 않으면 동시에 실행하는 동안 필요합니다. 동기화는 동시 / 병렬 소프트웨어에서 가장 어려운 부분이므로 순전히 기능을 수행하므로 기본적으로 가장 어려운 부분을 다룰 필요가 없습니다.

map-reduce의 경우 이름조차도 함수형 프로그래밍에서 비롯됩니다 (매핑 및 축소는 함수형 패러다임의 일반적인 작업입니다). map-reduce의 두 단계는 병렬로 실행되고 입력을 받고 출력을 생성하며 부작용이없는 기능입니다. 이것이 바로 순수한 함수형 프로그래밍 아이디어입니다.

병렬 처리에 사용 된 FP의 몇 가지 예 :

  • CouchDB-Erlang 기반
  • 페이스 북 채팅-Erlang 기반
  • 트위터-스칼라에서 큰 부분 빌드

3
모든 사람들이 병렬 프로그래밍 주장을하지만 백업 할 데이터는 거의 없습니다. 그러한 출처를 알고 있다면 인용해야합니다. 복잡한 계산에는 복잡한 데이터 종속성이있는 경우가 많으며 함수형 프로그래밍 패러다임을 사용하면 일부 모델의 고유 한 데이터 상호 종속성이 마술처럼 사라지지 않습니다. GPU 프로그래밍은 병렬 처리가되지만 병렬 처리 기능이 내장 된 모델을 사용하여 명령형 언어를 사용함으로써 얻을 수 있습니다.
davidk01

4
@vartec : 객관성의 관점에서 주장을 뒷받침하는 참조를 제공 할 수 있다면 여전히 좋을 것입니다. 그것은 무지한 독자들이 반대 질문보다 훨씬 더 도움이 될 것입니다 ...
blubb

1
@vartec : 사실은 아닙니다. 많은 사람들이 주장을하는 것은 사실이 아닙니다. 나는 수학 훈련을 비난하지만 우리 모두는 우리의 주장에 대한 어려운 사실과 구체적인 정당화와 같은 것을 믿지 않으며 편집 내용이 여전히 내 의견을 다루지 않습니다.
davidk01

1
@vartec 당신은 당신의 주장을 뒷받침하는 믿을만한 출처를 언급 할 수 있습니다.
quant_dev

1
+1 @ davidk01 "모두가 병렬 프로그래밍 주장을하지만 백업 할 데이터가 거의 없습니다". 나는 반대로 많은 증거를 알고있다. 예를 들어, Cilk 논문은 멀티 코어에서 확장 가능한 병렬 처리의 요구 사항 인 우수한 캐시 복잡성을 원하는 경우 내부 돌연변이가 얼마나 중요한지를 설명합니다.
Jon Harrop 2012
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.