주의 : 얕게 알아봅니다. 엄밀하지 않습니다. 뇌피셜이 많이 들어가 있습니다.
함수형 프로그래밍의 이론적 근간은 람다대수다.
람다 칼큘러스는 계산 모델
을 표현 하는 하나의 방법론이다.
튜링은 튜링머신과 튜링머신이 수행하는 절차적인 명령어들의 집합으로 계산이 무엇인지 정의 했다. 즉, 계산의 주체(튜링머신)를 explicit
하게 정의 했다.
처치는 계산을 특정 법칙들로 심볼들을 단계별로 변화 시켜 나가는 행위로 정의 했다. 이 관점에서 계산은 수행하는 행위의 주체는 implicit
하게 정의 된다.
하지만 두 방법 다 계산 문제
관점에서는 동일한 해를 제공할 수 있게 된다. 두 계산 모델은 동치다(Church-Turing Thesis).
람다 칼큘러스에서 f(x)=2x는 f=λx.2x로 표현 된다. f라는 심볼에 대응 되는 함수의 identity를 직접적으로 표현할 수 있게 되고, 그게 λx.2x가 된다.
f가 람다 대수로 표현 가능하다면, 그 함수는 계산가능성을 가지게 된다.
람다 대수로 표현 가능하다면, 해당 함수는 turing computable하다. 역도 성립 된다.
따라서, 러프하게는 기존의 명령형 프로그래밍으로 표현된 프로그램들 또한 함수형으로 표현 가능하다. 같은 계산의 다른 표현법이다.
함수형 프로그래밍은 declarative 하다.
람다 칼큘러스는 튜링머신 같은 계산의 주체를 명시적으로 표현하지 않았다. 즉, 계산가능한 함수가 무엇
인지 정의 하기 위해 고안 된 형식체계다.
따라서, 함수형 프로그래밍 또한 함수로 정의 되는 계산이 무엇
이냐에 대한 것이지 수행 주체가 실행 해야 할 절차(명령)에 대한 기술을 하지 않는다.
단순히 계산computation이 무엇
인지 그 함수적 표현 자체에만 집중하면 된다.
함수형 프로그래밍은 stateless하다.
튜링 머신은 stateful하다. 튜링머신에게 명령을 내리는 방법론에 기반한 프로그래밍 언어는 UTM 위에서 동작하는 튜링머신을 표현해야 하기 때문에 stateful하다.
반면, 함수형 프로그래밍은 stateless (해야만?) 하다. 왜냐하면, 함수형 프로그래밍의 근간이 되는 람다 칼큘러스 자체가 계산의 주체를 implicit하게 표현 했기 때문.
함수형 프로그래밍의 순수함수 개념도 이 람다 칼큘러스에서 정의된 계산 가능한 함수의 맥락 위에 존재 한다.
따라서 함수형 프로그래밍은 계산 주체의 상태에 대한 표현을 근본적으로 배제하게 된다.
OOP 또한 imperative한 프로그래밍이다.
절차적 + 함수와 관련 데이터를 묶어 놓음 + 묶어 놓은 객체들의 통신으로 프로그램을 구성
즉, 뿌리는 절차적 프로그래밍에 두고, 그걸 발전 시켜 함수를 메소드로 바꿔 클래스들의 집합으로 일종의 설계도를 만들고, 그 설계도를 RAM 위에 인스턴스 형식으로 올려 놓는 방법으로 프로그램을 만드는 방법론이기 때문.
이제 이상적인 서버를 가정해보자. 그리고 이 서버가 순수 함수들의 집합라고 가정해보자. 각 함수들은 상태를 가지지 않는다. 인풋에 대한 아웃풋만 출력하게 된다. 상태값을 가지지 않으므로 동시성 문제로부터 자유로울 수 있다.
멀티스레드 환경에서 stateful한 메모리 자원에 어떻게 프로그래밍 해야할지, race condition에 대해 고민할 필요 없이 여러 스트림을 열어 놓고 비동기적으로 처리하면 된다.
여기에 REST 아키텍쳐를 따라가면 서버 단에 상태는 존재하지 않게 된다. 데이터베이스나 외부 api에서 끌어 온 데이터를 함수적으로 처리해주는 프로그램이 될 뿐.
동시성 문제는 튜링머신을 근간으로 한 프로그래밍 언어의 성질로부터 비롯된다. 그렇다면 아예 근본부터 다른 방법론을 채택하면 어떨까? 람다 칼큘러스를 기반으로 한 함수형 프로그래밍으로 프로그램을 표현
한다면? 처음부터 racing condition문제를 최소화 할 수 있지 않을까?
다음에는 currying도 정리해보고, reative programming도 정리해보자..
[1] https://helloworld.kurly.com/blog/lambda-calculus-1/
[2] https://studyingeugene.github.io/functional-programming/introduction-to-lambda-calculus/