기술 동향

History of Erlang

gozalex 2020. 6. 25. 13:53

 

 

Erlang

 

Wikipedia (2017a) 따르면 Erlang "영원히 실행되는"동시 프로그램을 작성하도록 설계된 기능적 프로그래밍 언어입니다. Erlang 현재 프로세스를 사용하여 프로그램을 구성합니다. 이러한 프로세스는 공유 메모리가 없고 비동기 메시지 전달을통해 통신하며, 운영 체제가 아닌 가벼운 언어에 속합니다.

 

Erlang 또한 코드를 변경하고 패치를 즉시 추가하므로 런타임 중에 프로그램을 업데이트   있으므로 프로그램을 다시시작할 필요가 없습니다. 이러한 메커니즘은 논스톱 시스템을 구현하기위한 소프트웨어 구성을 단순화합니다. (Joe Armstrong. Erlang 역사, Ericsson AB)

 

Erlang 함수형 프로그래밍 언어 제품군에 속하므로 일상적인 개발 접근 방식과 방법에는  가지 근본적인 차이점이 있습니다. Erlang 모든 변수는 Single-assign 입니다. , 변수가 특정 값에 할당되면 다른 값으로 다시 할당   없습니다. 비슷한 기능을 가진 다른 프로그래밍 언어에서 가장 가까운 예는 Java "final" 키워드입니다. 변수  할당이 없으면 언어의 루프 구성은 연속적인 반복에서 변수를 변경할  있는 방법이 없기 때문에 의미가 없습니다. 언어에서 루핑 메커니즘을 모방  있는 모든 제어는 재귀 호출에 의해 수행됩니다. Erlang 구문  내부 언어 기능 외에도 HTTP  SSH 클라이언트, 서버, SNMP 기능  내장 NoSQL 데이터베이스 서버를 포함하는 거대한 표준 라이브러리가 있습니다.

 

실제 Erlang 개발은 1986  Ericsson Computer Science 연구소에서 이루어졌습니다.  팀은 차세대 통신 제품을 프로그래밍하기에 적합한 프로그래밍 언어를 조사하는 임무를 부여 받았으며, 이들은 보다 나은 전화 통신 프로그래밍 방법을 제공해야했습니다. 당시 전화 응용 프로그램은 현재 사용중인 응용 프로그램과 매우 다릅니다. 그것들은 평범한 프로그래밍 언어들이해결하도록 고안된 많은 문제들을 가지고있었습니다. 이러한 응용 프로그램은 본질적으로 단일 동시성이 뛰어납니다

switch 수만 또는 수십만 건의 트랜잭션을 처리해야합니다. 트랜잭션이 분산되고 소프트웨어는 내결함성이 높을 것으로 예상됩니다.

 

Joe Armstrong (Ericsson AB Erlang 역사) 다음과 같이 말합니다. “전화를 제어하는 ​​소프트웨어에 장애가 발생하면신문에 기사가 납니다. 반면에 일반적인 데스크톱 응용 프로그램에 장애가 발생해도 신문에 기사가 나는 일은 발생하지 않습니다.”

전화 통신 응용 프로그램에서 발생하는 서비스 손실없이 시스템이 실행되는 동안 소프트웨어가 업데이트되는 것이 매우 중요합니다. 또한 "Soft real time" 도메인에서 작동해야 하며 일부 작업에는 엄격한 타이밍 요구 사항이 있지만 다른 클래스의 작업에는 타이밍이  간단해야 합니다.

 

Erlang  다른 요구 사항은 가동 중지 시간이 거의 없어야 하는 것이었습니다. 당시 인터넷의 인기가 높아지고 중단 없는 서비스 가용성이 필요해지면서 Erlang 해결할  있는 문제가 확대되었습니다. 예를 들어, 동적 코드 업그레이드를 사용하여 하루에 수백만 건의 요청을 처리하는 논스톱  서버를 구축하는 것은 소프트웨어 교환을 제어하기 위해 소프트웨어를 구축하는것과 매우 유사합니다.

 

일반적으로 통화 제어용 소프트웨어는 프로토콜 메시지에 대한 응답으로 상태 전이를 수행하는 제한된 수의 상태 기기를 사용하여 모델링 됩니다. 소프트웨어 관점에서   시스템은 매우  병렬 프로세스 모음으로 작동합니다. 어느 시점에서든 대부분의프로세스는 메시지 수신 또는 타이머 트리거로 인한 이벤트를 기다리고 있습니다. 이벤트가 발생하면 프로세스는 어느 정도의계산을 수행하고 상태를 변경하며 다른 프로세스로 메시지를 보낸  다음 이벤트를 기다립니다. 계산에 소요되는 시간은 매우적습니다. 반면, 모든 스위칭 시스템은 수십만 개의 매우 가벼운 프로세스를 처리   ​​있어야하는데,  프로세스는 거의 계산을 수행하지 않습니다. 또한 프로세스의 소프트웨어 오류로 인해 시스템이 충돌하거나 시스템의 다른 프로세스가 손상되지 않아야 합니다.  문제는 너무 많은 수의 프로세스가 있는 시스템에서 프로세스를 메모리 손상 문제로부터 보호해야한다는 점이었습니다. 포인터가 있는 언어에서는 프로세스의 메모리 하한을 할당하여 메모리 관리 하드웨어를 사용하여 프로세스를 서로 보호합니다. 또한 메모리가 개별 프로세스에 대한 권장 요구 사항은 매우 작을  있으며 메모리 보호 하드웨어없이 모든 프로세스에대한 모든 메모리가 동일한 주소 공간에 있을  있습니다. Erlang에서 프로세스는 실제로 기본 운영 체제가 아닌 언어 자체의일부입니다. 언어는 메모리 관리와 병렬 프로세스  보호를 모두 제공하기 때문에 운영 체제의 대부분의 서비스가 필요하지 않습니다. 하드웨어에 액세스하는  필요한 리소스 할당  장치 드라이버와 같은 다른 운영 체제 서비스는 C 작성되며Erlang 런타임에 동적으로 연결됩니다.

 

프로그래밍 언어의  가지 속성은 동시 언어 또는 운영 체제의 효율적인 운영을 위한 핵심 요소였습니다.

 

1. 프로세스 생성 시간

2.  가지 프로세스간에 컨텍스트 전환 시간

3.  프로세스 사이의 메시지 복사 시간

 

Joe Armstrong (Ericsson AB Erlang 역사) 다음과 같이 말합니다.Erlang 가장 초기 모티브는“PLEX 같은 것을만들어 일반 하드웨어에서   실행하는 것” 이었습니다.

Erlang 대한 아이디어는 PLEX  AXE 디자인에서 크게 상속되었습니다. PLEX AXE 전화 교환 전용의 특수 목적의 이벤트 중심 실시간 프로그래밍 언어입니다. 그러한 아이디어  하나는 코드를 “즉석에서” 변경할  있는 가능성이었습니다. 따라서 AXE 수많은 전화 통화의 병렬 조작과 같은 "포인터"문제가 있었습니다.  호출에 대한 메모리 요구 사항은 가변적이며링크  목록과 포인터 조작을 사용하여 메모리가 할당되었습니다. 이로 인해 많은 오류가 발생했습니다. 이것은 Erlang에서 사용  프로세스  가비지 수집 메모리 전략에서 영감을 얻은 것입니다.

AXE / PLEX 문화에서 비롯된 최종 핵심 아이디어는 프로세스  하드웨어의 장애가 처리 중인 트랜잭션에만 영향을 미치고다른 모든 작업은 그대로 유지되고 실행되어야 한다는 것입니다. 이로 인해 Erlang 디자인이 단순화되고 프로세스  교수형 포인터가 제거되었습니다.

 

메시지 전달은 다른 프로세스의 메모리 공간 사이에 메시지 버퍼를 복사하여 구현되었습니다. 내결함성을 달성하기 위해 팀은오류 처리가 어려운 문제로 인해 프로세스간에 리소스를 공유한다는 모든 아이디어를 거부했으며 시스템의 다른 부분에서 문제가 발생하면 모든 프로세스에 계속 실행하기에 충분한 로컬 정보가 있어야한다고 결정했습니다. 따라서 시스템을 안정적으로 유지하기 위해 프로세스간에 데이터를 복사하여 다른 프로세스가 충돌하는 경우 프로세스가 자체적으로 계속 실행하기에 충분한데이터를 갖도록 했습니다.

 

AXE / PLEX 히스토리  내부 아키텍처로 인해 새로운 프로그래밍 언어마다 필요한 요구 사항 목록이 제공되었습니다. (Joe Armstrong. Erlang 역사, Ericsson AB.)

 

 목록에는 다음이 포함됩니다.

 

1.     매우 많은 수의 동시 활동 처리

2.     특정 시간 내에 특정 시점에 수행  작업

3.     여러 컴퓨터에 분산  시스템

4.     하드웨어와의 상호 작용

5.     매우  소프트웨어 시스템

6.     기능 통합과 같은 복잡한 기능

7.     시스템을 중지하지 않고 소프트웨어 유지 관리 (재구성 )

8.     엄격한 품질  신뢰성 요구 사항

9.     하드웨어 오류  소프트웨어 오류에 대한 내결함성

 

이러한 요구 사항은 매우 간단 했으며 기존 시스템은 이미 운영 체제  응용 프로그램 라이브러리에서 이미 일부를 해결했습니다. 그럼에도 불구하고 모든 요구 사항을 충족시키기 위해 당시 사용 가능한 모든 프로그래밍 언어로 통신 응용 프로그램을Proto-typing하는 실험을 계속하기로 결정했습니다.

 

 

 문서는 Building Analytics Plugin for Erlang MQTT Broker by Damir Mustafin 문서  일부를 번역하였습니다.

 

 

다음은 CentOS 8에 Erlang을 설치하기 위한 repo 설정입니다.

erlang.org에서 repo를 찾을 수 없어 rabbitmq의 repo를 사용한 모습입니다.

기존 방식으로 install 하면 많은 dependancy가 우선 해결되어야 합니다.

# In /etc/yum.repos.d/rabbitmq-erlang.repo

[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/23/el/8
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1

 

Elixir를 소스로 인스톨 합니다

git clone https://github.com/elixir-lang/elixir.git

make clean test

 

Precompiled 버전으로 인스톨 합니다.

wget https://github.com/elixir-lang/elixir/releases/download/v1.10.4/Precompiled.zip

# vi /etc/profile
export PATH="$PATH:/usr/bin/elixir/bin
source /etc/profile

elixir -v