Erlang(프로그래밍 언어)
Erlang (programming language)![]() | |
패러다임 | 멀티패러다임:동시,기능 |
---|---|
설계자 |
|
개발자 | 에릭슨 |
처음 등장한 | 전 |
안정된 릴리스 | 2021년[1] 11월 18일 / .1.6, 전 ( ) |
타이핑 분야 | 다이내믹하고 강력함 |
면허증. | Apache 라이센스 2.0 |
파일 이름 확장자 | .erl, .hrl |
웹 사이트 | www |
주요 구현 | |
얼랑 | |
영향을 받다 | |
리스프, 플렉스,[2] 프롤로그, 스몰톡 | |
영향받은 | |
Akka, Clojure,[3] Dart, Elixir, F#, Opa, Oz, Reia, Rust, Scala, Go | |
|
Erlang(/'rlé'/UR-lang)은 범용 동시 기능 프로그래밍 언어이며 가비지 수집 런타임시스템입니다Erlang이라는 용어는 Erlang/OTP 또는 Open Telecom Platform(OTP; Open Telecom Platform)과 상호 호환되게 사용됩니다.OTP는 Erlang 런타임 시스템, 주로 Erlang으로 작성된 여러 Ready-to-Use Components(OTP; 기성 컴포넌트) 및 Erlang 프로그램의 설계 [4]원칙 세트로 구성됩니다.
Erlang 런타임 시스템은 다음과 같은 특성을 가진 시스템용으로 설계되었습니다.
Erlang 프로그래밍 언어에는 불변의 데이터,[6] 패턴 일치 및 기능 프로그래밍이 있습니다.Erlang 언어의 시퀀셜 서브셋은 신속한 평가, 단일 할당 및 동적 입력을 지원합니다.
일반 Erlang 애플리케이션은 수백 개의 소규모 Erlang 프로세스로 구축됩니다.
원래는 [7]1986년 Joe Armstrong, Robert Virding 및 Mike Williams에 의해 개발된 에릭슨 내의 독점 소프트웨어였지만 1998년 [8][9]자유 및 오픈 소스 소프트웨어로 출시되었습니다.Erlang/OTP는 Ericson의 Open Telecom Platform(OTP) 제품 유닛에 의해 지원 및 유지보수됩니다.
역사
에를랑이라는 이름은 비야르네 대커(Bjarne Décker)가 고안한 텔레포니 스위치로 덴마크 수학자이자 엔지니어인 아그너 크라루프 에를랑(Agner Krarup Erlang)을 지칭하는 것으로 추정되며, 에릭슨 언어(Ericsson Language)[7][10][11]의 음절 줄임말이다.Erlang은 텔레포니애플리케이션의 [12]개발을 향상시키는 것을 목적으로 설계되어 있습니다.Erlang의 초기 버전은 Prolog에서 구현되었으며 이전 Ericson 교환에서 사용된 프로그래밍 언어 PLEX의 영향을 받았습니다.1988년까지 Erlang은 전화 교환 시제품 제작에 적합하다는 것을 증명했지만, Prolog 통역기는 너무 느렸습니다.에릭슨사의 한 그룹은 실제 가동에 적합하기 위해서는 40배의 속도가 필요할 것이라고 예측했습니다.1992년에 BEAM 가상 머신(VM)에 대한 작업이 시작되었습니다.이 작업은 기본적으로 컴파일된 코드와 스레드화된 코드를 혼합하여 성능과 디스크 [13]공간의 균형을 맞추기 위해 Erlang을 C로 컴파일했습니다.공동 발명자인 Joe Armstrong에 따르면, 1995년 AXE-N이라는 차세대 AXE 전화 교환기가 붕괴된 이후 이 언어는 랩 제품에서 실제 애플리케이션으로 발전했습니다.그 결과 Erlang은 다음 비동기 전송 모드(ATM) 교환 AXD로 [7]선택되었습니다.
1998년 2월 에릭슨 라디오 시스템즈는 비독점 [14]언어에 대한 선호도를 이유로 신제품에 대한 사내 사용을 금지했다.이 금지령은 암스트롱과 다른 사람들로 하여금 [15]에릭슨을 떠날 계획을 세우게 만들었다.1998년 3월 에릭슨은 100만 회선이 넘는 Erlang을 탑재한 AXD301 [7]스위치를 발표했으며 9개의 "9"[16]s의 고가용성을 달성했다고 보고했습니다.1998년 12월, Erlang의 실장은 오픈 소스로 행해졌고, Erlang 팀의 대부분이 사임해, 새로운 회사 Bluetail [7]AB를 설립했습니다.에릭슨은 결국 출전 금지를 완화하고 2004년 [15]암스트롱을 다시 영입했다.
2006년에는 런타임 시스템과 [7]VM에 네이티브 대칭 멀티프로세싱 지원이 추가되었습니다.
과정
Erlang 애플리케이션은 Erlang 런타임 시스템의 매우 가벼운 Erlang 프로세스로 구축됩니다.Erlang 프로세스는 데이터 캡슐화와 메시지 전달을 수반하는 "살아있는" 객체(객체 지향 프로그래밍)로 볼 수 있지만 실행 시 동작을 변경할 수 있습니다.Erlang 런타임 시스템은 Erlang 프로세스 간의 엄격한 프로세스 분리(데이터 및 가비지 수집 포함, 각 Erlang 프로세스별로 개별적으로 분리) 및 (다른 호스트 상의) 다른 Erlang 노드 상의 프로세스 간의 투과적인 통신을 제공합니다.
Erlang의 공동 발명자인 Joe Armstrong은 박사 [17]논문에서 프로세스의 원리를 요약했습니다.
- 모든 것은 과정이다.
- 프로세스는 강하게 격리되어 있습니다.
- 프로세스의 작성과 파괴는 간단한 작업입니다.
- 메시지 전달은 프로세스가 상호 작용하는 유일한 방법입니다.
- 프로세스에는 고유한 이름이 있습니다.
- 프로세스의 이름을 알고 있으면 메시지를 보낼 수 있습니다.
- 프로세스는 리소스를 공유하지 않습니다.
- 오류 처리가 로컬이 아닙니다.
- 프로세스는 해야 할 일을 하거나 실패해야 합니다.
Joe Armstrong은 2013년 Rackspace와의 인터뷰에서 "Java가 'write one, run anywhere'라면 Erlang은 'write one, run forever'[18]이다"라고 말했다.
사용.
2014년 에릭슨은 Erlang이 지원 노드, GPRS, 3G 및 LTE 모바일 네트워크 및 Nortel 및 [19]T-Mobile에서 사용되고 있다고 보고했습니다.
Sun Microsystems의 웹 테크놀로지 담당 디렉터 Tim Bray는 2008년 7월 O'Reilly Open Source Convention(OSCON) 기조연설에서 다음과 같이 말했습니다.
만약 누군가가 제게 와서 큰 돈을 주고 큰 규모의 메시지 처리 시스템을 만들고 싶어 한다면, 한 번에 몇 년씩 내려갈 수 없는 시스템이라면 주저 없이 Erlang을 선택할 것입니다.
Erlang은 WhatsApp을 [20]코드화하는 데 사용되는 프로그래밍 언어입니다.
얼랑은 오픈 소스로 출시된 이후 통신사를 넘어 핀테크, 게임, 헬스케어, 자동차, 사물인터넷, 블록체인과 같은 다른 수직 시장에서 입지를 굳히고 있습니다.WhatsApp 이외에도 Erlang의 성공 사례로 나열된 다른 기업들이 있습니다.보컬링크(마스터카드사), 골드만삭스, 닌텐도, 애드롤, 그라인더, BT모바일, 삼성, 오픈X, SITA.[21][22]
기능 프로그래밍 예시
요인
Erlang에서 구현된 요인 알고리즘:
-모듈(사실). % 이것은 파일 'fact.erl'입니다.모듈과 파일명이 일치해야 합니다. -수출.([팩/1]). % 이것은 arity 1의 함수 'fac'을 내보냅니다(1 매개 변수, 유형, 이름 없음). 팩(0) -> 1; % 0이면 1을 반환하고 그렇지 않으면 세미콜론을 반환한다('else'를 의미한다). 팩(N) 언제 N > 0, is_filename(이것들)(N) -> N * 팩(N-1). % 재귀적으로 판별하여 결과를 반환한다. % ('종료' 또는 '기능종료'를 의미하는 기간 기록) %% 이 함수는 음이 아닌 정수가 지정되면 충돌합니다. %% 이것은 Erlang의 "Let it crash" 철학을 보여줍니다.
피보나치 수열
피보나치 시퀀스를 생성하는 테일 재귀 알고리즘:
%% 모듈 선언은 "series.erl" 파일 이름과 일치해야 합니다. -모듈(시리즈). %% export 스테이트먼트에는 다음과 같은 모든 함수의 리스트가 포함되어 있습니다. 모듈의 퍼블릭 API %%.이 경우, 이 모듈은 1개의 싱글을 공개합니다. 1개의 인수를 받는 fib라는 함수 %%(즉, Ariity는 1) %% - export의 일반적인 구문은 이름과 이름을 포함하는 목록입니다. 각 공공기능의 %% 특성 -수출.([파이브/1]). %% --------------------------------------------------------------------- %% 퍼블릭 API %% --------------------------------------------------------------------- %% fib/1이 특정 값을 받는 경우를 처리합니다. %% 이러한 함수 시그니처가 선언되는 순서는 필수입니다. 이 모듈 기능의 %% %% fib/1이 정수 0을 정확하게 통과하면 0을 반환합니다. 파이브(0) -> 0; %% fib/1이 음수를 수신하면 err_neg_val을 반환합니다. %% 일반적으로 이러한 방어 코드화는 Erlang의 'Let'으로 인해 권장되지 않습니다. %%의 크래시 철학. 단, 이 경우 명시적으로 %%는 Erlang의 런타임 엔진이 크래시되는 상황을 방지합니다. 파이브(N) 언제 N < > 0 -> err_neg_val; %% fib/1이 3보다 작은 정수로 전달되면 1을 반환합니다. %% 앞의 2개의 기능 시그니처는 N < 1, %% 따라서 이 함수 시그니처는 N = 1 또는 N = 2인 경우를 처리합니다. 파이브(N) 언제 N < > 3 -> 1; %% 기타 모든 값은 private 함수 fib_int/3을 호출하여 수행합니다. 계산 %% 파이브(N) -> fib_int(N, 0, 1). %% --------------------------------------------------------------------- %% 프라이빗 API %% --------------------------------------------------------------------- %% fib_int/3가 첫 번째 인수로 1을 받는 경우 종료됩니다. %%는 인수 B의 값을 반환합니다.저희가 관심없기 때문에 두 번째 인수의 %% 값은 _를 사용하여 나타냅니다. %% "상관없음" 값 fib_int(1, _, B) -> B; %% 기타 모든 인수 조합의 경우 fib_int/3을 재귀적으로 호출합니다. %% 각 콜은 다음 작업을 수행합니다. %% - 감소 카운터 N %% - 인수 B의 이전 fibonacci 값을 다음과 같이 전달합니다. %% 인수 A %% - 현재 fibonacci 번호의 값을 계산하여 통과시킵니다. %%는 인수 B로서 fib_int(N, A, B) -> fib_int(N-1, B, A+B).
다음은 설명 없는 동일한 프로그램입니다.
-모듈(시리즈). -수출.([파이브/1]). 파이브(0) -> 0; 파이브(N) 언제 N < > 0 -> err_neg_val; 파이브(N) 언제 N < > 3 -> 1; 파이브(N) -> fib_int(N, 0, 1). fib_int(1, _, B) -> B; fib_int(N, A, B) -> fib_int(N-1, B, A+B).
퀵소트
목록 [23]이해를 사용하여 Erlang에서 QuickSort:
% % qsort : qsort (목록) %% 항목 목록 정렬 -모듈(q). % 이것은 'qsort.erl' 파일입니다. -수출.([q/1]). % 매개 변수가 1개인 함수 'qsort'가 내보냅니다(유형, 이름 없음). q([]) -> []; % 목록 []이(가) 비어 있는 경우 빈 목록을 반환합니다(정렬할 항목 없음). q([피벗 쉬다]) -> % 'Pivot' 앞에 있어야 하는 모든 요소에 대해 'Front'가 있는 목록을 반복적으로 작성합니다. 'Pivot' 뒤에 와야 하는 모든 요소에 대해 %를 누른 후 'Pivot'을 누른 후 'Back'을 누릅니다. q([전선. 전선. <-> 쉬다, 전선. < > 피벗]) ++ [피벗] ++ q([뒤로 뒤로 <-> 쉬다, 뒤로 >= 피벗]).
위의 예에서는 함수를 재귀적으로 호출하고 있습니다.qsort
정리할 게 아무것도 남지 않을 때까지요표현[Front Front <- Rest, Front < Pivot]
목록 이해입니다. 즉, "요소의 목록 구성"을 의미합니다.Front
그렇게 해서Front
의 멤버입니다.Rest
,그리고.Front
보다 작다Pivot
."++
는 목록 연결 연산자입니다.
비교 기능은 가독성을 위해 보다 복잡한 구조에 사용할 수 있습니다.
다음 코드는 길이에 따라 목록을 정렬합니다.
% 이것은 'listsort.erl' 파일입니다(컴파일러는 이렇게 되어 있습니다). -모듈(리스트). % 매개 변수 1개와 함께 'by_length' 내보내기(유형 및 이름 상관 없음) -수출.([by_길이/1]). by_길이(리스트) -> % 'qsort/2'를 사용하여 익명 함수를 매개 변수로 제공 q(리스트, 재밌어요(A,B) -> 길이(A) < > 길이(B) 끝.). q([], _)-> []; % 목록이 비어 있는 경우 빈 목록을 반환합니다(두 번째 매개 변수 무시). q([피벗 쉬다], 더 작은) -> 'Pivot' 요소 앞에 'Smaller' 요소가 있고 'Smaller' 요소가 아닌 파티션 목록(%) 'Pivot' 뒤에 %를 입력하고 하위 목록을 정렬합니다. q([X X <-> 쉬다, 더 작은(X,피벗)], 더 작은) ++ [피벗] ++ q([Y Y <-> 쉬다, 것은 아니다.(더 작은(Y, 피벗))], 더 작은).
A Pivot
에 주어지는 첫 번째 파라미터에서 추출됩니다.qsort()
기타Lists
이름이 붙여졌다Rest
. 이 표현은
[X X <-> 쉬다, 더 작은(X,피벗)]
형식상 과 다르지 않다
[전선. 전선. <-> 쉬다, 전선. < > 피벗]
(앞의 예에서) 마지막 부분에서 비교 기능을 사용한 경우를 제외하고, "요소의 목록을 작성한다.X
그렇게 해서X
의 멤버입니다.Rest
,그리고.Smaller
맞는 말이야"라고 말했다.Smaller
조기에 정의되다
재밌어요(A,B) -> 길이(A) < > 길이(B) 끝.
anonymous 함수의 이름은Smaller
두 번째 정의 파라미터 리스트에서qsort
해당 함수 내에서 해당 이름으로 참조할 수 있도록 합니다.의 첫 번째 정의에는 이름이 없습니다.qsort
이것은 빈 목록의 기본 대소문자를 처리하므로 이름은 말할 것도 없고 이 함수도 필요하지 않습니다.
데이터형
Erlang에는 8가지 기본 데이터 유형이 있습니다.
- 정수
- 정수는 십진수 순서로 작성됩니다.예를 들어 12, 12375 및 -23427은 정수입니다.정수 연산은 정확하며 기계에서 사용 가능한 메모리에 의해서만 제한됩니다.(이것을 임의 정밀도 연산이라고 부릅니다).
- 원자
- 원자는 프로그램 내에서 구별된 값을 나타내기 위해 사용됩니다.이러한 문자는 영숫자 연속 문자열로 작성됩니다.첫 번째 문자는 소문자입니다.원자는 작은 따옴표로 둘러싸여 있고 원자 내에서 임의의 문자를 사용할 수 있는 이스케이프 규칙이 존재하는 경우 임의의 문자를 포함할 수 있습니다.원자는 가비지 수집되지 않으므로 특히 동적 원자 생성을 사용하는 경우 주의하여 사용해야 합니다.
- 플로트
- 부동소수점 번호는 IEEE 754 64비트 표현을 사용합니다.
- 레퍼런스
- 참조는 동등성을 비교할 수 있는 유일한 특성인 글로벌하게 고유한 기호입니다.그들은 얼랑 원시를 평가함으로써 만들어졌다.
make_ref()
. - 바이너리
- 바이너리는 바이트의 시퀀스입니다.바이너리를 사용하면 바이너리 데이터를 공간 효율적으로 저장할 수 있습니다.Erlang 프리미티브는 바이너리를 구성 및 분해하고 바이너리의 효율적인 입/출력을 위해 존재합니다.
- 피드
- Pid는 프로세스 식별자의 줄임말입니다. Pid는 Erlang 프리미티브에 의해 생성됩니다.
spawn(...)
피드는 Erlang 프로세스에 대한 참조입니다. - 포트
- 포토는, 외부 세계와의 통신에 사용됩니다.포트가 내장된 기능으로 생성됩니다.
open_port
. 포트에서 메시지를 송수신할 수 있지만 이러한 메시지는 이른바 "포트 프로토콜"에 따라야 합니다. - 기능
- 재미는 기능 폐쇄입니다.Fun은 다음 형식의 식에 의해 작성됩니다.
fun(...) -> ... end
.
복합 데이터 유형으로는 다음 세 가지가 있습니다.
- 튜플
- 튜플은 고정된 수의 Erlang 데이터 유형에 대한 컨테이너입니다.구문
{D1,D2,...,Dn}
인수가 다음과 같은 태플을 나타냅니다.D1, D2, ... Dn.
인수는 원시 데이터 유형 또는 복합 데이터 유형일 수 있습니다.태플의 모든 요소에 일정한 시간 내에 액세스할 수 있습니다. - 리스트
- 목록은 가변 개수의 Erlang 데이터 유형을 위한 컨테이너입니다.구문
[Dh Dt]
첫 번째 요소가 다음과 같은 목록을 나타냅니다.Dh
나머지 요소는 목록입니다.Dt
. 구문[]
에 빈 목록을 나타냅니다.구문[D1,D2,..,Dn]
의 줄임말이다[D1 [D2 .. [Dn []]]]
목록의 첫 번째 요소는 일정한 시간에 액세스할 수 있습니다.목록의 첫 번째 요소는 목록의 선두라고 불립니다.헤드가 제거된 목록의 나머지 부분을 목록의 끝이라고 합니다. - 지도
- 맵에는 가변 개수의 키와 값의 관련성이 포함됩니다.구문은 다음과 같습니다.
#{Key1=>Value1,...,KeyN=>ValueN}
.
통사당에는 두 가지 형태가 있다.
- 줄들
- 문자열은 이중 따옴표로 묶인 문자 목록으로 작성됩니다.이것은 문자열에 포함된 문자의 정수 유니코드 코드 포인트 목록에 대한 구문 설탕입니다.예를 들어 문자열 "cat"은 다음과 같은 약자입니다.
[99,97,116]
를 클릭합니다.[24] - 기록.
- 레코드를 사용하면 태그와 태플의 각 요소를 쉽게 관련지을 수 있습니다.이를 통해 위치가 아닌 이름으로 태플 요소를 참조할 수 있습니다.사전 컴파일러는 레코드 정의를 가져와 적절한 태플 참조로 대체합니다.
외부 라이브러리를 사용할 수 있지만 [25]Erlang에는 클래스를 정의하는 메서드가 없습니다.
"Let it crash" 코딩 스타일
Erlang은 다른 많은 프로그래밍 언어에서 사용되는 예외 처리와 같은 처리 중인 메커니즘이 아니라 외부 프로세스가 크래시(또는 하드웨어 장애)를 쉽게 감시할 수 있는 메커니즘으로 설계되었습니다.크래시는 다른 메시지와 마찬가지로 보고됩니다.이는 프로세스 간에 [26]통신할 수 있는 유일한 방법이며 서브프로세스를 [citation needed]저렴하게 생성할 수 있습니다.「크래시」의 이념은, 중대한 [27]장해로부터 회복하려고 하는 것보다, 프로세스를 완전하게 재기동하는 것을 선호합니다.여전히 오류 처리가 필요하지만, 이 철학은 오류 처리 코드가 매우 컨텍스트적이고 [26]구체적인 경우 방어 프로그래밍에 전념하는 코드를 줄여줍니다.
슈퍼바이저 트리
일반적인 Erlang 어플리케이션은 슈퍼바이저 트리 형식으로 작성됩니다.이 아키텍처는 최상위 프로세스를 "슈퍼바이저"라고 하는 프로세스 계층을 기반으로 합니다.다음으로 슈퍼바이저는 워커 또는 그보다 낮은 수준의 슈퍼바이저로 동작하는 여러 자녀 프로세스를 생성합니다.이러한 계층은 임의의 깊이까지 존재할 수 있으며 애플리케이션 기능을 구현할 수 있는 확장성과 내결함성이 뛰어난 환경을 제공하는 것으로 입증되었습니다.
슈퍼바이저 트리 내에서는 모든 슈퍼바이저 프로세스가 자녀 프로세스의 라이프 사이클을 관리합니다.또한 자녀 프로세스가 크래시하는 처리 상황도 포함됩니다.어떤 프로세스든 먼저 자 프로세스를 생성하고 다음으로 콜함으로써 슈퍼바이저가 될 수 있습니다.erlang:monitor/2
그 과정에서요.모니터링 대상 프로세스가 크래시되면 슈퍼바이저는 첫 번째 멤버가 atom인 태플을 포함하는 메시지를 수신합니다.'DOWN'
슈퍼바이저는 우선 이러한 메시지를 듣고 다음으로 에러 상태를 수정하기 위한 적절한 조치를 취할 책임이 있습니다.
동시성 및 배포 지향
얼랑의 주된 강점은 동시성을 지지하는 것이다.프로세스를 생성하고 프로세스 간에 통신할 수 있는 작지만 강력한 원시 요소 세트가 있습니다.Erlang은 개념적으로 언어 Occam과 유사하지만 기능 프레임워크에서 순차 프로세스(CSP)를 통신하는 아이디어를 재구성하고 비동기 메시지 [28]전달을 사용합니다.프로세스는 Erlang 어플리케이션을 구조화하기 위한 주요 수단입니다.운영체제 프로세스도 스레드도 아닌 BEAM에 의해 스케줄된 경량 프로세스입니다.운영체제 프로세스와 마찬가지로 (운영체제 스레드와는 달리) 서로 상태를 공유하지 않습니다.각각의 최소 오버헤드는 300단어입니다.[29]따라서 성능 저하 없이 많은 프로세스를 생성할 수 있습니다.2005년에는 16GB 랜덤 액세스 메모리(RAM, 총 800바이트/프로세스)[30]를 탑재한 머신에서 64비트 Erlang을 사용한 2,000만 프로세스 벤치마크에 성공했습니다.Erlang은 2006년 5월 출시 R11B 이후 대칭형 멀티프로세싱을 지원해 왔습니다.
스레드는 대부분의 언어에서 외부 라이브러리 지원이 필요하지만 Erlang은 동시 프로그래밍을 단순화하기 위해 프로세스를 작성 및 관리하기 위한 언어 수준의 기능을 제공합니다.Erlang에서는 모든 동시성이 명시되어 있지만 프로세스는 공유 변수 대신 메시지 전달을 사용하여 통신하므로 명시적인 잠금이 필요하지 않습니다(잠금 방식은 [31]VM에서 내부적으로 계속 사용됩니다).
프로세스 간 통신은 공유 없음 비동기 메시지 전달 시스템을 통해 작동합니다. 모든 프로세스에는 다른 프로세스에서 전송되었지만 아직 소비되지 않은 메시지 대기열인 "메일함"이 있습니다.프로세스에서는receive
primitive: 원하는 패턴과 일치하는 메시지를 가져옵니다.메시지 처리 루틴은 각 패턴 중 하나가 일치할 때까지 차례로 메시지를 테스트합니다.메시지가 소비되고 우편함에서 제거되면 프로세스가 실행을 재개합니다.메시지는 기본 요소(정수, 플로트, 문자, 원자), 튜플, 목록 및 함수를 포함한 모든 Erlang 구조로 구성될 수 있습니다.
다음 코드 예는 분산 프로세스에 대한 기본 제공 지원을 보여 줍니다.
% 프로세스를 생성하여 함수 web: start_server(Port, MaxConnections)를 호출합니다. 서버 프로세스 = 낳다(웹, start_server, [항구, 최대 접속수]), % 원격 프로세스 생성 및 함수 호출 % Web: 머신 RemoteNode 상의 start_server(포트, MaxConnections) 리모트 프로세스 = 낳다(리모트 노드, 웹, start_server, [항구, 최대 접속수]), % Server Process 에 메시지를 송신합니다(비동기).메시지는 태플로 구성됩니다. % (원자 "deturn" 및 숫자 "10" 포함) 서버 프로세스 ! {멈추다, 10}, 이 프로세스에 보낸 메시지 수신 비율(%) 받다 a_메시지 -> 무엇인가 하다; {데이터., 데이터 콘텐츠} -> 다루다(데이터 콘텐츠); {안녕, 본문} -> 하와이 말똥가리:포맷("hello 메시지를 받았습니다.~s", [본문]); {잘가요., 본문} -> 하와이 말똥가리:포맷("이별 메시지를 받았습니다:~s", [본문]) 끝..
예에서 보듯이 리모트노드에는 프로세스가 생성될 수 있으며 리모트프로세스와의 통신은 로컬프로세스와의 통신과 동일하게 동작한다는 점에서 이들 노드와의 통신은 투과적입니다.
동시성은 Erlang에서 오류를 처리하는 주요 방법을 지원합니다.프로세스가 충돌하면 프로세스가 깔끔하게 종료되고 메시지를 제어 프로세스로 보냅니다. 제어 프로세스는 이전 프로세스의 태스크를 [32][33]인계하는 새 프로세스를 시작하는 등의 작업을 수행할 수 있습니다.
실행
Erlang의 공식 기준 구현에서는 [34]BEAM을 사용합니다.BEAM은 Erlang/OTP라고 불리는 Erlang의 공식 분포에 포함됩니다.BEAM은 로드 시 스레드 코드로 변환되는 바이트 코드를 실행합니다.또한 대부분의 플랫폼에 네이티브 코드 컴파일러가 포함되어 있으며 Uppsala 대학의 HiPE(High Performance Erlang Project)에 의해 개발되었습니다.2001년 10월부터 HiPE 시스템은 에릭슨의 오픈 소스 Erlang/OTP 시스템에 완전히 통합되었습니다.[35]또한 Erlang의 R11B-5 릴리즈에서 스크립트를 통해 소스 코드에서 추상 구문 트리를 통해 직접 해석을 지원합니다.
핫 코드 로드 및 모듈
Erlang은 언어 수준의 동적 소프트웨어 업데이트를 지원합니다.이를 구현하기 위해 코드는 "모듈" 단위로 로드되고 관리됩니다. 모듈은 컴파일 장치입니다.시스템은 동시에 2가지 버전의 모듈을 메모리에 유지할 수 있으며 프로세스에서 각각 코드를 동시에 실행할 수 있습니다.이러한 버전을 "신규" 버전과 "구" 버전이라고 합니다.모듈은 외부 콜을 발신할 때까지 새로운 버전으로 이행하지 않습니다.
핫 코드 로딩 메커니즘의 예를 다음에 나타냅니다.
%% 카운터를 유지하는 것이 유일한 작업인 프로세스. %% 첫 번째 버전 -모듈(계산대). -수출.([개시하다/0, 코드 스위치/1]). 개시하다() -> 고리(0). 고리(합) -> 받다 {증량, 세어보세요} -> 고리(합+세어보세요); {계산대, 피드} -> 피드 ! {계산대, 합}, 고리(합); code_switch(코드 스위치) -> ?모듈:코드 스위치(합) % 최신 모듈 버전에서 '코드 스위치/1'을 강제로 사용합니다. 끝.. 코드 스위치(합) -> 고리(합).
두 번째 버전에서는 카운트를 0으로 리셋할 수 있습니다.
%% 두 번째 버전 -모듈(계산대). -수출.([개시하다/0, 코드 스위치/1]). 개시하다() -> 고리(0). 고리(합) -> 받다 {증량, 세어보세요} -> 고리(합+세어보세요); 리셋 -> 고리(0); {계산대, 피드} -> 피드 ! {계산대, 합}, 고리(합); code_switch(코드 스위치) -> ?모듈:코드 스위치(합) 끝.. 코드 스위치(합) -> 고리(합).
atom으로 구성된 메시지를 수신하는 경우에만code_switch
루프가 코드 스위치/1에 대한 외부 콜을 실행합니까??MODULE
는 현재 모듈의 프리프로세서 매크로입니다).메모리에 카운터 모듈의 새 버전이 있는 경우 해당 코드스위치/1 기능이 호출됩니다.프로그래머는 특정 엔트리 포인트를 새로운 버전으로 갖는 관행을 통해 상태를 새로운 버전에서 필요한 상태로 변환할 수 있습니다.이 예에서는 상태는 정수로 유지됩니다.
실제로 시스템은 Open Telecom Platform의 설계 원칙을 사용하여 구축되므로 업그레이드 가능한 코드 설계가 많아집니다.핫 코드를 정상적으로 로드하는 것은 매우 어렵습니다.Erlang의 시설을 이용하려면 코드를 주의 깊게 작성해야 합니다.
분배
1998년 에릭슨은 Erlang을 하나의 벤더로부터 독립시키고 언어에 대한 인식을 높이기 위해 무료 오픈 소스 소프트웨어로 출시했습니다.Erlang은 라이브러리 및 실시간 분산 데이터베이스 Mnesia와 함께 라이브러리의 OTP 컬렉션을 형성합니다.에릭슨과 다른 몇몇 회사들은 Erlang을 상업적으로 지원하고 있습니다.
오픈 소스 출시 이후, Erlang은 Nortel과 T-Mobile을 [36]포함한 전 세계 여러 기업에서 사용되고 있습니다.Erlang은 틈새를 메우도록 설계되어 존재의 대부분을 불명확한 언어로 유지되어 왔지만,[37][38] 동시 서비스에 대한 수요로 인해 그 인기는 높아지고 있습니다.Erlang은 대규모 멀티플레이어 온라인 롤플레잉 게임([39]MMORPG) 서버를 구축하는 데 어느 정도 활용되고 있습니다.
「 」를 참조해 주세요.
- Elixir – BEAM에서 실행되는 기능적 동시 범용 프로그래밍 언어
- Luerl - Erlang의 크리에이터 중 한 명이 설계 및 구현한 BEAM의 Lua.
- Lisp Flavored Erlang(LFE) - BEAM 상에서 실행되는 Lisp 기반의 프로그래밍 언어
- 혼합(빌드 도구)
- Phoenix(웹 프레임워크)
레퍼런스
- ^ https://github.com/erlang/otp/releases/tag/OTP-24.1.6 를 참조해 주세요.
- ^ Conferences, N. D. C. (4 June 2014). "Joe Armstrong - Functional Programming the Long Road to Enlightenment: a Historical and Personal Narrative". Vimeo.
- ^ "Clojure: Lisp meets Java, with a side of Erlang - O'Reilly Radar". radar.oreilly.com.
- ^ "Erlang – Introduction". erlang.org.
- ^ Armstrong, Joe; Däcker, Bjarne; Lindgren, Thomas; Millroth, Håkan. "Open-source Erlang – White Paper". Archived from the original on 25 October 2011. Retrieved 31 July 2011.
- ^ 히치하이커의 BEAM 투어– Robert Virding http://www.erlang-factory.com/upload/presentations/708/HitchhikersTouroftheBEAM.pdf
- ^ a b c d e f Armstrong, Joe (2007). History of Erlang. HOPL III: Proceedings of the third ACM SIGPLAN conference on History of programming languages. ISBN 978-1-59593-766-7.
- ^ "How tech giants spread open source programming love - CIO.com". 8 January 2016.
- ^ "Erlang/OTP Released as Open Source, 1998-12-08". Archived from the original on 9 October 1999.
- ^ "Erlang, the mathematician?".
- ^ "Free Online Dictionary of Computing: Erlang".
- ^ "History of Erlang". Erlang.org.
- ^ Armstrong, Joe (August 1997). "The development of Erlang". ACM SIGPLAN Notices. 32 (8): 196–203. doi:10.1145/258948.258967. ISBN 0897919181. S2CID 6821037.
- ^ Däcker, Bjarne (October 2000). Concurrent Functional Programming for Telecommunications: A Case Study of Technology Introduction (PDF) (Thesis). Royal Institute of Technology. p. 37.
- ^ a b "question about Erlang's future". 6 July 2010.
- ^ "Concurrency Oriented Programming in Erlang" (PDF). 9 November 2002.
- ^ http://erlang.org/download/armstrong_thesis_2003.pdf[베어 URL PDF]
- ^ McGreggor, Duncan (26 March 2013). Rackspace takes a look at the Erlang programming language for distributed computing (Video). Rackspace Studios, SFO. Archived from the original on 11 December 2021. Retrieved 24 April 2019.
- ^ "Ericsson". Ericsson.com. 4 December 2014. Retrieved 7 April 2018.
- ^ "Inside Erlang, The Rare Programming Language Behind WhatsApp's Success". fastcompany.com. 21 February 2014. Retrieved 12 November 2019.
- ^ "Which companies are using Erlang, and why? #MyTopdogStatus". erlang-solutions.com. 11 September 2019. Retrieved 15 March 2020.
- ^ "Which new companies are using Erlang and Elixir? #MyTopdogStatus". erlang-solutions.com. 2 March 2020. Retrieved 24 June 2020.
- ^ "Erlang – List Comprehensions". erlang.org.
- ^ "String and Character Literals". Retrieved 2 May 2015.
- ^ "ect – Erlang Class Transformation – add object-oriented programming to Erlang – Google Project Hosting". Retrieved 2 May 2015.
- ^ a b Verraes, Mathias (9 December 2014). "Let It Crash". Mathias Verraes' Blog. Retrieved 10 February 2021.
- ^ "Reactive Design Patterns —". www.reactivedesignpatterns.com. Retrieved 10 February 2021.
- ^ Armstrong, Joe (September 2010). "Erlang". Communications of the ACM. 53 (9): 68–75. doi:10.1145/1810891.1810910.
Erlang is conceptually similar to the occam programming language, though it recasts the ideas of CSP in a functional framework and uses asynchronous message passing.
- ^ "Erlang Efficiency Guide – Processes". Archived from the original on 27 February 2015.
- ^ Wiger, Ulf (14 November 2005). "Stress-testing erlang". comp.lang.functional.misc. Retrieved 25 August 2006.
- ^ "Lock-free message queue". Retrieved 23 December 2013.
- ^ Armstrong, Joe. "Erlang robustness". Archived from the original on 23 April 2015. Retrieved 15 July 2010.
- ^ "Erlang Supervision principles". Archived from the original on 6 February 2015. Retrieved 15 July 2010.
- ^ "Erlang – Compilation and Code Loading". erlang.org. Retrieved 21 December 2017.
- ^ "High Performance Erlang". Retrieved 26 March 2011.
- ^ "Who uses Erlang for product development?". Frequently asked questions about Erlang. Retrieved 16 July 2007.
The largest user of Erlang is (surprise!) Ericsson. Ericsson use it to write software used in telecommunications systems. Many dozens of projects have used it, a particularly large one is the extremely scalable AXD301 ATM switch. Other commercial users listed as part of the FAQ include: Nortel, Deutsche Flugsicherung (the German national air traffic control organisation), and T-Mobile.
- ^ "Programming Erlang". Retrieved 13 December 2008.
Virtually all language use shared state concurrency. This is very difficult and leads to terrible problems when you handle failure and scale up the system...Some pretty fast-moving startups in the financial world have latched onto Erlang; for example, the Swedish www.kreditor.se.
- ^ "Erlang, the next Java". Archived from the original on 11 October 2007. Retrieved 8 October 2008.
I do not believe that other languages can catch up with Erlang anytime soon. It will be easy for them to add language features to be like Erlang. It will take a long time for them to build such a high-quality VM and the mature libraries for concurrency and reliability. So, Erlang is poised for success. If you want to build a multicore application in the next few years, you should look at Erlang.
- ^ Clarke, Gavin (5 February 2011). "Battlestar Galactica vets needed for online roleplay". Music and Media. The Reg. Retrieved 8 February 2011.
추가 정보
- Armstrong, Joe (2003). Making reliable distributed systems in the presence of software errors (PDF) (PhD). The Royal Institute of Technology, Stockholm, Sweden. Archived from the original (PDF) on 23 March 2015. Retrieved 13 February 2016.
- Armstrong, Joe (2007). "A history of Erlang". Proceedings of the third ACM SIGPLAN conference on History of programming languages – HOPL III. pp. 6–1. doi:10.1145/1238844.1238850. ISBN 978-1-59593-766-7. S2CID 555765.
- 비아르네 대커의 얼랑 초기 역사
- Mattsson, H.; Nilsson, H.; Wikstrom, C. (1999). "Mnesia – A distributed robust DBMS for telecommunications applications". First International Workshop on Practical Aspects of Declarative Languages (PADL '99): 152–163.
- Armstrong, Joe; Virding, Robert; Williams, Mike; Wikstrom, Claes (16 January 1996). Concurrent Programming in Erlang (2nd ed.). Prentice Hall. p. 358. ISBN 978-0-13-508301-7. Archived from the original on 6 March 2012.
- Armstrong, Joe (11 July 2007). Programming Erlang: Software for a Concurrent World (1st ed.). Pragmatic Bookshelf. p. 536. ISBN 978-1-934356-00-5.
- Thompson, Simon J.; Cesarini, Francesco (19 June 2009). Erlang Programming: A Concurrent Approach to Software Development (1st ed.). Sebastopol, California: O'Reilly Media, Inc. p. 496. ISBN 978-0-596-51818-9.
- Logan, Martin; Merritt, Eric; Carlsson, Richard (28 May 2010). Erlang and OTP in Action (1st ed.). Greenwich, CT: Manning Publications. p. 500. ISBN 978-1-933988-78-8.
- Martin, Brown (10 May 2011). "Introduction to programming in Erlang, Part 1: The basics". developerWorks. IBM. Retrieved 10 May 2011.
- Martin, Brown (17 May 2011). "Introduction to programming in Erlang, Part 2: Use advanced features and functionality". developerWorks. IBM. Retrieved 17 May 2011.
- Wiger, Ulf (30 March 2001). "Four-fold Increase in Productivity and Quality: Industrial-Strength Functional Programming in Telecom-Class Products" (PDF). FEmSYS 2001 Deployment on distributed architectures. Ericsson Telecom AB. Retrieved 16 September 2014.
외부 링크

