Erlang

Erlang List 변수 처리

메롱씨티 배드맨 2012. 3. 5. 11:57




Erlang을 들여다 본지가 그리 오래되진 않았지만, 짧은 기간동안 Erlang에 대해 소감?은 이렇다.


장점 : a. 프로세스 생성이 매우 간단하다.

         b. 통신 프로그램 생성이 매우 간단하다.

         c. 변수가 없기 때문에 프로세스간 충돌 및 메모리 덤프와 같은 치명적인 오류가 발생하지 않는다.

         d. 코딩량이 적다.


단점 : a. 변수가 존재하지 않아(공식적으로는 있지만, 사실상 상수이다.) 기존의 랭귀지 개념과 많은 차이가 있다. 

         b. 간단히 처리할 수 있는 문제도 rpc(remote processor call) 프로시져를 생성해야 하는 경우가 있다.

         c. String 처리에 취약하다.

         d. 버전별 호환성이 약하다.

         e. 참조할 수 있는 자료가 부족하다


참조 싸이트 :

     https://github.com/

     http://wiki.trapexit.org/

     http://www.erlang.org/



하여튼, Erlang 연구 기간내내 괴롭혔던 List 변수에 대해 어느 정도 성과가 있었다.

샘플로 만들어본 Chatting Server에선 한 Client에서 보낸 메세지를 연결된 다른 Client들 모두에게 전송해야 하고, 그러기 위해서는 연결된 Client들의 Accept socket을 리스트로 저정해야 한다.

 그런데 이 리스트형 변수가 말썽이다, 사실상의 변수가 존재하지 않기 때문에 기존 랭귀지적 개념으로 도저히 해결할 수 없는 문제에 부딪히게 된다.

 그래서 결국은 이 변수의 역할을 담당할 별도의 RPC 프로세서를 만들어야 한다.


전체적인 시스템 구성은 아래와 같다.




변수처리 RPC 프로세스 라고 명명한 저 부분이 다른 랭귀지에서는 변수로 처리할 수 있는 모듈이다.

즉, Erlang은 변수 처리를 위해 변수의 역할을 담당할 하나의 프로세스가 필요하다. 

( 병렬처리를 위해 병렬처리에서 문제가 되는 부분인 공유메모리 부분을 없애버렸더니, 이런 복잡한 과정이 필요하게 된 것 같다. )


Window 채팅 클라이언트는 C++(win32)로 심플하게 제작했다.

그리고 Telnet으로도 접속하여 테스트 할 수 있다.


Erlang Chat Server가 실제 채팅서버이고, Erlang 변수처리 RPC 프로세스가 리스트형 변수의 역할을 하는 모듈이다.


일단 이 리스트형 변수 RPC프로세스 소스를 보자,





( Erlang을 함수형 언어라고 표현하는데, 내가 보기엔 집합형 언어라고 표현하는데 더 맞을것 같다. )

위 소스에서 중요한 것은 함수들의 목록이다.
아래는 각 함수별 설명이다.

1. start 함수는 앞으로 데이터를 저장할 빈 리스트를 하나 생성하고 자신의 Pid를 kvs에 저장한다.
   ( 그래서 빈 리스트 생성이 끝나면 바로 '0' 값을 삭제해야 한다. )
2. setList 함수는 추가되는 데이터를 뒤에 추가하고 추가된 전체 리스트를 반환한다.
3. delList 함수는 리스트에서 해당 데이터를 삭제한다.
4. insList / delList / viewList 함수는 외부에서 기능을 호출하기 위한 I/F 역할을 하는 함수이다.
5. rpc 함수는 I/F함수에서 자기 자신에게 데이터 처리를 요청하는 말하자면 프로세스 recursive call 함수이다.
6. loop 함수는 사실상의 메인 함수로 프로세스를 계속 구동시키면서 list 데이터의 포인터를 상실하지 않도록 Loop를 돈다.
   그리고 rpc 함수에서 call 하는 명령들을 실행하는 함수이다.

몇줄 안되는 간단한 소스임에도 어지간한 개발자도 한눈에 파악하기 힘든게 Erlang이다.

이 프로그램은 다른 랭귀지에는 당연하게 제공되는 변수의 역할을 담당하는 프로세스다.
변수가 없다는게 얼마나 힘든건지, Erlang해보면 몸으로 느낄수 있다.

(사실 Erlang에 변수가 있지만, Erlang의 변수는 사실상의 상수이다.)




좌하단  - Erlang 채팅서버

상단    - win32로 만들어진 채팅 Application

우하단  - 윈도우 터미널 창에서 Telnet 으로 접근한 채팅


위와 같은 채팅 프로그램은 기본중에 기본인 프로그램이지만, Erlang에서는 기본이 아니더라...

중요한것은 좌하단 채팅서버의 로그에서 보듯이 연결된 Client 소켓을 리스트로 관리할 수 있다는 것이다.


여러가지 시행착오를 거쳤지만, 그중에서도 리스트 관리를 위해 C 로 개발한 외부 I/F를 끌어온것도 있다.

( 이 부분은 나중에 별도로 Post 함. )

채팅서버 자체는 Echo 루틴이나 별 다른게 없기 때문에 이 부분도 생략함.





P.S : Erlang과 관련된 자료가 매우 희귀하기에 이 자료는 Erlang 개발자에게 많은 도움이 되지 않을까 싶다..



'Erlang' 카테고리의 다른 글

Erlang Web Server V0.1  (0) 2012.04.12
Erlang List 변수 처리-로직 변경  (0) 2012.04.09
Erlang 리스트에서 검색값 가져오기  (0) 2012.04.04
Erlang Parsing  (0) 2012.04.04
[Erlang] Server/Client  (0) 2012.02.06