프로그래밍 언어 공부에 관심이 있다면, 그리고 지난 10년간 동굴속에서 The C++ Programming

Language 책 한권만 갖고 들어가 면벽수련을 하고 방금 나온 것이 아니라면 아마도 함수형 언어

프로그래밍에 대해 들어본 적이 있었을 것이다. 근래 발표되고 있는 언어들 치고 함수형 언어의

영향을 받지 않은 언어가 드물정도다. 도대체 함수형 언어가 뭐고, 왜 중요한지, 왜 필요한지 생각

해보는 시간을 가져보도록 하자.


프로그래밍 언어를 나누는 방법에는 여러가지가 있지만 그중 한가지 방법이 함수형 언어냐 명령형

언어냐라는 구분이다. 함수형 언어는 Functional Language라고 하고 명령형 언어는 Imperative

Language 라고 한다. 우리가 흔히 써온 베이직, 파스칼, C, C++ 등은 모두 Imperative 즉 명령형

언어에 속한다. 명령형 언어가 하는 일은 언어의 문장에 써진 차례대로 특정한 동작을 수행하는 것

- 예를 들면 화면에 문자를 찍는다던가, 디스크에서 파일을 읽어온다던가, 그림을 화면 어디에

표시한다던가 하는 - 에 촛점이 맞춰져 있다. 그에 비해 함수형 언어는 함수의 수학적인 원리에

의거하여 어떤 입력 값을 다른 형태의 입력 값으로 변환시키는 것에 촛점이 맞춰져 있다.


함수형 언어로 잘 알려져 있는 것은 리스프를 비롯하여, ML, OCaml, Haskell 등이 사용되어 왔고

근래에는 Erlang, F#, clojure 등이 새로운 강자로 부상하고 있다.


그럼 가장 중요한 질문인 '왜 함수형 언어가 유용한가?' 라고 질문 한다면, 무어라고 답해야 할까?

거기엔 몇가지 이유가 있는데 MMORPG서버 프로그래머의 입장에서 가장 중요한 딱 한가지만 대답한다면

                  

                       - 함수형 언어는 동시성 (Concurrency) 의 문제를 해결하는데 효과적 -



이기 때문이라고 대답할 것이다. 알다시피 CPU클럭속도의 성장은 몇년전부터 정체되어 왔고, 성능

증가의 수요에 대응하기 위해 cpu 제조사들은 클럭속도 증가의 대안으로 CPU core 를 증가하고 있다

오늘날 웬만한 가정용 컴퓨터들 조차 2-4 개의 코어를 내장한 것이 일반적이며 서버용 머신의 코어는

32 개 이상인 것들도 있다. 물론 그것으로 그치지 않고 대규모 서비스를 제공하는 센터에서는 여러대의

서버가 협력하여 한가지의 일을 나눠서 하는 것이 보통이다.

하나의 프로세스가 여러개의 코어 혹은 여러대의 머신을 활용해서 어떤 작업을 하기 위해서는 코어간의

조화를 이루도록 하는 일이 무엇보다 중요한 문제다. 이것을 동시성 (Concurrency) 의 문제라고 한다.

동시성의 문제는 크게 2가지인데, 하나는 복수개의 프로세스가 하나의 자원에 접근하는 순서가 꼬여서

발생하는 Race Condition 문제이고, 또 하나는 Race Condition 을 막기 위해 배치하는 Lock 의 순서가

꼬여서 발생하는 Dead Lock 문제이다.

보통의 명령형 언어로 만든 프로그램에서는 동시성 문제를 해결하기 위해 운영체계 단에서 제공하는

Lock 을 이용하게 되는데 (크리티컬 섹션, 뮤텍스, 세마포어 등) 락이 누락되거나 꼬일 수 있는 경우의

수가 워낙 복잡하다 보니까 프로그래밍의 난이도가 엄청나게 올라가게 된다. 간단하게 해결하려면

최대한 안전지향형으로 여기저기 락을 많이 배치하고, 락을 획득할 때 데드락이 걸리지 않도록 최대한

한번에 많이씩 락을 통째로 걸면 되는데 그렇게 만든 프로그램은 cpu의 시간을 대부분 락이 풀리기

기다리느라 잡아먹게 되기 때문에 차라리 싱글 코어용으로 만든 프로그램만도 못한 성능을 내기 쉽다.


그렇다면 이 문제를 해결해야 하는가? 애초부터 락을 걸 필요가 없게 만드는 것이 가장 좋은 방법이다.

락을 거는 이유는 두개 이상의 프로세스가 하나의 공유된 변수에 접근하게 되기 때문인데, 애초부터

변수란 것이 존재하지 않는다면 락이 존재할 필요가 없을 것이다. 변수가 존재하지 않거나 매우 제한적

인 형태로만 존재하는 프로그래밍 방식이 바로 함수형 프로그래밍의 방식이다.


뭐? 프로그램을 짜는데 변수의 개념이 없다고?  아마 많은 사람들이 이렇게 생각할 것이다.

변수가 없으면 1부터 100까지 더하는 간단한 프로그램을 짜는 것만 해도 루프를 어떻게 돌릴 것이며,

게임을 만들었다고 하면 내 캐릭터의 좌표라던가 체력같은 정보는 어떻게 저장하고 읽어오고 출력한단

말인가? 물론 방법이 있으니까 함수형 언어들이 언어로서 존재하는 것이며, 실제로 이 방법으로 만든

프로그램들은 멀티코어 환경에서 락에 의존하지 않고서도 안정적으로 제 성능을 발휘한다.


다음 글에서는 erlang 과 clojure 등의 함수형 언어에서 제공하는 프로그래밍 방법의 기본에 대해

알아보도록 하자.

imcgames 의 김학규입니다