.
함수형 프로그래밍이 주목받는 배경과 장점에 대해서 Refreence [1][2]를 참조해서 요약을 해보았습니다.
배경
무어의 법칙이 깨지고 멀티코어 CPU의 등장
* 컴퓨터에서 사용하는 반도체 회로 성능은 대략 18개월마다 2배로 빨라진다는 법칙
* 2000년대 중반부터 법칙이 깨짐
* 물리적인 한계에 부딪힌 CPU 회사들은 여러 개의 칩이 병렬적으로 동작을 하도록 만드는 수평적 전략을 채택
프로그래밍 환경의 변화
* 단일코어 환경 : “멀티쓰레딩” 코드는 여러 개의 쓰레드가 하나의 CPU를 가장 효율적인 방식으로 공유하도록 만드는데 초점을 기울임
* 멀티코어 환경 : “멀티쓰레드” 코드는 이제 어플리케이션이 동작하는 동안 놀고 있는 CPU가 없도록 만드는데 초점을 기울임
동시성 코드 작성의 어려움
* 브라이언 괴츠의 Java Concurrency in Practice
* 현대의 프로그래머들에게 동시성 코드를 작성하는 것이 왜 어려운지, 어느 정도로 어려운지, 알려줌
* 잠금(lock), 세마포(semaphore) 같은 동시성 프로그래밍의 어셈블리 언어를 사용하는 상황을 피해야 하는지 잘 보여주었다.
명령형(imperative), 객체 지향적 언어에서 동시성 코드 작성이 어려운 이유
* 객체 상태나 데이터 값이 기본적으로 변경 가능(mutable)
* 여러 쓰레드에서 공유하는 데이터가 변경 가능하다는 점
함수형 프로그래밍
* 모든 데이터가 기본적으로 변수가 아니라 상수
* 값이 변경 불가능(immutable)
* 값이 변경되지 않는 상수는 많은 쓰레드가 동시에 접근하더라도 동시성과 관련된 문제를 야기하지 않음
* 잠금(lock)을 통해서 보호될 필요도 없고, CPU의 레지스터에 저장되는 캐시 값과 관련된 가시성(visibility) 문제를 일으키지도 않음
* 동시성 프로그래밍의 문제를 멀티쓰레딩 구조물을 통해서 해결하는 것이 아닌 구조물의 필요성 자체를 제거하는 방식
"모든 대입문의 사용을 포기해라! 그러면 놀라운 동시성의 세계로 들어갈 수 있다."
의심할 여지없이, 만약 메모리의 어떤 위치에 맨 처음 한번만 값을 할당하고 프로그램이 실행되는 동안 이 값을 변경하지 않는다면, 131072개의 프로세서들이 서로 먼저 이 메모리 값을 사용하려고 한다 할지라도 우리는 더이상 신경쓸 필요가 없다.
이전에는 두 개 이상의 프로세스가 동시에 하나의 메모리 값을 변경하는 경우를 방지하기 위해서 세마포어(semaphores)라는 기술을 사용해야만 했지만, 이제는 그럴 필요가 없다. 왜냐하면, 이제는 더 이상 메모리 값이 변경되는 일이 발생하지 않기 때문이다.
- 로버트 마틴[2] -
참조 투명성
* 정의를 가지고 있는 문장의 어디에서나 동일한 단어라면 그 단어를 서로 맞바꾸어 놓아도 그 문장이 가지고 있는 원래 의미가 절대 변하지 않는 것을 의미
코드의 간결함
* 반드시 필요한 논리와 추상을 추려내서 우아하게 표현
* 디자인 패턴 등의 비본질적인 코드를 제외
* 비본직절인 코드 : 하일스버그는 세레모니(ceremony)라고 표현
Reference
[1] 씨넷코리아, 함수형 프로그래밍이 주목 받는 3가지 이유 (http://www.cnet.co.kr/view/6472)
[2] 함수형 프로그래밍(Functional Programming) 기초 (http://kwangshin.pe.kr/blog/2013/01/21/%EB%B2%88%EC%97%AD-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8Dfunctional-programming-%EA%B8%B0%EC%B4%88/)
'Devlopment > 정리 글' 카테고리의 다른 글
AWS re:Invent 2019 12월 2일 키노트 요약 (0) | 2019.12.05 |
---|---|
Java9 특징 (0) | 2016.12.12 |
DDD와 JPA에 대해서 알아야 하는 이유 (0) | 2016.06.24 |
적정 스레드 수 (0) | 2013.05.20 |
Qt(Qt Development Frameworks)란 무엇인가? (0) | 2012.04.16 |
정규식 예제 (0) | 2012.03.29 |
Java에서 JNI를 써서 핑 프로그램을 구현하는 이유 (0) | 2012.01.30 |
버전 관리 & 이슈 관리 시스템 (0) | 2011.06.07 |
C와 Java의 컴파일 과정 (1) | 2011.05.27 |
난수 발생기 (2) | 2010.06.23 |