기능적 패러다임이 기본 하드웨어와 너무 다양하여 일반적으로 효율적이지 않습니까?


14

SO의 질문에서 영감을 얻었습니다 : /programming/6623391/how-to-gain-control-of-a-5gb-heap-in-haskell

FP의 여러 장단점에 대해서는 오랜 논쟁이 될 수 있지만, 현재 는 현대 하드웨어에서 FP의 주요 효율성 으로 범위를 좁히고 싶습니다 .

명제:

기능적 패러다임은 불변성과 상태 비 저장 (?)을 의미하지만, 기능 프로그램을 실행하는 하드웨어는 상태 저장 유한 자동 마타입니다. '순수한 기능'프로그램을 '상태 저장 하드웨어'표현으로 변환하면 프로그래머가 거의 제어 할 수없고 오버 헤드 (?)가 발생하며 하드웨어 기능 (?)의 사용이 제한됩니다.

의문의 진술에서 내가 옳고 그른가?

FP가 현대의 범용 컴퓨터 아키텍처에서 주요 성능 저하를 암시하지 않음을 증명할 수 있습니까?

편집 : 일부 의견에 대한 답변으로 이미 언급했듯이 문제는 구현 성능 및 세부 사항에 관한 것이 아닙니다. Stateful Automata에서 FP를 실행하면 발생할 수있는 주요 오버 헤드있는지 여부 에 관한 것입니다.


3
현대 하드웨어가 어떻게 낮은 수준에서 작동하는지 실제로 본 적이 있습니까? 효율성에 관심이 있다면 일상적인 명령 프로그래밍과 비슷하지 않습니다.
CA McCann

믿거 나 말거나 기능적인 프로그래밍 언어와 컴파일러를 디자인 한 컴퓨터 과학자들도 성능 최적화에 대해 약간 알고 있습니다. 이것이 모든 기능적 언어 제품의 목표는 아니지만 심각한 생산 플랫폼을위한 것입니다.
Jeremy

@camccann, @Jeremy : 예를 들어 C # 및 Java는 가상 머신을 사용합니다. 그것이 최적의 C # 및 Java 프로그램이 생산에 얼마나 효율적 상관없이,이 아무리 입니다 원금 비 효율성의 소스와는 VM입니다. 문제는 구현 성능에 관한 것이 아니라 running FP on stateful automata입니다.
덩굴

1
내 질문에 여기 -의 볼 programmers.stackexchange.com/q/71391/963
Gulshan

2
@vines : 멋진 JITing을 사용하는 최신 VM이 실제로 경우에 따라 네이티브 코드보다 성능이 우수하다는 것을 알고 있습니까? 그리고 컴파일러의 전체 목적은 프로그램을 현대 언어와 달리 기본 아키텍처와 일치하는 표현으로 변환하는 것입니다. 귀하의 질문은 의미가 없습니다.
CA McCann

답변:


7

불변성에 대한 큰 오해가 있습니다.

불변성은 시맨틱의 특징이지만 구현에서 불변성을 의미하지는 않습니다.

간단한 예는 게으름의 구현입니다.

계산이 게으른 경우 표현식의 결과는 개념적으로 값이지만 기본 구현은 평가할 인수와 값을 작성하는 함수 및 값을 저장하는 슬롯을 포함하는 썽크입니다.

처음으로 (언어로) 값을 물어 보면 실제로 계산이 수행되고 결과가 평가되며 사용자에게 돌려주는 값 (또는 핸들)이됩니다.

이것은 언어 의미론에서 투명하며,이 변수는 값 (또는 미래 값)에 바인딩되어 있고 일단 완료되면 반환 될 값을 변경할 수 없다는 것만 알고 있습니다. 기본 메모리 표현이 변경되지만 알 수는 없습니다.

모든 언어에 대해 동일한 의미 / 구현 차이가 있으며 실제로 최적화 의 핵심입니다 . 언어가 무엇이든, 시맨틱은 어떤 것들을 보장하지만, 다른 것들을 지정하지 않으면 최적화의 여지를 남겨 둡니다.

예를 들어, 실제로 기능적인 언어는 C ++만큼 빠르지 않습니다. 그러나 Go(여전히 과대 광고입니다) Haskell 또는 Lisp보다 느리고 C # Mono ( source )도 느립니다 .

C ++ 또는 C가 이러한 성능을 얻는 데 얼마나 신뢰할 수 있는지 알면 조금 놓아두고 싶을 것입니다.

Haskell이 오늘날 빠르게 성장하고 있고 컴파일러 / 런타임에 최적화 할 여지가 여전히 많다는 것을 알게되면 (예 : 온실 가스가 최근에 LLVM으로 전환 된 것처럼, Microsoft Research는 런타임 개선에 적극적으로 자금을 지원하고 있습니다), 곧 개선 될 것입니다.

재미 : 정규 표현식에서의 플레이 또는 Haskell 팀 re2이 여러 시나리오에서 Google의 C 라이브러리 보다 성능이 뛰어난 정규 표현식 매처를 만든 방법 .


낙관적 인 소리 :)
덩굴

3

기능적 패러다임은 범위를 좁히는 데 유용합니다. 이것은 컴퓨터가 어떻게 진화 하는지를 고려할 때 정말 좋습니다.

멀티 코어 CPU는 공유 리소스를 다루는 데 큰 문제가 있으며 동기화 비용은 실제로 비쌉니다. 기능적 패러다임을 통해 자연스럽게 문제가없는 프로그램을 표현할 수 있습니다. 이것은 병렬 처리에 정말 좋습니다.

또한 SaaS 및 클라우드 컴퓨팅에서 서버 팜을 점점 더 많이 사용하고 있습니다. 따라서 동일한 응용 프로그램이 여러 컴퓨터에서 실행되어야합니다. 이 위치에서 동기화 비용은 훨씬 더 비쌉니다. 구글은 여러분이 작성할 수있는 함수형 프로그래밍과 알고리즘에 관한 몇 가지 연구와 논문을 발표했습니다. 이것은 스캐 빌리티 문제가 있기 때문에 그들에게 중요한 것입니다.

또한 컴퓨터의 힙에 스택을 쉽게 연결할 수 있으며 링크 된 목록을 사용하여 연속적이지 않은 스택을 만들 수도 있습니다. 이것은 많은 프로그래밍 언어에서 스택 추적을 생성하기 위해 수행됩니다. 따라서 이것은 문제가되지 않습니다.

기능 프로그래밍은 몇 가지 한계를 암시합니다. 그러나 그것은 현대 컴퓨터에서 우리가 가지고있는 패러다임에서 다루기가 매우 어려운 문제를 표현할 수있는 자연스러운 방법을 제공합니다. 확장 성은 그 중 하나이며, 실제로 거래되고 있습니다.

복잡한 병렬 시스템을 이미 다루고있는 모든 사람들은 내가 말하는 것을 알고 있습니다.

그래서 나는 대답을 뉘앙스로 만들 것입니다. 예, 기능에는 최신 하드웨어에 문제가 있지만 일반 오래된 프로그래밍에도 문제가 있습니다. 항상 그렇듯이 장점과 단점이 있습니다. 요점은 그들이 무엇인지 아는 것이므로 필요할 때 적절한 선택을 할 수 있습니다.


0

현재 상태를 알지 못하거나 얼마나 어려울 지 모르지만 실제로 대답이 없습니다. 그러나 컴파일러가 입력에서 해당 내용을 보장한다고해서 반드시 출력에 해당 내용이 있음을 의미하지는 않습니다. . 이론적으로 충분히 똑똑한 컴파일러는 이러한 모든 문제를 해결할 수 있지만 실제로는 항상 존재할 것입니다.

그러나 그것을 보는 또 다른 방법은 Lisp 기계의 역사를 보는 것입니다. 내가 올바르게 기억한다면, 그들은 원래 Lisp가 당시의 기계와 다른 점과 동일한 문제를 극복하도록 설계되었습니다. 데스크탑은 다른 머신을 지원하는 것보다 비 효율성을 더 싸게 살 수있을만큼 빠르게 빨라지면서 이러한 머신의 개발은 결국 중단되었습니다.

일반적으로 성능이 가장 중요한 응용 프로그램을 제외하고 FP 언어는 여전히 빠릅니다. 더 높은 수준의 언어를 선택하면 더 세밀한 조정 제어 및 성능의 우선 순위를 낮추어 안전하고, 쉬우 며, 유지 관리가 용이 ​​한 또는 기타 우선 순위를 지정할 수 있습니다.

결국 프로그래밍은 트레이드 오프에 관한 것이므로 프로젝트에 더 중요한 것을 선택하면됩니다.


0

기능적 패러다임은 불변성과 무국적을 의미하지만, 완전히 순수한 프로그래밍 언어는 없습니다. 가장 순수한 Haskell조차도 부작용을 허용합니다.

즉, 효율성에 대한 귀하의 질문에 대답하기 위해 Haskell과 Clojure를 모두 사용했으며 성능 문제도 발견하지 못했습니다.


1
요구 사항과 관련된 문제 높은 병렬 처리는 가치가 있지만 전체 점수는 얼마입니까?
덩굴

1
@vines : 성능에 중요한 응용 프로그램에 어느 언어도 사용하지 않았으므로 실제로는 말할 수 없습니다.
래리 콜먼

1
부작용이 없어도 재미가 없습니다. 결과를 어디에나 저장할 수 없기 때문입니다.

@ Thorbjørn Ravn Andersen : ... 발신자에게 돌려주는 것 이외의 방법으로 허용됩니다.
덩굴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.