으로 야 니스는 지적하지 않고 이전했다 언어로 상위 기능의 채택을 영향을 미친 요인은 여러 가지가있을 수 있습니다. 그가 가볍게 만지는 중요한 항목 중 하나는 멀티 코어 프로세서의 확산과 함께 더 많은 병렬 및 동시 처리에 대한 요구입니다.
기능 프로그래밍의 맵 / 필터 / 축소 스타일은 병렬 처리에 매우 친숙하므로 프로그래머가 명시 적 스레딩 코드를 작성하지 않고도 여러 코어를 쉽게 사용할 수 있습니다.
조르지오 (Giorgio)가 지적한 바와 같이, 함수형 프로그래밍은 고급 함수보다 더 많은 기능이있다. 함수, 맵 / 필터 / 감소 프로그래밍 패턴 및 불변성은 함수형 프로그래밍의 핵심입니다. 이러한 것들이 함께 있으면 병렬 및 동시 프로그래밍의 강력한 도구가 만들어집니다. 고맙게도 많은 언어는 이미 불변성의 개념을 지원하고 있으며, 그렇지 않은 경우에도 프로그래머는 불변으로 간주하여 라이브러리와 컴파일러가 비동기 또는 병렬 작업을 생성하고 관리 할 수 있습니다.
언어에 고차 함수를 추가하는 것은 동시 프로그래밍을 단순화하는 중요한 단계입니다.
최신 정보
Loki가 지적한 문제를 해결하기 위해 몇 가지 더 자세한 예를 추가하겠습니다.
위젯 콜렉션을 순회하여 새 위젯 가격 목록을 작성하는 다음 C # 코드를 고려하십시오.
List<float> widgetPrices;
float salesTax = RetrieveLocalSalesTax();
foreach( Widget w in widgets ) {
widgetPrices.Add( CalculateWidgetPrice( w, salesTax ) );
}
대규모 위젯 모음이나 계산 집약적 인 CalculateWidgetPrice (Widget) 메소드의 경우이 루프는 사용 가능한 코어를 잘 활용하지 못합니다. 다른 코어에서 가격 계산을 수행하려면 프로그래머가 스레드를 명시 적으로 작성 및 관리하고, 문제를 해결하고, 결과를 함께 수집해야합니다.
일단 고차 함수가 C #에 추가되면 해결책을 고려하십시오.
var widgetPrices = widgets.Select( w=> CalculateWidgetPrice( w, salesTax ) );
foreach 루프가 구현 방법을 숨기고 Select 메서드로 이동되었습니다. 프로그래머에게 남아있는 것은 각 요소에 적용 할 기능을 선택하도록 알려주는 것입니다. 이를 통해 Select 구현은 프로그래머의 개입없이 모든 동기화 및 스레드 관리 문제를 처리하면서 병렬로 계산을 실행할 수 있습니다.
그러나 물론 Select는 병렬로 작동하지 않습니다. 그것이 불변성이 생긴 곳입니다. Select 구현은 제공된 함수 (위의 CalculateWidgets)에 부작용이 없음을 알지 못합니다. 이 기능은 Select 및보기 동기화 외부에서 프로그램 상태를 변경하여 모든 것을 차단할 수 있습니다. 예를 들어,이 경우 salesTax의 값이 잘못 변경 될 수 있습니다. 순수 기능 언어는 불변성을 제공하므로 선택 (맵) 기능은 상태가 변경되지 않음을 확인할 수 있습니다.
C #은 Linq의 대안으로 PLINQ를 제공하여이를 해결합니다. 그것은 다음과 같습니다
var widgetPrices = widgets.AsParallel().Select(w => CalculateWidgetPrice( w, salesTax) );
어떤 코어를 명시 적으로 관리하지 않고도 시스템의 모든 코어를 최대한 활용할 수 있습니다.