Haskell / Clojure는 실제로 입자 시뮬레이션과 같은 동적 시스템에 적합하지 않습니까?


9

이전 질문에서 기능 프로그래밍 언어는 물리 엔진과 같은 동적 시스템에는 적합하지 않다는 이야기를 들었습니다. 주로 객체를 변경하는 데 비용이 많이 듭니다. 이 진술은 얼마나 현실적이고, 왜 그런가?


4
당신은 찾을 수 github.com/linneman/particles-clj 재미를. Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases

2
그들이 부적당하다고 누가 말했습니까? 답변 / 댓글에 링크 하시겠습니까?
Andres F.

7
@ 독 카트 (Dokkat) : 나는 주석가가 함수형 프로그래밍에 대해 많은 것을 알고 있다는 사실에 회의적이다. 나는 큰 소금 알갱이로 가져갈 것입니다.
CA McCann

6
또한 저자가 실제로 기능 프로그램 작성을 시도하지 않았다면 "순수한 기능 접근 방식은 게임에 적합하지 않습니다 ..."로 시작하는 대답을 무시합니다 . 그렇지 않으면, 그는 문제 있을 있다고 생각하는 것을 추측 하고 있습니다.
Andres F.

1
@Dokkat 게임 개발에는 파티클 시뮬레이터와 물리 엔진 (기능 프로그래밍에 다소 잘 맞을 수 있음)이 아니라 추가적인 제약 조건이 있습니다. 런타임 성능은 게임 개발의 핵심이며 (물리적으로 물리 자체보다 중요합니다). 폭발을 예측하는 광산 회사의 물리 엔진은 성능 이상의 정확성을 요구합니다. 함수형 프로그래밍을 사용하면 더 많은 하드웨어를 던져서 더 많은 성능을 쉽게 얻을 수 있습니다 (게임 엔진이 할 수없는 것).

답변:


10

Haskell과 Clojure는 실제 변경 가능성을 허용하므로 문제가 아닙니다.

그 외에도 "변경 가능"데이터가 더 큰 계산의 일부로 점진적으로 업데이트되는 중간 값으로 구성되는 경우 효율성을 높이기 위해 변경이 필요하지 않을 수도 있습니다! 예를 들어, Haskell에서 스트림 퓨전 ( stream fusion ) 이라는 기술에 대한 연구가 진행 중이며 , 여기서 컴파일러는 처리 루프, 데이터 생산자 및 데이터 소비자를 통합하여 중간 데이터 구조를 완전히 제거합니다.

Haskell의 주요 문제는 게으름입니다. 입력 데이터가 많고 출력 데이터가 많고 중요합니다. 게으름은 호의를 거의 얻지 않지만 여전히 약간의 오버 헤드를 부과합니다. 그것은 Haskell (실제로 사람들이하는 것)에서 이와 같은 프로그램을 작성할 수는 없지만 언어의 강점을 따르지 않으며 원하는 성능을 얻기 위해 평가 모델을 더 잘 이해해야합니다.

즉, 많은 수의 크 런칭은 JVM의 강점에도 영향을 미치지 않습니다. 그런 종류의 프로그램이 FORTRAN이 여전히 존재하는 이유입니다.


1
주목할 가치가 있습니다. 다가오는 8.0 버전의 GHC는 모듈 당 엄격한 평가 모드를 지원합니다.
Erik Kaplun

8

Clojure를 말할 수는 없지만 Haskell은 원하는 모든 변이를 ​​허용하는 매우 조정 된 IO 패키지가 많이 있다고 말할 수 있습니다.

다음은 누군가가 가장 일반적인 세 ​​가지를 자세히 설명하고 그 성과를 고려한 질문에 대한 답변입니다. https : //.com # 15440286

당신은 또한 볼 수 있습니다 여기에 높은 IO 집약적 인 응용 프로그램입니다 워프라는 하스켈 웹 서버의 성능 메트릭을 보여주는 간단한 그래프.

Haskell과 관련하여 이것에 대해 많은 혼란이 있습니다. 진실은 IO를 매우 다양한 방식으로 사용하기 위해 많은 패키지가있는 환상적인 IO 시설을 가지고 있으며, 많은 것들이 고도로 조정되었습니다. 사람들이 그렇지 않다고 생각하는 이유는 Haskell이 IO를 다른 모든 것과 분리하기 위해 많은 시간을 들였기 때문에 성능 특성에 영향을 미치지 않기 때문입니다.

그러나 성능 특성에 대해 말하면 사람들이 성능이 좋지 않다고 인식하는 이유는 지연된 평가로 인해 항상 직관적이지 않은 방식으로 작동하기 때문입니다. 그러나 이것은 당신이 말하는 시스템과 같은 파괴적인 업데이트를 수행하는 IO 컨텍스트에서 작업을 시작할 때 상당히 걱정해야 할 부분입니다. 또한 사람들은 성능 문제가 발생했을 때 리소스가 어디에서 도움이 될지를 계측하고 식별 할 수있는 내장 된 기능을 발견하는 경향이 있습니다.

설명하는 시스템을 살펴볼 가치가있는 또 다른 모나드는 ST의 모나드 (monad) 일 것입니다. ST 모나드 는 매우 작은 IO 호출로 수행되는 파괴적인 업데이트를 위해 특별히 성능을 향상시킵니다.

Clojure와 대화 할 수 없어서 죄송합니다. 다른 누군가가 세부 정보를 제공 할 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.