맨위로가기

얼랭

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

얼랭(Erlang)은 통신 애플리케이션 개발을 개선하기 위해 설계된 함수형 프로그래밍 언어이다. 1980년대 에릭슨에서 개발되었으며, 병행성 및 분산 처리를 지원하는 것이 특징이다. 얼랭은 가상 머신(BEAM) 위에서 실행되며, 경량 프로세스를 통해 다수의 프로세스를 효율적으로 관리한다. "Let it crash" 철학을 기반으로 시스템 안정성을 유지하며, 핫 코드 로딩을 통해 시스템 중단 없이 코드 수정 및 배포가 가능하다. 통신 분야 외에도 핀테크, 게임, 헬스케어 등 다양한 분야에서 활용되며, 왓츠앱, 닌텐도 등에서 사용되고 있다. 얼랭은 OTP 라이브러리 컬렉션과 함께 오픈 소스로 배포되며, 에릭슨을 포함한 여러 기업에서 상업적으로 지원하고 있다.

더 읽어볼만한 페이지

  • 얼랭 - 카우치DB
    카우치DB는 아파치 재단에서 관리하는 NoSQL 데이터베이스로, JSON 문서 저장, HTTP API 접근, 데이터 복제 및 동기화, 분산 환경 지원, 오프라인 작동 등의 특징을 가진다.
  • 얼랭 - RabbitMQ
    RabbitMQ는 분산 시스템에서 애플리케이션 간 비동기 메시지 전송을 지원하는 오픈 소스 메시지 브로커 시스템으로, AMQP 기반의 다양한 프로토콜과 프로그래밍 언어를 지원하며, 플러그인과 웹 기반 관리 인터페이스를 통해 기능을 확장하고 서버를 관리한다.
  • 1986년 개발된 프로그래밍 언어 - 오브젝티브-C
    오브젝티브-C는 C 언어를 기반으로 스몰토크의 객체 지향 기능을 결합하여 개발된 프로그래밍 언어이며, 애플의 macOS와 iOS 개발 환경에서 핵심 언어로 사용되었다.
  • 1986년 개발된 프로그래밍 언어 - 오베론 (프로그래밍 언어)
    오베론은 니클라우스 비르트가 설계한 프로그래밍 언어로, 단순성을 추구하며 라이브러리 개념을 강조하고 엄격한 타입 검사 등으로 안정성을 높였으며, 후속 버전에서는 객체 지향 프로그래밍 기능이 추가되었다.
  • 에릭슨 - ST-에릭슨
    ST-에릭슨은 ST마이크로일렉트로닉스와 에릭슨의 합작 무선 통신 반도체 회사로 2009년 설립되었으나 경영 악화로 2013년 해체되었다.
  • 에릭슨 - 에릭슨 (기업)
    에릭슨은 1876년 설립된 스웨덴의 통신 장비 및 서비스 제공업체로서, 이동전화 사업을 주도하며 세계 최대의 이동통신 장비 시장 점유율을 차지하고, 네트워크, 디지털 서비스, 매니지드 서비스 사업을 운영한다.
얼랭 - [IT 관련 정보]에 관한 문서
기본 정보
Erlang 로고
Erlang 로고
패러다임다중 패러다임: 병행, 함수형, 객체 지향
설계자조 암스트롱
로버트 버딩
마이크 윌리엄스
개발자에릭슨
발표1986년
최신 버전27.0.1
최신 버전 발표일2024년 7월 10일
타이핑동적, 강한
구현체erl
파일 확장자.erl, .hrl
라이선스아파치 라이선스 2.0
웹사이트Erlang 공식 웹사이트
영향 관계
영향을 받은 언어Lisp, PLEX, Prolog, Smalltalk
영향을 준 언어Akka, Clojure, Dart, Elixir, F#, Opa, Oz, Reia, Rust, Scala, Go

2. 역사

Erlang은 1980년대 에릭슨에서 통신 시스템 개발을 위해 만들어졌다.[12] 초기 버전은 프롤로그로 구현되었고, 이전 에릭슨 교환기에서 사용된 프로그래밍 언어 PLEX의 영향을 받았다. 1988년까지 Erlang은 전화 교환기 프로토타입 제작에 적합하다는 것이 증명되었지만, 프롤로그 인터프리터는 너무 느려 에릭슨은 실제 사용을 위해서는 40배 더 빨라야 한다고 추정했다. 1992년, Erlang을 C로 컴파일하는 BEAM 가상 머신(VM) 작업이 시작되었다.[13] 공동 발명가인 조 암스트롱(Joe Armstrong)에 따르면, 1995년 차세대 AXE 전화 교환기인 ''AXE-N''의 붕괴 이후 Erlang은 실제 애플리케이션으로 발전했으며, 그 결과 차세대 비동기 전송 모드 (ATM) 교환기 ''AXD''에 채택되었다.[7]

로버트 버딩과 조 암스트롱, 2013


1998년 2월, 에릭슨 라디오 시스템즈는 비독점 언어를 선호한다는 이유로 신제품에 Erlang 사용을 금지했다.[14] 이로 인해 암스트롱을 비롯한 개발자들은 에릭슨을 떠날 계획을 세웠으나,[16] 같은 해 3월, 에릭슨은 100만 줄 이상의 Erlang 코드를 포함하고 가용성이 9 "9"s를 달성한 AXD301 스위치를 발표했다.[15] 1998년 12월, Erlang은 오픈 소스로 공개되었고, 대부분의 Erlang 팀은 사임하여 Bluetail AB를 설립했다.[7] 에릭슨은 결국 금지를 완화하고 2004년에 암스트롱을 다시 고용했다.[16]

에릭슨은 1998년 특정 벤더에 대한 의존성을 줄이고 언어에 대한 인지도를 높이기 위해 얼랭을 자유-오픈 소스 소프트웨어로 출시했다. 얼랭은 라이브러리, 실시간 분산 데이터베이스 므네시아와 함께 OTP 라이브러리 컬렉션을 형성하며, 에릭슨과 몇몇 다른 회사들이 얼랭을 상업적으로 지원하고 있다.

오픈 소스 출시 이후, 얼랭은 노텔과 도이치 텔레콤을 포함한 전 세계 여러 회사에서 사용되었다.[37] 얼랭은 특정 분야를 채우도록 설계되었고 대부분의 기간 동안 잘 알려지지 않은 언어로 남아 있었지만, 동시 서비스에 대한 수요로 인해 인기가 높아지고 있다.[38][39] 얼랭은 대규모 다중 사용자 온라인 롤플레잉 게임 (MMORPG) 서버 구축에도 일부 사용되고 있다.[40]

2006년, 네이티브 대칭형 멀티 프로세싱 지원이 런타임 시스템 및 VM에 추가되었다.[7]

2. 1. 작명

"Erlang"이라는 이름은 덴마크의 수학자이자 기술자인 아그너 크라루프 에를랑의 이름과 "Ericsson Language"의 음절 약어에서 유래되었다.[7][10][11] 당시 에릭슨 컴퓨터 과학 연구소 소장이었던 비야르네 데커(Bjarne Däcker)에 따르면, 이러한 이름의 이중성은 의도적인 것이었다고 한다. Erlangda수학자 아그너 크라루프 에를랑의 이름을 따서 명명되었다. 한편, 에릭슨 사내에서 매우 많이 사용되었기 때문에 "Ericsson language영어" (에릭슨 언어)에서 유래되었다고 생각하는 사람들도 있다.

3. 특징

얼랭은 함수형 프로그래밍 언어이며, 선행 평가, 단일 할당, 동적 타이핑을 사용한다.

에릭슨에 의해 다음과 같은 특징을 갖도록 설계되었다.



얼랭은 원래 에릭슨 사내에서만 사용되는 비공개 기술이었으나, 1998년에 오픈 소스로 공개되었다. 에릭슨의 얼랭 구현은 기본적으로 인터프리터이지만, HiPE라는 컴파일러도 포함되어 있다. 단, HiPE는 얼랭이 동작하는 모든 플랫폼에서 사용할 수 있는 것은 아니다.

얼랭에서는 멀티스레드 처리의 병렬성이 프로그래머에게 명확하게 드러난다. 이는 대부분의 프로그래밍 언어에서 멀티스레드가 복잡하고 오류를 발생시키기 쉬운 것과는 대조적이다. 얼랭에서 "프로세스"(스레드)를 생성하고 관리하는 방법은 매우 일반적이다.

```erlang

[ X || X <- Rest, X < Pivot]

```

위 코드는 "Rest의 원소이고, Pivot보다 작은 모든 X를 선택하라"는 의미이다. 이러한 리스트 컴프리헨션을 응용하면 코드를 간결하면서도 강력하게 짤 수 있다.

얼랭에서는 아래의 규칙을 벗어나게 프로그래밍하는 것을 권장하지 않는다.

  • 요소는 항상 리스트의 헤드(앞)에 추가한다.
  • 순서가 문제가 되는 경우 `lists:reverse/1`을 호출한다. 이것은 매우 최적화되어있다.


따라서, `List ++ [H]`와 같은 코드는 권장되지 않는다.

3. 1. 함수형 프로그래밍

얼랭은 함수형 프로그래밍 언어이며, 선행 평가를 수행하고, 변수에 대한 할당은 한 번만 가능하며, 동적 타이핑을 사용한다.[24]

얼랭은 다음과 같은 특징을 가진 시스템을 구축하기 위해 설계되었다.[24]

얼랭은 원래 에릭슨 사내에서만 사용되었으나, 1998년에 오픈 소스로 공개되었다. 기본적으로 인터프리터 방식으로 동작하지만, HiPE라는 컴파일러도 제공된다. 하지만 HiPE는 모든 플랫폼에서 사용할 수 있는 것은 아니다.[24]

얼랭에서는 멀티스레드 처리의 병렬성이 프로그래머에게 명확하게 드러난다. 이는 대부분의 프로그래밍 언어에서 멀티스레드가 복잡하고 오류를 발생시키기 쉬운 것과 대조적이다. 얼랭에서 "프로세스"(스레드)를 생성하고 관리하는 것은 매우 일반적인 방법이다.[24]

얼랭에서는 서로 다른 두 데이터 타입 값 사이에서 모든 논리식을 평가할 수 있으므로, 식의 평가는 단순하다. 예를 들어, `1 < a`는 `true`를 반환한다. 하지만 얼랭에서의 반환 값 (`true` 또는 `false`)을 반환하는 기본적인 구조를 변경해야 할 경우, 비교 함수를 사용할 수 있다. 예를 들어, `a < 1`이 `true`로 평가되는 비교 순서에 따라 정렬된 리스트가 필요한 경우 등이다.[24]

```erlang

[ X || X <- Rest, X < Pivot]

```

위 코드는 "Rest의 원소이고, Pivot보다 작은 모든 X를 선택하라"는 의미이다. 이러한 리스트 컴프리헨션을 응용하면 코드를 간결하면서도 강력하게 짤 수 있다.[24]

Erlang에서는 아래의 규칙을 벗어나게 프로그래밍 하는 것을 권장하지 않는다.[24]

# 요소는 항상 리스트의 헤드(앞)에 추가한다.

# 순서가 문제가 되는 경우 `lists:reverse/1`을 호출한다. 이것은 매우 최적화되어있다.

따라서, `List ++ [H]`와 같은 코드는 권장되지 않는다.[24]

3. 1. 1. 함수형 프로그래밍 예제

다음은 계승 (수학)을 구하는 코드이다.

```erlang

  • module(fact).
  • export([fac/1]).


fac(0) -> 1;

fac(N) when N > 0 -> N * fac(N-1).

```

다음은 퀵소트 알고리즘을 구현한 것이다.

```erlang

%% quicksort(List)

%% Sort a list of items

  • module(quicksort).
  • export([qsort/1]).


qsort([]) -> [];

qsort([Pivot|Rest]) ->

qsort([ X || X <- Rest, X < Pivot]) ++ [Pivot] ++ qsort([ Y || Y <- Rest, Y >= Pivot]).

```

`qsort` 함수는 더 이상 정렬할 필요가 없을 때까지 자신을 재귀적으로 호출한다. `[ X || X <- Rest, X < Pivot]`는 "Rest의 원소이고, Pivot보다 작은 모든 X를 선택하라"는 의미이다. 이를 응용하면 코드를 간결하면서도 강력하게 짤 수 있다.

아래는 모든 순열을 구하는 얼랭 코드이다.

```erlang

perms([]) -> ;

perms(L) ->

```

다음은 피보나치 수열을 생성하는 꼬리 재귀 알고리즘이다.

```erlang

%% 모듈 선언은 파일 이름 "series.erl"과 일치해야 합니다.

  • module(series).


%% export 문은 모듈의 공용 API를 구성하는 모든 함수 목록을 포함합니다.

%% 이 경우, 이 모듈은 하나의 인수를 받는 (즉, 1의 아리티를 갖는) fib라는 단일 함수를 노출합니다.

%% -export의 일반적인 구문은 각 공용 함수의 이름과 아리티를 포함하는 목록입니다.

  • export([fib/1]).


%% ---------------------------------------------------------------------

%% 공용 API

%% ---------------------------------------------------------------------

%% fib/1이 특정 값을 수신하는 경우를 처리합니다.

%% 이러한 함수 시그니처가 선언되는 순서는 이 모듈 기능의 중요한 부분입니다.

%% fib/1이 음수를 받으면 원자 err_neg_val을 반환합니다.

%% 일반적으로 이러한 방어적인 코딩은 Erlang의 '충돌하게 내버려 둬' 철학 때문에 권장되지 않지만, 여기서는 무한 루프가 발생합니다.

fib(N) when N < 0 -> err_neg_val;

%% fib/1에 정확히 정수 0이 전달되면 0을 반환합니다.

fib(0) -> 0;

%% 다른 모든 값에 대해 계산을 수행하기 위해 비공개 함수 fib_int/3을 호출합니다.

fib(N) -> fib_int(N-1, 0, 1).

%% ---------------------------------------------------------------------

%% 비공개 API

%% ---------------------------------------------------------------------

%% fib_int/3이 첫 번째 인수로 0을 받으면 완료되므로

%% 인수 B의 값을 반환합니다. 두 번째 인수는 해당 값을 무시하기 위해 _로 표시됩니다.

fib_int(0, _, B) -> B;

%% 다른 모든 인수 조합에 대해 fib_int/3을 재귀적으로 호출합니다.

%% 각 호출은 다음을 수행합니다.

%% - 카운터 N을 감소시킵니다.

%% - 세 번째 인수를 새로운 두 번째 인수로 전달합니다.

%% - 두 번째와 세 번째 인수의 합을 새로운 세 번째 인수로 전달합니다.

fib_int(N, A, B) -> fib_int(N-1, B, A+B).

```[24]

3. 2. 동시성 및 분산 처리

얼랭의 가장 큰 강점은 병행성 및 분산 처리 지원이다. 얼랭은 경량 프로세스를 사용하여 수많은 프로세스를 효율적으로 생성하고 관리할 수 있다. 프로세스 간 통신은 메시지 전달 방식을 사용하며, 이를 통해 프로세스 간의 결합도를 낮추고 안정성을 높인다.

대부분의 언어에서 스레드는 외부 라이브러리 지원이 필요하지만, 얼랭은 동시 프로그래밍을 단순화하기 위해 프로세스를 생성하고 관리하는 언어 수준의 기능을 제공한다. 얼랭에서는 모든 병행성이 명시적이지만, 프로세스는 공유 변수 대신 메시지 전달을 사용하여 통신하므로 명시적인 잠금이 필요하지 않다(VM에서 내부적으로 잠금 체계가 여전히 사용됨).[32]

얼랭은 다른 많은 프로그래밍 언어에서 사용되는 예외 처리와 같은 프로세스 내 메커니즘이 아닌, 외부 프로세스가 충돌(또는 하드웨어 오류)을 쉽게 모니터링할 수 있도록 설계되었다. 충돌은 다른 메시지와 마찬가지로 보고되며, 이는 프로세스가 서로 통신할 수 있는 유일한 방법이다.[27] 그리고 하위 프로세스를 저렴하게 생성할 수 있다. "충돌하게 놔두라(let it crash)" 철학은 심각한 오류로부터 복구하려 하기보다는 프로세스를 완전히 재시작하는 것을 선호한다.[28] 여전히 오류 처리가 필요하지만, 이 철학은 오류 처리 코드가 매우 맥락적이고 구체적인 방어적 프로그래밍에 할애되는 코드를 줄여준다.[27]

얼랭은 분산 컴퓨팅 환경을 지원하며, 핫 스와핑이 가능하여 가동 중인 시스템을 중지하지 않고 얼랭의 프로그램을 변경할 수 있다.

분산 처리를 위한 내장 지원을 통해, 여러 노드(컴퓨터)에 분산된 프로세스들이 서로 투명하게 통신할 수 있다. "Let it crash" 철학을 바탕으로, 프로세스 충돌 시 빠르게 복구하고 시스템 전체의 안정성을 유지한다.

3. 2. 1. 프로세스(Processes)

Erlang 애플리케이션은 Erlang 런타임 시스템 내의 매우 가벼운 Erlang 프로세스로 구성된다. Erlang 프로세스는 데이터 캡슐화와 메시지 전달을 통해 "살아있는" 객체(객체 지향 프로그래밍)로 볼 수 있으며, 런타임 중에 동작을 변경할 수 있다. Erlang 런타임 시스템은 Erlang 프로세스 간의 엄격한 프로세스 격리(이는 각 Erlang 프로세스별로 개별적으로 분리된 데이터 및 가비지 수집을 포함)와 서로 다른 Erlang 노드(서로 다른 호스트) 간의 투명한 통신을 제공한다(위치 투명성 참조).

Erlang의 공동 발명가인 조 암스트롱(Joe Armstrong)은 그의 철학 박사 논문에서 프로세스 원리를 다음과 같이 요약했다:[17]

  • 모든 것은 프로세스이다.
  • 프로세스는 강력하게 격리된다.
  • 프로세스 생성 및 소멸은 가벼운 작업이다.
  • 메시지 전달은 프로세스가 상호 작용하는 유일한 방법이다.
  • 프로세스는 고유한 이름을 갖는다.
  • 프로세스 이름을 알면 메시지를 보낼 수 있다.
  • 프로세스는 자원을 공유하지 않는다.
  • 오류 처리는 비지역적이다.
  • 프로세스는 수행해야 할 작업을 수행하거나 실패한다.


조 암스트롱은 2013년 Rackspace와의 인터뷰에서 "만약 자바가 '한 번 작성하면 어디에서든 실행'이라면, Erlang은 '한 번 작성하면 영원히 실행'된다"라고 말했다.[18]

Erlang에서 "프로세스"(스레드)를 생성하고 관리하는 방법은 매우 일반적인 방법이다. Erlang의 주요 특징은 병렬 처리 지원이며, 여러 개의 "프로세스"를 생성하고 그 사이에서 통신을 수행하기 위한 간결하고 강력한 기능군에 의해 지원된다. Erlang이 제공하는 "프로세스"는 운영 체제가 제공하는 프로세스나 스레드와는 달리, Erlang의 가상 머신(VM)에 의해 관리된다. "프로세스" 생성 오버헤드는 약 300 워드 정도로 억제되어, 대량의 "프로세스"를 성능 저하 없이 생성할 수 있다. 어떤 벤치마크에서는 2000만 개의 "프로세스"를 병렬 실행할 수 있음이 나타났다[42]

Erlang에서의 프로세스 간 통신은 비공유이며 비동기 메시지 전송 시스템에 의해 이루어진다. Erlang의 프로세스는 모두 각각의 "메일함"을 가지며, 메일함에는 다른 프로세스로부터 수신한 메시지가 저장된다. 그 후, 메일함에 저장된 메시지는 메일함을 소유한 프로세스에 의해 처리된다. Erlang의 프로세스는 메시지를 얻기 위해 `receive`라는 기본 연산을 수행한다. 메시지를 얻는 과정에서는 패턴 매칭이 이루어진다. 먼저 메시지 제어 루틴이 첫 번째 메시지에 대해 각 패턴이 일치하는지 여부를 조사하고, 두 번째 이후의 메시지에 대해서도 동일한 작업을 수행한다. 매칭은 일치하는 메시지를 만날 때까지 이루어진다. 메시지가 처리되면, 메시지는 메일함 큐에서 제거되고, 프로세스는 복귀하여 다음 처리를 수행한다. Erlang의 구성 요소는 무엇이든 메시지로 사용할 수 있다. Erlang의 기본 요소인 정수[43], 부동 소수점 수[44], 문자[45], 아톰[46], 튜플[47], 리스트[48], 함수[49]조차도 메시지로 취급할 수 있다.

소스 코드 예시는 다음과 같다.



Pid=spawn(Mod, Func, Args) % 새로운 프로세스로 함수 Func를 실행

Pid=spawn(Node, Mod, Func, Args) % 원격 노드 Node에서 함수 Func를 실행

Pid ! a_message % 프로세스에 메시지 전송 (비동기)

receive % 이 프로세스로 전송된 메시지 수신

a_message -> do_something;

{data, Data_content} -> do_something_else();% 이것은 타입 아톰과 일부 데이터의 튜플이다.

{hello, Text} -> io:format("Got hello message:~s", [Text]);

{goodbye, Text} -> io:format("Got goodbye message:~s", [Text])

end.



Erlang에서는 다른 노드(컴퓨터)에 분산된 여러 프로세스를 서로 연계하여 동작시키기 위한 지원도 내장되어 있다 (분산 처리). 프로세스는 원격 노드에서 생성할 수 있으며, 원격 노드 상의 프로세스와의 프로세스 간 통신은 투명하다. 즉, 원격 노드 상의 프로세스와의 프로세스 간 통신은, 동일 노드 상의 프로세스와의 프로세스 간 통신과 완전히 동일하게 이루어진다.

Erlang에서의 병렬 처리는 오류 처리를 위한 기본적인 방법을 지원한다. 어떤 프로세스가 이상을 일으키면, 프로세스는 신속하게 종료되고, 해당 프로세스를 제어하는 프로세스 (어떤 조치를 취할 수 있는 프로세스)에 메시지를 전송한다. 이 오류 처리 방법을 통해 소스 코드의 유지 보수성을 높이고 복잡성을 줄일 수 있다.

3. 3. 자료형

얼랭은 8개의 기본 자료형과 3개의 복합 자료형을 제공한다.

  • 기본 자료형


자료형설명
정수12, 12375, -23427과 같이 10진수 숫자의 시퀀스로 작성된다. 정수 연산은 임의 정밀도 산술이라고 불리며, 사용 가능한 메모리에 의해서만 제한된다.
아톰프로그램 내에서 구별된 값을 나타내기 위해 사용된다. 첫 글자는 소문자인 영숫자 문자열로 작성되며, 작은따옴표로 묶어 특수 문자를 포함할 수 있다. 아톰은 가비지 수집되지 않으므로 주의해야 한다.
부동 소수점IEEE 754 64비트 표현을 사용한다.
참조전역적으로 고유한 심볼이며, 동일성 비교가 가능하다. `make_ref()` 함수로 생성된다.
이진 데이터바이트 시퀀스로, 바이너리 데이터를 효율적으로 저장하고 입/출력하는 데 사용된다.
Pid프로세스 식별자의 약자로, 얼랭 프로세스에 대한 참조이다. `spawn(...)` 함수로 생성된다.
포트외부 세계와 통신하는 데 사용되며, `open_port` 함수로 생성된다. "포트 프로토콜"을 따라야 한다.
Fun함수 클로저이며, `fun(...) -> ... end` 형식으로 생성된다.


  • 복합 자료형


자료형설명
튜플고정된 수의 얼랭 자료형을 담는 컨테이너이다. `{D1, D2, ..., Dn}` 형태로 표현되며, 모든 요소에 상수 시간에 접근할 수 있다.
리스트Dt]` (Dh: 헤드, Dt: 테일) 또는 `[]` (빈 리스트) 형태로 표현된다. 첫 번째 요소에 상수 시간에 접근할 수 있다.
가변적인 수의 키-값 쌍을 포함하며, `#{Key1=>Value1,...,KeyN=>ValueN}` 형태로 표현된다.


  • 구문 설탕


자료형설명
문자열이중 따옴표로 묶인 문자 리스트로 작성되며, 실제로는 각 문자의 유니코드 코드 포인트(정수) 리스트이다. 예: "cat"은 `[99, 97, 116]`과 같다.[25]
레코드튜플의 각 요소에 이름을 붙여, 위치 대신 이름으로 참조할 수 있게 해주는 편리한 방법이다.


3. 4. 핫 코드 로딩(Hot Code Loading)

얼랭은 언어 수준에서 동적 소프트웨어 업데이트를 지원한다. 이를 통해 시스템을 중단하지 않고도 코드를 수정하고 배포할 수 있다. 코드는 "모듈" 단위로 로드되고 관리되며, 모듈은 컴파일 단위이다. 시스템은 동일한 모듈의 두 가지 버전을 메모리에 동시에 유지할 수 있으며, 프로세스는 각 버전에서 코드를 동시에 실행할 수 있다. 이러한 버전은 "새로운" 버전과 "오래된" 버전이라고 한다. 프로세스는 해당 모듈에 대한 외부 호출을 수행할 때까지 새로운 버전으로 이동하지 않는다.

핫 코드 로딩 메커니즘의 예시는 다음과 같다.

```erlang

%% 카운터를 유지하는 것이 유일한 작업인 프로세스.

%% 첫 번째 버전

  • module(counter).
  • export([start/0, codeswitch/1]).


start() -> loop(0).

loop(Sum) ->

receive

{increment, Count} ->

loop(Sum+Count);

{counter, Pid} ->

Pid ! {counter, Sum},

loop(Sum);

code_switch ->

?MODULE:codeswitch(Sum)

% 최신 MODULE 버전에서 'codeswitch/1' 사용 강제

end.

codeswitch(Sum) -> loop(Sum).

```

두 번째 버전에서는 카운트를 0으로 재설정하는 기능을 추가하였다.

```erlang

%% 두 번째 버전

  • module(counter).
  • export([start/0, codeswitch/1]).


start() -> loop(0).

loop(Sum) ->

receive

{increment, Count} ->

loop(Sum+Count);

reset ->

loop(0);

{counter, Pid} ->

Pid ! {counter, Sum},

loop(Sum);

code_switch ->

?MODULE:codeswitch(Sum)

end.

codeswitch(Sum) -> loop(Sum).

```

원자 code_switch로 구성된 메시지를 수신할 때만 루프는 codeswitch/1에 대한 외부 호출을 실행한다 (`?MODULE`은 현재 모듈에 대한 전처리 매크로). 메모리에 ''counter'' 모듈의 새로운 버전이 있는 경우 해당 codeswitch/1 함수가 호출된다. 새로운 버전에 특정 진입점을 갖는 관행을 통해 프로그래머는 상태를 새로운 버전에서 필요한 내용으로 변환할 수 있다. 이 예에서 상태는 정수로 유지된다.

실제로 시스템은 Open Telecom Platform의 설계 원칙을 사용하여 구축되며, 이는 더 많은 코드 업그레이드 가능 설계를 가능하게 한다. 핫 코드 로딩은 정확성을 요구한다. 코드는 얼랭의 기능을 활용하기 위해 주의해서 작성해야 한다. 핫 스와핑이 가능하여, 가동 중인 시스템을 중지하지 않고 Erlangda프로그램을 변경할 수 있다.[1]

3. 5. "Let it crash" 코딩 스타일

얼랭은 "Let it crash" 철학을 따르는데, 이는 오류 처리를 간소화하고 시스템의 안정성을 높이는 데 기여한다.[28] 이 철학은 심각한 오류로부터 복구하기보다는 프로세스를 완전히 재시작하는 것을 선호한다.[28] 오류 처리는 여전히 필요하지만, 이 철학은 오류 처리 코드가 매우 맥락적이고 구체적인 방어적 프로그래밍에 할애되는 코드를 줄여준다.[27]

일반적인 얼랭 애플리케이션은 슈퍼바이저 트리 형태로 작성된다. 이 아키텍처는 최상위 프로세스를 "슈퍼바이저"로 지칭하는 프로세스 계층 구조를 기반으로 한다. 슈퍼바이저는 작업자 또는 더 낮은 수준의 슈퍼바이저 역할을 하는 여러 자식 프로세스를 생성한다. 이러한 계층 구조는 임의의 깊이까지 존재할 수 있으며, 애플리케이션 기능을 구현할 수 있는 확장성이 뛰어나고 결함 허용적인 환경을 제공하는 것으로 입증되었다.

슈퍼바이저 트리 내에서 모든 슈퍼바이저 프로세스는 자식 프로세스의 수명 주기를 관리할 책임이 있으며, 여기에는 해당 자식 프로세스가 충돌하는 상황을 처리하는 것도 포함된다. 모든 프로세스는 먼저 자식 프로세스를 생성한 다음 해당 프로세스에서 `erlang:monitor/2`를 호출하여 슈퍼바이저가 될 수 있다. 모니터링된 프로세스가 충돌하면 슈퍼바이저는 첫 번째 멤버가 원자 `'DOWN'`인 튜플을 포함하는 메시지를 받게 된다. 슈퍼바이저는 이 메시지를 수신하고 오류 조건을 수정하기 위한 적절한 조치를 취할 책임이 있다.

4. 구현

얼랭의 공식 레퍼런스 구현은 BEAM을 사용한다.[35] BEAM은 얼랭/OTP라고 불리는 얼랭의 공식 배포판에 포함되어 있다. BEAM은 로드 시점에 바이트코드를 스레드 코드로 변환하여 실행한다. 또한 웁살라 대학교의 고성능 얼랭 프로젝트(HiPE)에서 개발한 대부분의 플랫폼에서 네이티브 코드 컴파일러를 포함하고 있다. 2001년 10월부터 HiPE 시스템은 에릭슨의 오픈 소스 얼랭/OTP 시스템에 완전히 통합되었다.[36] 얼랭 R11B-5 릴리스부터는 스크립트를 통해 추상 구문 트리를 거쳐 소스 코드에서 직접 인터프리팅을 지원한다.

에릭슨에 의한 Erlangda의 구현은 기본적으로 인터프리터이지만, HiPE영어라는 컴파일러도 포함되어 있다.

5. 활용 사례

얼랭은 높은 가용성과 신뢰성이 요구되는 시스템 구축에 강점을 보이며, 다양한 산업 분야에서 활용되고 있다.


  • 통신: 에릭슨(Ericsson)은 자사의 지원 노드와 GPRS, 3G, LTE 모바일 네트워크에서 얼랭을 사용하고 있으며, 노텔(Nortel)과 도이치 텔레콤(Deutsche Telekom)에서도 사용한다.[19] 왓츠앱(WhatsApp),[20] Ejabberd (XMPP 메시징 서버) 등에도 사용된다.
  • 금융: 보컬링크(Vocalink)(마스터카드(MasterCard) 회사), 골드만삭스(Goldman Sachs) 등에서 사용된다.[22][23]
  • 게임: 닌텐도(Nintendo) 등 게임 서버 구축에 활용된다.[22][23]
  • 기타: 삼성전자(Samsung),[22][23] AdRoll, Grindr, BT 모바일(BT Mobile), OpenX, SITA 등 다양한 기업에서 활용된다.[22][23]


썬 마이크로시스템즈(Sun Microsystems)의 웹 기술 담당 이사였던 팀 브레이(Tim Bray)는 2008년 7월 오라일리 오픈 소스 컨벤션(O'Reilly Open Source Convention)(OSCON) 기조 연설에서 "대규모 메시지 처리 시스템을 구축해야 하고, 그 시스템이 항상 가동되어야 하며, 몇 년 동안 중단되는 것을 감수할 수 없다면, 망설임 없이 얼랭을 선택하여 구축할 것이다."라고 언급했다.

엘릭서(Elixir)는 BEAM 바이트 코드(얼랭 추상 형식을 통해)로 컴파일되는 프로그래밍 언어이다.[21]

6. 배포

Erlang은 라이브러리, 실시간 분산 데이터베이스 므네시아와 함께 OTP(Open Telecom Platform) 라이브러리 컬렉션을 형성한다.[37] 에릭슨 및 여러 회사들이 Erlang을 상업적으로 지원하고 있다.[37] 2022년 현재 Erlang은 활발하게 개발이 진행되고 있으며, 정기적으로 새 릴리스를 공개하고 있다.[54] Erlang은 여러 유닉스와 유사한 운영 체제Windows에서 사용할 수 있다.[54]

참조

[1] 웹사이트 Joe Armstrong - Functional Programming the Long Road to Enlightenment: a Historical and Personal Narrative https://vimeo.com/97[...] Vimeo 2014-06-04
[2] 웹사이트 Clojure: Lisp meets Java, with a side of Erlang - O'Reilly Radar http://radar.oreilly[...]
[3] 웹사이트 Influences - The Rust Reference https://doc.rust-lan[...] 2023-04-18
[4] 웹사이트 Erlang – Introduction http://erlang.org/do[...]
[5] 웹사이트 Open-source Erlang – White Paper http://ftp.sunet.se/[...] 2011-07-31
[6] 문서 Hitchhiker’s Tour of the BEAM – Robert Virding http://www.erlang-fa[...]
[7] conference History of Erlang 2007
[8] 웹사이트 How tech giants spread open source programming love - CIO.com http://www.cio.com/a[...] 2016-09-05
[9] 웹사이트 Erlang/OTP Released as Open Source, 1998-12-08 http://www.erlang.se[...]
[10] 웹사이트 Erlang, the mathematician? http://erlang.org/pi[...] 1999-02
[11] 웹사이트 Free Online Dictionary of Computing: Erlang https://foldoc.org/E[...]
[12] 웹사이트 History of Erlang http://erlang.org/co[...]
[13] 서적 Proceedings of the second ACM SIGPLAN international conference on Functional programming 1997-08
[14] thesis Concurrent Functional Programming for Telecommunications: A Case Study of Technology Introduction https://cogsys.uni-b[...] Royal Institute of Technology 2000-10
[15] 웹사이트 Concurrency Oriented Programming in Erlang http://www.rabbitmq.[...] 2002-11-09
[16] 웹사이트 question about Erlang's future http://erlang.org/pi[...] 2010-07-06
[17] thesis Making reliable distributed systems in the presence of software errors The Royal Institute of Technology 2003-11-20
[18] AV media Rackspace takes a look at the Erlang programming language for distributed computing https://www.youtube.[...] Rackspace Studios, SFO 2019-04-24
[19] 웹사이트 Ericsson http://www.ericsson.[...] 2018-04-07
[20] 웹사이트 Inside Erlang, The Rare Programming Language Behind WhatsApp's Success https://www.fastcomp[...] 2019-11-12
[21] 웹사이트 Erlang/Elixir Syntax: A Crash Course https://elixir-lang.[...] 2022-10-10
[22] 웹사이트 Which companies are using Erlang, and why? #MyTopdogStatus https://www.erlang-s[...] 2020-03-15
[23] 웹사이트 Which new companies are using Erlang and Elixir? #MyTopdogStatus https://www.erlang-s[...] 2020-06-24
[24] 웹사이트 Erlang – List Comprehensions http://erlang.org/do[...]
[25] 웹사이트 String and Character Literals http://erlang.org/do[...] 2015-05-02
[26] 웹사이트 ect – Erlang Class Transformation – add object-oriented programming to Erlang – Google Project Hosting https://code.google.[...] 2015-05-02
[27] 웹사이트 Let It Crash https://verraes.net/[...] 2021-02-10
[28] 웹사이트 Reactive Design Patterns — https://www.reactive[...] 2021-02-10
[29] journal Erlang 2010-09
[30] 웹사이트 Erlang Efficiency Guide – Processes http://www.erlang.or[...]
[31] 웹사이트 Stress-testing erlang https://groups.googl[...] 2005-11-14
[32] 웹사이트 Lock-free message queue http://erlang.208679[...] 2013-12-23
[33] 웹사이트 Erlang robustness http://www.erlang.or[...] 2010-07-15
[34] 웹사이트 Erlang Supervision principles http://www.erlang.or[...] 2010-07-15
[35] 웹사이트 Erlang – Compilation and Code Loading http://erlang.org/do[...] 2017-12-21
[36] 웹사이트 High Performance Erlang http://www.it.uu.se/[...] 2011-03-26
[37] 웹사이트 Who uses Erlang for product development? http://erlang.org/fa[...] 2007-07-16
[38] 웹사이트 Programming Erlang http://www.ddj.com/l[...] 2008-12-13
[39] 웹사이트 Erlang, the next Java http://www.cincomsma[...] 2008-10-08
[40] 웹사이트 Battlestar Galactica vets needed for online roleplay https://www.theregis[...] The Reg 2011-02-05
[41] 웹사이트 Releases https://github.com/e[...] GitHub 2024-08-12
[42] 웹사이트 Stress-testing Erlang https://groups.googl[...] 2005-11-14
[43] 문서 integer
[44] 문서 float
[45] 문서 character
[46] 문서 atom
[47] 문서 tuple
[48] 문서 list
[49] 문서 function
[50] 문서 Nortel Networks
[51] 문서 T-Mobile
[52] 문서 Deutsche Flugsicherung
[53] 웹사이트 「Who uses Erlang for product development?」Erlangに関してよく尋ねられる質問集 http://www.erlang.or[...] エリクソン
[54] URL https://speakerdeck.[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com