Erlang 배우기
최근 루비 커뮤니티의 여러 사람들이 얼랭을 배우고 있고, 또 어떤 분은 책까지 번역했다. 그동안 나는 게으름을 무기로 이런 사태를 짐짓 모른 체하고 있었지만, 결국 지난 주부터 얼랭을 배워보기로 하고 기초부터 조금씩 익히고 있는 중이다.
생각보다 매우 오래 전인 1983년에 처음 만들어졌다고 하는 얼랭에 대한 첫 느낌은 깔끔하다는 것이다. 역시 많은 루비스트들이 좋아라 할 만 하다. 더구나 함수형 언어를 처음 배우는 나로서는 새롭게 익히는 개념들이 상당히 재미있기도 하다.
아직 한참 배우는 과정에 있지만 그 동안 배운 내용을 블로그에 정리해볼까 한다.
얼랭은 함수형 언어다.
예전에 프로그래밍을 처음 배울 때, 가장 이해하기 힘든 것 중에 하나가 바로
X=X+1 이라는 표현이었다. 어떻게 X 하고 X+1이 같을 수가 있단 말인가? 하지만 = 을 '같다'가 아닌 '값을 바꾼다' 의 의미로 이해하면서 이 표현은 이제 우리에게 너무나 자연스러운 표현이다.
하지만 얼랭을 배울 때는 애써 익혔던 이 개념을 다시 잊어버리고 원래의 순수했던 수학의 개념으로 돌아가야한다. 얼랭에서 =는 '같다' 혹은 '패턴 매칭'을 의미하기 때문이다.
얼랭에서는 변수에 값을 최초에 딱 한 번만 할당할 수가 있고, 그 이후로 값을 바꾸는 것은 허용되지 않는다. 따라서 Y=X+1은 되지만 X=X+1 은 안된다.
참고로, 최초에 X에 값이 아직 지정되지 않은 상태에서 X = 1 이라고 하면, 얼랭은 양쪽을 같게 만들기 위해서 값이 미정인 X의 값을 1로 바꾼다.
지금 프로그래밍 책이 아니라 수학 책을 보고 있다고 가정해보자.
X=1
Y=X+1
라고 나와 있다면, X의 값이 1 Y의 값은 2라고 해석하는 것이 자연스럽다.
하지만, X=X+2 라고 하는 표현은 수학책에 나올리가 없다.
얼랭의 이러한 해병대 원칙은 모든 상황을 항상 동일하게 유지하는 효과가 있다. 따라서 얼랭의 함수들은 동일 입력에 대해서 항상 동일한 결과를 돌려주게 되는 아주 '순수한' 함수가 된다.
얼랭은 객체지향 언어가 아니라 함수형 언어이므로 프로그램의 기본 단위는 당연히 함수이다. 그리고 여러 함수들은 하나의 '모듈'로 묶을 수 있다. .
얼랭은 병렬 처리 언어다.
얼랭은 애초에 에릭슨에서 통신 장비등에 사용하기 위해서 만든 언어로 효율적인 병렬 처리를 주요 목표의 하나로 가지고 있는 언어이다.
얼랭은 언어 자체적으로 지원하는 '프로세스'를 매우 효율적이로 안정적으로 수행시킬 수 있다. 이러한 '프로세스'는 어떤한 메모리도 공유하지 않으며 'message passing'을 통해서 서로 통신하는데 '프로세스'간에 메세지를 주고 받는 방법은 상당히 쉽고 직관적으로 할 수 있다.
얼랭의 각 프로세스는 자신에게 수신된 메시지들을 처리할 때, 패턴매칭을 사용한다. 따라서 메시지 처리 함수는 메시지의 패턴에 따라 수행할 동작들을 정의하는 방식으로 구현된다.
얼랭에서는 각 '프로세스'가 다른 프로세스에 연결될 수 있다. 이렇게 연결된 프로스세가 죽게되면 그 signal이 연결된 다른 프로세스에게 전달되어 그 프로세스도 죽게된다. 이 것이 기본적인 얼랭의 오류 처리 방식이다. (물론 연결된 프로세스가 죽지않도록 별도의 시그널 핸들러를 구현할 수도 있다.)
얼랭과 패턴 매칭
위에서도 잠시 나왔지만 얼랭에서 패턴매칭은 매우 중요한 개념이다. 그런데 잠깐, 많은 사람들은 패턴매칭이라고 할 때 문자열의 패턴 매칭을 떠올리겠지만, 얼랭의 패턴매칭은 문자열의 패턴매칭은 아니다. 얼랭의 패턴매칭은 입력 값 혹은 입력 구조체의 형태에 대한 패턴 매칭이다.
얼랭의 대표적인 두가지 구조체는 Tuple과 List 이다. Tuple은
{1, { car, 7}} 와 같은 형태이고, List는 [1,2,3, car, person] 와 같은 형태이다.
여기서 또 한 번 잠깐, 위에서 abc라고 쓴 것은 무엇을 의미할까? 다른 언어에서라면 이것은 당연히 하나의 변수이겠지만, 얼랭에서는 알파벳 소문자로 시작하는 이런 문자열은 Atom이라고 불리워지며, 단순히 어떤 의미를 표현하기 위해서 사용되는 하나의 상수 심볼로 미리 정의하지 않고 언제 사용할 수 있다. (루비에서 :car, :person과 같다.)
소문자로 시작하는 것이 변수가 아니므로, 변수는 당연히 대문자로 시작한다. X, Name 과 같은 것이 얼랭에서는 변수이다.
예를 들어, {1, {car, 7}} 은 {X, {car, 7}} 과 패턴이 매칭된다. 그런데 이 때 패턴 매칭을 하고 나면, X에는 1이 할당된다.
이와 같은 패턴 매칭은 얼랭에서 함수 호출시의 입력 파라미터 전달 및 프로세스가 메시지 전달시의 파라미터 전달에 사용된다.
함수 호출의 경우, hello({X, {car, Z}}) 와 같이 정의된 함수가 있고, hello({1, {car, 7}}) 라고 호출이 되었다면, hello 함수 내에서 X=1, Z=7로 사용될 것이다.
또 메시지 전달의 경우에는, 메시지 수신 부분은 아래와 같이 구현되어서 각 입력의 패턴에 따라서 그에 대한 처리 함수가 호출 되게 된다.
receive
{X, {car, Z}} ->
do_something(X,Y);
{person, Age} ->
do_otherthing(Age)
end.
여기까지 얼랭의 주요한 특징과 개념에 대해서 살펴보았다. 다음에는 실제 얼랭으로 간단한 프로그램을 만들어보는 것에 대해서 정리하도록 하겠다.
Comments
-
(ikspres) 저도 배우고 싶다는 생각만 가지고 있고 실천하지 못하구 있는데요. 이참에 저도 묻어서 배워봐야겠습니다.^^ by chang
-
저도 요즘 공부중인데 무척 재밌어요! ㅎㅎ
-
(ikspres) 앗! 드뎌 얼랭까지.. 조만간 얼랭 사용자 모임 하나 만들어야 할 것 같군요.^^ 다음 번 연재도 기대하겠습니다. by thinkr
-
We have been an ebay power seller and paypal confirmed seller of <a href=http://www.wowgoldprice.org>wow gold</a> for years.We also offer cheap <a href=http://www.wowgoldprice.com>wow gold</a>. by wow gold
-
We have been an ebay power seller and paypal confirmed seller of <a href=http://www.wowgoldprice.org>wow gold</a> for years.We also offer cheap <a href=http://www.wowgoldprice.com>wow gold</a>. by wow gold