기능 프로그래밍 및 과학 컴퓨팅


42

이것이 모호한 질문이라면 죄송하지만 여기에갑니다.

지난 몇 년 동안, 기능 프로그래밍 은 소프트웨어 엔지니어링 커뮤니티에서 많은 관심을 받았습니다. 많은 사람들이 스칼라와 하스켈 같은 언어를 사용하기 시작했으며 다른 프로그래밍 언어와 패러다임에 대한 성공을 주장했습니다. 제 질문은 고성능 컴퓨팅 / 과학 컴퓨팅 전문가로서 기능적 프로그래밍에 관심을 가져야합니까? 이 미니 혁명에 참여해야합니까?

SciComp 작업 영역에서 기능 프로그래밍의 장단점은 무엇입니까?


2
왜 자켓을 의도적으로 입었습니까? 부작용은 도구입니다. 실제 응용 프로그램에 필수적입니다. CPU와 메모리 효율성을 원한다면 함수형 프로그래밍 언어가 내 레이더에 없을 것입니다. 자동 검증 / 정확성 점검이 필요한 프로그램 (예 : 핵 시설에서 사용하기 위해?) 그렇다면 문제가있을 수 있습니다.
Apprentice Queue

답변:


34

나는 약간의 함수형 프로그래밍을 했으므로 소금에 대한 답을 얻으십시오.

장점 :

  • 함수형 프로그래밍은 매우 수학적으로 보입니다. 수학적 개념을 표현하기에 좋은 패러다임입니다.
  • 프로그램의 공식 검증 및 정리 증명과 같은 유용한 라이브러리가 있으므로 프로그램에 대해 추론하는 프로그램을 작성할 수 있습니다.이 측면은 재현성에 좋습니다.
  • 람다 식을 통해 Python 및 C ++에서 함수형 프로그래밍을 수행 할 수 있습니다. Julia와 Mathematica에서 함수형 프로그래밍을 할 수도 있습니다
  • 많은 사람들이 그것을 사용하지 않으므로 개척자가 될 수 있습니다. MATLAB, Python, R 및 Julia의 초기 채택자가 있었지만 이제 Julia와 마찬가지로 기능 프로그래밍의 초기 채택자가 있어야합니다.

단점 :

  • 일반적으로 Haskell, OCaml (및 기타 ML 방언) 및 Lisp와 같은 기능적 프로그래밍 언어로 간주되는 언어는 성능에 중요한 과학 컴퓨팅에 사용되는 언어에 비해 느린 것으로 간주됩니다. OCaml은 C보다 절반 정도 빠릅니다.
  • 이러한 언어에는 계산 과학 (Fortran, C, C ++, Python)에서 일반적으로 사용되는 언어와 비교할 때 라이브러리 인프라가 부족합니다. PDE를 풀고 싶다면 계산 과학에서 사용되지 않는 언어보다 PDE를 사용하는 것이 더 쉽습니다.
  • 절차 적 언어를 사용하는 것보다 기능적 프로그래밍 언어를 사용하는 계산 과학 커뮤니티는 많지 않습니다. 즉, 학습이나 디버깅에 많은 도움을받지 못하고 사람들은 아마도 당신에게 쓰레기를 줄 것입니다. 그것을 사용 (당신이 그것을받을 자격 여부)
  • 기능적 프로그래밍의 스타일은 절차 적 프로그래밍에 사용 된 스타일과는 다릅니다. 절차 적 프로그래밍은 일반적으로 입문 컴퓨터 과학 수업과 "과학 및 엔지니어를위한 MATLAB"유형 수업에서 진행됩니다.

나는 "Cons"섹션의 많은 반대 의견이 극복 될 수 있다고 생각합니다. 이 Stack Exchange 사이트에 대한 일반적인 논의와 마찬가지로 개발자 시간은 실행 시간보다 중요합니다. 기능적 프로그래밍 언어가 느리더라도 성능에 중요한 부분을 더 빠른 절차 적 언어로 위임 할 수 있고 빠른 응용 프로그램 개발을 통해 생산성 향상을 입증 할 수 있다면 유용 할 것입니다. 순수 Python, 순수 MATLAB 및 순수 R로 구현 된 프로그램이 C, C ++ 또는 Fortran에서 동일한 프로그램을 구현하는 것보다 상당히 느리다는 점에 주목할 가치가 있습니다. Python, MATLAB 및 R과 같은 언어는 생산성을 위해 실행 속도를 바꾸고 심지어는 Python과 MATLAB에는 모두 C 또는 C ++로 컴파일 된 코드에 대한 인터페이스를 구현하는 기능이있어 성능에 중요한 코드를 빠르게 실행하도록 구현할 수 있습니다. 대부분의 언어에는 C에 대한 외부 함수 인터페이스가 있으며, 이는 계산 과학자에게 관심있는 대부분의 라이브러리와 인터페이스하기에 충분합니다.

함수형 프로그래밍에 관심이 있습니까?

그것은 모두 당신이 멋지다고 생각하는 것에 달려 있습니다. 당신이 컨벤션을 기꺼이하려는 사람의 유형이고 당신이 함수형 프로그래밍으로하고 싶은 것이 무엇이든 미덕에 대해 사람들에게 복음을 전할 의지를 가지고 있다면 . 나는 모든 해설자들이 틀렸다는 것을 증명하는 것 외에 다른 많은 이유가 없다면 계산 과학에서 함수형 프로그래밍으로 멋진 일을하는 것을보고 싶습니다. 당신이 묻는 사람들의 무리를 처리하고자하는 사람의 유형이 아닌 경우 "왜에 도대체 당신은 (여기에 자신이 좋아하는 절차 적 프로그래밍 언어 삽입) 대신에 기능적인 프로그래밍 언어를 사용하고 있습니까?"그때 나는 '같으면 귀찮게.

시뮬레이션 집약적 인 작업을 위해 기능적 프로그래밍 언어가 사용되었습니다. 양적 거래 회사 인 Jane Street는 OCaml을 사용하여 재무 모델링 및 거래 전략을 실행합니다. 라이브러리에서 사용되는 일부 C 코드를 생성하기 위해 OCaml도 FFTW에서 사용되었습니다. Liszt는 Stanford에서 개발되어 Scala에서 구현 된 도메인 별 언어로 PDE 해결에 ​​사용됩니다. 함수형 프로그래밍은 산업계에서 반드시 사용됩니다 (계산 과학에서는 반드시 그렇지는 않습니다). 그것은 계산 과학에서 이륙할지 여부는 여전히 남아 있습니다.


4
찬반 양론을 추가하고 싶습니다. Pro :: 코드 유연성 : 모든 것이 함수이므로 항상 다른 함수로 해당 함수를 호출 할 수 있습니다. 이것은 매우 강력합니다. Con :: 코드 가독성 : 함수형 프로그래밍 코드는 실제로 읽기가 어렵습니다. 심지어 그것들을 쓴 사람들에게도. 6 개월 전에 Mathematica에서 B- 스플라인의 일반적인 PDE 문제를 해결하기 위해 작성한 오래된 코드를 이해하는 데 시간이 조금 걸립니다. 나는 동료를 놀라게하고 싶을 때 항상 그 코드를 뽑습니다. ;-).
seb

4
내가 추가 할 유일한 추가 사항은 Con :: memory consumer 입니다. 부작용을 없애기 위해 많은 복사 작업을 수행해야합니다.
Matthew Emmett

1
@StefanSmith : (i) 때때로 연구에 사용되는 것을 알고 있습니다 (예 : Maxima는 Lisp 기반 CAS입니다). 그 이상으로, 나는 내 머리 꼭대기를 모른다. (ii) 모르겠다. 내 답변의 대부분은 지난 몇 년 동안 내가했던 대화에서 얻은 일화적인 증거에 근거한 것입니다.
제프 옥스 베리

@seb, Haskell과 같은 기능 언어에는 거의 적용되지 않는 Lisp와 같은 기능 언어의 속성을 설명하는 것처럼 들립니다.
Mark S.

1
@MatthewEmmett의 의견에 크게 투표하십시오. 고성능 계산에는 복사 비용이 매우 많이들 수 있습니다.
Charles

10

나는 과학적 계산 배경과 기능적 프로그래밍 언어 사용자를 가진 HPC 실무자이기 때문에 이것에 대한 독특한 관점을 가질 수 있습니다. HPC를 과학적 계산과 동일시하고 싶지는 않지만 상당한 교차점이 있으므로 이것이 이에 대한 관점입니다.

HPC 사용자와 고객은 최대한 최고 성능에 가까운 것을 달성하기 위해 진심으로 관심을 갖기 때문에 기능 언어는 현재 HPC에서 채택되지 않을 것입니다. 코드가 기능적인 방식으로 작성되면 자연스럽게 악용 될 수있는 병렬 처리를 노출하지만 HPC에서는 충분하지 않습니다. 병렬 처리는 고성능을 달성하는 데있어 퍼즐의 한 부분 일뿐입니다. 또한 광범위한 마이크로 아키텍처 세부 사항을 고려해야하며,이를 위해서는 일반적으로 코드 실행에 대한 매우 세밀한 제어가 필요합니다. 내가 아는 기능적 언어.

즉, 이것이 바뀔 수 있기를 바랍니다. 연구자들이 이러한 미세 아키텍처 최적화를 자동화 할 수 있다는 사실을 알게되었습니다. 이것은 사용자가 원하는 계산의 "사양"을 입력하는 소스-소스 컴파일러 기술의 동물원을 가져 왔으며, 컴파일러는 C 또는 포트란 코드를 출력하여 효율적으로 계산하는 데 필요한 최적화 및 병렬 처리를 실현합니다. 대상 아키텍처를 사용하십시오. 우연히 이것은 기능 언어가 프로그래밍 언어 모델링 및 분석에 잘 적응하는 것입니다. 함수형 언어의 첫 번째 주요 채택자가 컴파일러 개발자 인 것은 우연이 아닙니다. 몇 가지 주목할만한 예외를 제외하고는 이것이 실제로 보류되는 것을 보지 못했지만 아이디어가 있습니다.


8

한 가지 측면을 다른 두 가지 답변에 추가하고 싶습니다. 생태계를 제외하고 기능 프로그래밍은 멀티 스레딩 또는 분산 컴퓨팅과 같은 병렬 실행을위한 훌륭한 기회를 제공합니다. 고유의 불변 속성은 병렬 처리에 적합합니다. 이는 병렬 언어에 적합합니다. 이는 명령형 언어와 관련하여 일반적으로 삐걱 거리는 *의 고통입니다.

최근 몇 년 동안 하드웨어 성능이 향상되어 고주파수를 늘리는 대신 프로세서에 코어를 추가하는 데 중점을 두었 기 때문에 병렬 계산이 점점 더 대중화되고 있습니다 (모두 알고 있습니다).

Geoff가 언급 한 또 다른 사항은 개발자 시간이 종종 실행 시간보다 중요하다는 것입니다. 저는 계산 집약적 인 SaaS를 구축하는 회사에서 일하고 있으며 C ++과 Java를 시작하면서 초기 성능 테스트를 수행했습니다. 우리는 C ++이 Java에 비해 실행 시간이 약 50 % 단축되었다는 것을 발견했습니다 (이는 계산 기하학을위한 것이며 응용 프로그램에 따라 수치가 다를 수 있습니다). 어쨌든 개발자 시간의 중요성으로 인해 Java와 함께 가길 바랐습니다. 최적화 및 향후 하드웨어 성능 개선은 시장에 출시하는 데 도움이 될 것입니다. 나는 우리가 달리 선택했다는 확신을 가지고 말할 수 있지만, 우리는 여전히 사업에 종사하지 않을 것입니다.

그러나 Java는 기능적 프로그래밍 언어가 아니므로 어떤 것과 관련이 있는지 물어보십시오. 나중에, 우리는 더 많은 기능적 패러다임의 지지자들을 고용하고 병렬화의 필요성을 우연히 발견함에 따라, 시스템의 일부를 스칼라로 점진적으로 마이그레이션했습니다. 자바. 이는 두통을 최소화하면서 시스템 성능을 향상시킬 때 큰 도움이되었으며 앞으로 더 많은 코어가 내일의 프로세서에 장착 될 때 하드웨어 비즈니스의 성능 향상으로 인한 혜택을 계속 누릴 수있을 것입니다.

나는 다른 답변에 언급 된 단점에 전적으로 동의하지만 병렬 실행의 촉진은 언급 할 수없는 강력한 전문가라고 생각했습니다.


8

Geoff는 이미 자신의 요점 중 하나 인 생태계를 강조하는 것 외에 다른 점을 거의 추가하지 않은 이유에 대한 좋은 개요를 제공했습니다. 함수형 프로그래밍이나 다른 패러다임을지지하든, 해결해야 할 중요한 질문 중 하나는 다시 작성해야 할 때마다 다른 소프트웨어를 만들 수 있다는 것입니다. 예를 들어 선형 대수 또는 유한 요소 라이브러리의 MPI, PETSc 또는 Trilinos는 모두 C 또는 C ++로 작성됩니다. 시스템에는 엄청난 양의 관성이 있습니다. 모든 사람들이 C / C ++가 실제로 계산 소프트웨어를 작성하는 가장 좋은 언어라고 생각하기 때문이 아니라 많은 사람들이 수년간의 삶을 위해 유용한 무언가를 만들어 냈기 때문에 많은 사람들.

나는 대부분의 계산 사람들이 새로운 프로그래밍 언어를 시도 하고이 문제에 대한 적합성을 평가하는 데 많은 가치가 있다는 데 동의 할 것이라고 생각합니다. 그러나 다른 사람들이하는 것과 경쟁이 치열한 결과를 얻을 수 없기 때문에 어렵고 외로운 시간이 될 것입니다. 또한 다른 프로그래밍 패러다임으로 다음 단계를 시작한 사람으로 명성을 얻을 수 있습니다. Fortran을 대체하는 데 약 15 년이 걸렸습니다.


6
그리고 C ++ 은이 공간에서 Fortran을 실제로 대체하는 절반의 방법입니다. 우리는 항상 포트란에서 새로운 코드를보고, 부팅 할 많은 레거시 코드를 보게됩니다!
Bill Barth

2
Fortran과 달리 C ++은 배우고 사용하기에는 너무 복잡합니다. 새로운 오픈 소스 과학 코드는 여전히 포트란에서 작성되고 있습니다. 내 분야 (지구 과학)에서 주목할만한 것은 PFlotran, SPECFEM3D, GeoFEM 등입니다. 대기 과학의 거의 모든 새 코드에 대한 Ditto입니다. IMHO C ++은 (C)로 대체 된 것을 대체하지 않았습니다.
stali

1
당신은 포트란에게 볼프강 (Wolfgang)을 시험해보아야합니다.
Ondřej Čertík

3
나는 속도에 신경 쓰지 않는다. (잘, 나는 조금한다. 그러나 그것은 다른 사람들을위한 가장 중요한 고려 사항은 아니다). 중요한 것은 복잡한 알고리즘을 프로그래밍하는 데 걸리는 시간이며, 언어가 너무 간단하기 때문에 Fortran 은이 부분에서 잃어 버립니다. 말할 표준 라이브러리도없고, 일반적인 코드를 허용하는 템플릿도없고 반 방향 객체 지향도 없습니다. 포트란은 단순히 내 언어가 아니며, 솔직히 말해서 거의 모든 다른 과학 컴퓨팅 사람들을위한 것이 아닙니다.
볼프강 Bangerth

4
@StefanSmith : 예. 그것은 과학 컴퓨팅에서 방어적인 아이디어 일 수 있습니다 (여전히 그것이 구식이며 비생산적이라고 주장 할 것입니다). 우리 학생들의 대다수가 학계를 떠나고 업계에서는 사실상 아무도 포트란을 사용하지 않기 때문에 학생들의 교육에 관한 한 확실히 방어 할 수는 없습니다.
Wolfgang Bangerth

7

빠른 요약은

  1. 수치 컴퓨팅은 가변성 / 부작용을 사용하여 대부분의 속도 향상을 달성하고 할당을 줄입니다 (많은 기능적 프로그래밍 구조에는 불변 데이터가 있음)
  2. 게으른 평가는 숫자 코드와 함께 사용하기가 어려울 수 있습니다.
  3. 성능을 위해 가장 낮은 레벨로 내려가는 패키지 (C / Fortran 또는 현재 Julia) (필요에 따라 어셈블러 코드를 편집 할 수도 있음)를 개발하거나 이러한 빠른 라이브러리를 사용하는 스크립트를 작성 중입니다. 따라서 대부분 개발 시간에 신경을 쓰는 경향이 있습니다 (그래서 Julia / MATLAB / Python / R을 선택하십시오). 기능적 언어는 다른 분야에서는 도움이되지만 여기서는 도움이되지 않는 이상한 중간에 앉아있는 경향이 있습니다.
  4. 미분 방정식, 최적화, 수치 선형 대수 등에 대한 대부분의 수치 알고리즘은 수렴 측면에서 작성 / 개발 / 증명됩니다. 즉 근사값 있고 을 얻으려고 합니다. 이러한 알고리즘을 구현하는 자연스러운 스타일은 루프입니다. (일부 멀티 그리드 알고리즘과 같이 재귀 적으로 작성된 알고리즘이 있지만 훨씬 더 드물다.)xnxn+1

이러한 사실들은 함께 기능 프로그래밍이 대부분의 사용자에게 필요하지 않은 것처럼 보이게합니다.


+1이지만 포인트 3에 한 가지 추가 사항 : 고급 언어의 기능적 기능은 매우 유용하며 다른 답변 (예 : 쉬운 병렬화)에서 언급 한 기능적 언어의 많은 장점이이 시나리오에 적용되는 경향이 있습니다.
Szabolcs

3

Computational Science에서 함수형 프로그래밍을 사용하는 것은 새로운 것이 아니라는 점에 주목하는 것이 흥미 롭습니다. 예를 들어, 1990 년이 논문은 부분 평가를 사용하여 Lisp (가장 초기 기능적 프로그래밍 언어)로 작성된 수치 프로그램의 성능을 향상시키는 방법을 보여주었습니다. 이 작품은 (의 GJ 서스에 의해 1992 년 논문에서 사용되는 툴 체인의 일부 SICP의 제공 및 J 지혜 명성) 태양계의 혼란 행동의 수치 증거를 . 해당 계산과 관련된 하드웨어 및 소프트웨어에 대한 자세한 내용은 여기를 참조하십시오 .


1

R은 기능적 언어이며 통계 (& 현재 기계 학습) 언어이며 실제로 통계를위한 최고의 언어입니다. 그러나 HPC 언어는 아닙니다. 물리 시뮬레이션 등과 같은 전통적인 "숫자 크 런칭"에는 사용되지 않습니다. 그러나 머신 러닝의 대규모 통계 시뮬레이션 (MCMC)을 위해 대규모 클러스터 (예 : MPI를 통해)에서 실행할 수 있습니다.

Mathematica는 또한 기능적 언어이지만 핵심 영역은 숫자 컴퓨팅이 아닌 기호 컴퓨팅입니다.

Julia에서는 기능적 스타일로 프로그래밍 할 수도 있습니다 (절차 적 및 OO의 풍미 (멀티 디스패치)). 그러나 순수하지는 않습니다 (기본 데이터 구조는 모두 변경 가능합니다 (튜플 제외). 불변의 라이브러리가 있지만 더 중요한 것은 절차 적 스타일보다 훨씬 느리기 때문에 많이 사용되지 않습니다.

나는 Scala를 기능적 언어 라기보다는 객체-기능적 하이브리드라고 부릅니다. 스칼라에서는 많은 기능 개념을 사용할 수 있습니다. 스칼라는 Spark ( https://spark.apache.org/ ) 때문에 클라우드 컴퓨팅에 중요합니다 .

현대의 포트란은 실제로 함수형 프로그래밍의 몇 가지 요소를 가지고 있습니다. (C와 달리) 엄격한 포인터 의미론을 가지고 있으며, 순수한 (부작용이없는) 함수를 가질 수 있으며 (불변으로 표시) 불변성을 가질 수 있습니다. 또한 스마트 인덱스를 사용하여 행렬 인덱스에 대한 조건을 지정할 수 있습니다. 이 쿼리는 C #에서 LINQ의 R과 같은 고급 언어 또는 기능적 언어의 고차 필터 기능을 통해 일반적으로 발견되는 쿼리입니다. 따라서 포트란은 전혀 나쁘지 않으며, 많은 언어에서 볼 수없는 매우 현대적인 기능 (예 : 보조 배열)도 있습니다. 실제로 Fortran의 향후 버전에서는 Fortran의 OO가 실제로 어색하고 추악하기 때문에 OO 기능 (현재는 일반적인 경우)보다 더 많은 기능이 추가 될 것입니다.


1

장점은 각 기능 언어에 내장 된 "도구"입니다. 데이터를 필터링하기 쉽고 데이터를 반복하기가 쉽고 문제에 대한 명확하고 간결한 솔루션을 찾는 것이 훨씬 쉽습니다.

유일한 단점은, 당신이이 새로운 종류의 사고에 대해 머리를 가져야한다는 것입니다. 당신이 알아야 할 것을 배우는데 시간이 걸릴 수 있습니다. SciComp 도메인의 다른 사람들은 실제로 해당 언어를 사용하지 않으므로 많은 지원을받을 수 없습니다 :(

기능 과학 언어에 관심이 있으시면 https://ac1235.github.io를 개발했습니다.


1

여기에 왜 함수형 프로그래밍에 대한 내 인수입니다 , 그리고 해야 전산 과학에 활용 될 수있다. 이점은 엄청 나며 단점은 빨리 사라집니다. 내 마음에는 단 하나의 죄수가 있습니다.

단점 : C / C ++ / Fortran에서 언어 지원 부족

C ++ 14 / 17은 함수형 프로그래밍을 지원하는 강력한 기능을 추가했기 때문에 최소한 C ++에서는 이러한 단점이 사라지고 있습니다. 라이브러리 / 지원 코드를 직접 작성해야 할 수도 있지만 언어는 친구가 될 것입니다. C ++에서 불변 다차원 배열을 수행 라이브러리 : 예를 들어, 여기서 (경고 플러그)이다 https://github.com/jzrake/ndarray-v2를 .

또한 과학 응용 프로그램에 중점을 두지는 않지만 C ++의 함수형 프로그래밍에 대한 좋은 책 에 대한 링크가 있습니다.

내가 믿는 사람에 대한 나의 요약은 다음과 같습니다.

찬성 :

  • 단정
  • 이해
  • 공연

정확성 측면에서 , 기능성 프로그램은 명백하게 잘 구성 되어 있습니다. 물리적 변수의 최소 상태와 해당 상태를 시간 내에 앞으로 진행시키는 기능을 올바르게 정의하도록 강제합니다.

int main()
{
    auto state = initial_condition();

    while (should_continue(state))
    {
        state = advance(state);
        side_effects(state);
    }
    return 0;
}

부분 미분 방정식 (또는 ODE)을 풀면 기능 프로그래밍에 적합합니다. advance현재 솔루션에 순수한 함수 ( )를 적용 하여 다음 솔루션을 생성합니다.

내 경험상 물리 시뮬레이션 소프트웨어는 상태 관리 가 열악하여 부담이 큽니다 . 일반적으로 알고리즘의 각 단계는 공유 (효과적으로 전역적인) 상태의 일부에서 작동합니다. 이로 인해 올바른 순서로 작업을 수행하기가 어렵거나 불가능 해 지므로 소프트웨어가 세그먼트 오류로 나타날 수있는 버그 또는 코드를 충돌 시키지는 않지만 자동으로 과학의 무결성을 훼손하는 오류 조건에 취약 해집니다. 산출. 물리 시뮬레이션에서 공유 상태를 관리하려고 시도하면 멀티 스레딩도 막을 수 있습니다. 이는 수퍼 컴퓨터가 더 높은 코어 수로 이동하고 MPI를 통한 확장이 종종 ~ 100k 작업에서 최고가되기 때문에 미래의 문제입니다. 반대로, 함수형 프로그래밍은 불변성 때문에 공유 메모리 병렬 처리를 사소하게 만듭니다.

알고리즘의 지연 평가로 인해 함수형 프로그래밍에서도 성능 이 향상됩니다 (C ++에서는 컴파일 타임에 여러 유형을 생성 함-종종 함수의 각 애플리케이션마다 하나씩). 그러나 메모리 액세스 및 할당의 오버 헤드를 줄이고 가상 디스패치를 ​​제거함으로써 컴파일러는이를 구성하는 모든 함수 객체를 한 번에보고 전체 알고리즘을 최적화 할 수 있습니다. 실제로, CPU 대 메모리 할당의 사용을 최적화하기 위해 서로 다른 평가 지점의 배열 (알고리즘 결과가 메모리 버퍼에 캐시 됨)을 실험합니다. 모듈 또는 클래스 기반 코드에서 일반적으로 볼 수있는 것과 비교할 때 알고리즘 단계의 로컬 성이 높기 때문에 (아래 예 참조) 다소 쉽습니다.

기능적 프로그램은 물리 상태를 사소한 한 이해 하기 쉽습니다 . 모든 동료가 구문을 쉽게 이해할 수있는 것은 아닙니다! 저자는 잘 알려진 함수를 사용하도록주의를 기울여야하며, 일반적으로 연구원은 절차 적으로가 아니라 기능적으로 표현 된 알고리즘을 보는 데 익숙해 져야합니다. 제어 구조가 없다는 것은 일부 사람들에게 큰 영향을 줄 수는 없지만 컴퓨터에서 더 나은 품질의 과학을 수행 할 수있는 미래를 막을 수는 없다고 생각합니다.

다음은 패키지를 advance사용하여 유한 체적 코드에서 수정 된 샘플 함수 ndarray-v2입니다. to_shared연산자를 주목하십시오 -이것들은 내가 이전에 언급 한 평가 포인트입니다.

auto advance(const solution_state_t& state)
{
    auto dt = determine_time_step_size(state);
    auto du = state.u
    | divide(state.vertices | volume_from_vertices)
    | nd::map(recover_primitive)
    | extrapolate_boundary_on_axis(0)
    | nd::to_shared()
    | compute_intercell_flux(0)
    | nd::to_shared()
    | nd::difference_on_axis(0)
    | nd::multiply(-dt * mara::make_area(1.0));

    return solution_state_t {
        state.time + dt,
        state.iteration + 1,
        state.vertices,
        state.u + du | nd::to_shared() };
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.