개발/Developing
함수형 프로그래밍과 멀티 코어
lazykuna
2022. 3. 17. 15:23
함수형 프로그래밍의 특성
- 불변성 (immutable) : 값을 바꿀 수 없음
- 객체 지향 언어에서는 꽤 치명적인 요소이다. 으레 쓰이는 {구조체}.{메서드} 는 (보통은) mutable한 행위이고, 함수형 프로그래밍에서는 용납되지 못한다.
- 기존 상태를 바꾸지 않는다는 점은 멀티코어 프로그래밍에 있어 강력한 이점으로 작용한다.
- 선언형 : 행위 그 자체에 주목한다.
- 가장 대표적인 함수가
.map, .filter, .apply
가 될 것이다. 한 번이라도 써 보면 금방 이해할 수 있음!
- 가장 대표적인 함수가
- 순수함수 (stateless) : 상태가 없어서 입력이 같으면 항상 같은 값을 리턴한다.
- 이것도 사실은 immutable로 인해 생기는 파생현상
- 고차함수 : 함수를 인자로서 전달할 수 있어야 함. (lambda 같은 느낌?)
멀티스레딩이랑 무슨 상관이지?
멀티스레딩 도중 발생하는 문제는 대부분 값을 동시에 바꾸려고 하거나, 혹은 lock 관련 문제(deadlock, hang 등)가 대부분이다.
이를 해결하기 위해 추가적인 구조물(synchronized, monitor ...)을 만들곤 했지만, 그래도 본질은 lock 기반이기 때문에 잠재적인 문제는 여전히 남아 있었다.
함수형 프로그래밍이 가진 특징 불변성은 이런 문제를 근본적으로 해결할 수 있다는 점에서 높게살 수 있다.
함수형 프로그래밍의 현재
함수형 프로그래밍을 기반으로 한 언어들이 계속 생겨나고 있고,
- 이 중 근래 가장 성공적인 것으로 Rust를 꼽을 수 있을 것 같다. 개인적으로 가장 체감되는 모습은 변수의 불변성과 선언형 구조가 아닐까 싶음
가장 보수적인 언어들에서도 함수형 프로그래밍이 도입되고 있는 모습이 보여지고 있다.
- javascript는 거의 마개조 되다시피 한것 같다. typescript으로 환골탈태한것으로 모자라서 fp-ts 같이 함수형 프로그래밍까지 도입 완료...
- C++ 에서도 lambda와 capture 등의 기능이 제공되고는 있지만, 아직은 선언형 프로그래밍을 쓰기에는 어려워 보인다.
변화를 받아들일 시점
여러분이 경험이 있는 프로그래머라면 이런 궁금증이 생길 수 있습니다. "나는 오랫동안 카테고리 이론이나 함수형 메소드에 대해 고민하지 않고 개발해왔는데 뭐가 더 좋아지는거지?" 물론 도움이 안 될 수도 있지만 새로운 함수형 기능들이 명령형 언어를 침범하는 꾸준한 흐름이 있습니다. 심지어 객체 지향 프로그래밍의 최후의 보루인 자바에서도 최근에 C++의 람다가 제정신이 아닌 속도로 발전하고 있습니다. 빠르게 바뀌는 세상을 따라잡으세요. 이 모든 활동들은 파괴적인 변화에 대한 준비라고 생각합니다. 물리학자들이 사용하는 용어로는 상전이(Phase Transition)라고 합니다. 물에 꾸준히 열이 가해진다면 결국에는 끓을 것입니다. 우리는 지금 수온이 올라가고 있는 물에서 계속 헤엄칠지 아니면 다른 대안을 찾을지를 결정하는 중인 개구리와 같습니다.
참조
- https://atin.tistory.com/552
- https://github.com/pilgwon/CategoryTheory - 프로그래머를 위한 카테고리 이론