저는 주로 C / C ++ 프로그래머입니다. 이는 대부분의 경험이 절차 및 객체 지향 패러다임에 관한 것임을 의미합니다. 그러나 많은 C ++ 프로그래머가 알고 있듯이 C ++은 수년에 걸쳐 기능적 스타일로 강조되어 마침내 C ++ 0x에서 람다와 클로저를 추가하는 중입니다.
그럼에도 불구하고 C ++을 사용하여 기능적 스타일로 코딩하는 데 상당한 경험이 있지만 Lisp, Haskell 등과 같은 실제 기능 언어에 대한 경험은 거의 없습니다.
순전히 기능적인 언어에서 "부작용 없음"이라는 아이디어가 특히 동시성 및 분산 컴퓨팅에 대한 응용 프로그램과 관련하여 항상 흥미를 끌기 때문에 최근에 이러한 언어를 연구하기 시작했습니다.
그러나 C ++ 배경에서 비롯된이 "부작용 없음"철학이 비동기식 프로그래밍에서 어떻게 작동하는지에 대해서는 혼란스러워합니다. 비동기 프로그래밍이란 비동기식으로 발생하는 이벤트를 처리하기 위해 사용자가 제공 한 이벤트 핸들러를 전달하는 모든 프레임 워크 / API / 코딩 스타일을 의미합니다 (프로그램 흐름 외부). 여기에는 Boost.ASIO와 같은 비동기 라이브러리 또는 일반 C 신호 처리기 또는 Java GUI 이벤트 처리기
이들 모두 공통점은 비동기 프로그래밍의 특성상 프로그램 의 주요 흐름이 비동기 이벤트 핸들러가 호출되었음을 인식하기 위해 부작용 (상태)을 작성 해야하는 것 같습니다 . 일반적으로 Boost.ASIO와 같은 프레임 워크에서 이벤트 핸들러 는 객체의 상태를 변경 하여 이벤트 의 효과가 이벤트 핸들러 함수의 수명을 넘어 전파되도록합니다. 실제로 이벤트 핸들러는 무엇을 할 수 있습니까? 호출 지점이 없기 때문에 호출 지점으로 값을 "반환"할 수 없습니다. 이벤트 핸들러는 프로그램의 주요 흐름의 일부가 아니므로 실제 프로그램에 영향을 줄 수있는 유일한 방법은 일부 상태 (또는 longjmp
다른 실행 지점) 를 변경하는 것 입니다.
따라서 비동기 프로그래밍은 부작용을 비동기 적으로 생성하는 것입니다. 이것은 함수형 프로그래밍의 목표와 완전히 상충되는 것 같습니다. 이 두 패러다임은 어떻게 실용 언어로 화해합니까?