Elixir

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

1. 개요

Elixir는 호세 발림이 설계한, 얼랭 가상 머신(BEAM) 위에서 동작하는 함수형, 동시성 프로그래밍 언어이다. Erlang 생태계와의 호환성을 유지하면서 높은 확장성과 생산성을 목표로 개발되었으며, 루비, 얼랭, Clojure의 기능을 활용하여 대규모 사이트, 앱, 통신, 전자 상거래 및 금융 분야에서 사용된다. Elixir는 얼랭의 가상 머신(BEAM)을 기반으로 하며, 컴파일, 표현식, 메타프로그래밍, 다형성, 문서화, 동시성, 함수형 프로그래밍, 지연/비동기 처리, 패턴 매칭, 유니코드, 확장성 및 내결함성, 내장 도구, 대화형 REPL, 철도 지향 프로그래밍, 컴파일 시 코드 실행 등의 특징을 갖는다.

Elixir - [IT 관련 정보]에 관한 문서
개요
이름엘릭서
설계자호세 발림
발표 연도2012년
특징
프로그래밍 패러다임다중 패러다임 프로그래밍 언어: 함수형 프로그래밍, 병행 프로그래밍, 분산 프로그래밍, 프로세스 지향 프로그래밍
타입 시스템동적, 강
플랫폼얼랭
기술 정보
영향 받은 언어클로저, 얼랭, 루비
영향을 준 언어글림, LFE
파일 확장자.ex, .exs
라이선스
라이선스아파치 라이선스 2.0
웹사이트
공식 웹사이트엘릭서 공식 웹사이트
📚 더 읽어볼만한 페이지
  • 2012년 개발된 프로그래밍 언어 - 줄리아 (프로그래밍 언어)
    줄리아는 2012년에 공개된 고수준 프로그래밍 언어로, 다중 디스패치, 동적 타입 시스템, C와 유사한 성능을 제공하며, 수치 계산, 과학 기술 계산 등에 활용된다.
  • 2012년 개발된 프로그래밍 언어 - 러스트 (프로그래밍 언어)
    러스트는 모질라 재단 후원으로 개발된 시스템 프로그래밍 언어로서, 높은 안정성과 병렬성을 제공하며 메모리 안전성을 보장하고 효율적인 리소스 관리를 가능하게 하여 웹 브라우저 엔진, 운영체제, 웹 서비스 등 다양한 분야에서 활용되며 개발자들에게 인기가 높다.
  • 병행 프로그래밍 언어 - 자바 (프로그래밍 언어)
    자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다.
  • 병행 프로그래밍 언어 - 스칼라 (프로그래밍 언어)
    스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
  • 아파치 라이선스 소프트웨어 - 안드로이드 (운영체제)
    구글이 개발한 리눅스 커널 기반의 모바일 운영체제인 안드로이드는 오픈소스 플랫폼으로 다양한 기기에서 활용되며 세계적으로 널리 사용되지만, 개인정보 보호 문제와 독점적 지위 남용 논란 등의 비판도 존재한다.
  • 아파치 라이선스 소프트웨어 - 쿠버네티스
    쿠버네티스는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링, 관리하는 오픈 소스 시스템으로, 구글의 Borg 시스템에서 영감을 받아 설계되었으며 파드, 서비스 등의 기능을 제공하여 클라우드 네이티브 환경에서 중요한 역할을 한다.

2. 역사

엘릭서 프로그래밍 언어는 호세 발림이 설계했으며, [http://plataformatec.com.br Plataformatec]의 연구 과제였다. 그는 얼랭 도구와 생태계를 계승하면서 얼랭 VM에서 작동하는 높은 확장성과 생산성을 가진 언어를 만들고자 했다.

2.1. 개발 배경

호세 발림은 [http://plataformatec.com.br Plataformatec]에서 연구 개발 프로젝트로 Elixir 프로그래밍 언어를 만들었다. 그의 목표는 얼랭 도구와 생태계를 계승하면서 얼랭 VM에서 작동하는 높은 확장성과 생산성을 가진 언어를 만드는 것이었다.

Elixir는 대규모 사이트와 앱을 목표로 한다. 루비, 얼랭 및 Clojure의 기능을 사용하여 높은 동시성과 낮은 지연 시간을 가진 언어를 개발하며, 대용량 데이터를 처리하도록 설계되었다. Elixir는 통신, 전자 상거래 및 금융 분야에서도 사용된다.

2021년에는 Elixir 생태계에 머신 러닝, 신경망, GPU 컴파일, 데이터 처리 및 컴퓨팅 노트북을 도입하기 위해 Numerical Elixir 노력이 발표되었다.

2.2. 주요 특징 및 활용 분야

* 얼랭 가상 머신(BEAM)용 바이트 코드로 소스코드를 컴파일한다.
* 모든 것은 expression이며, side effect를 동반하는 statement와는 다르다.
* 런타임 영향 없이 얼랭 함수들을 엘릭서에서 호출할 수 있다.
* 메타 프로그래밍을 지원한다.
* 프로토콜이라고 불리는 메카니즘에 의해 다형성을 지원하며, 클로저 reducers에서 영향을 받았다.
* 마크다운 형식언어의 문서화를 지원한다.
* 메시지 전달 방식을 지원한다.(Actor model)
* 루프 대신에 재귀와 고차원 함수를 강조한다.
* 얼랭의 메카니즘을 활용하여 경량 동시성을 지원한다. (e.g. Task)
* Lazy와 async collections을 지원한다.
* 패턴매칭을 지원한다.
* 유니코드를 지원하며 스트링들은 UTF-8이다.
* Erlang의 가상 머신(BEAM) 위에서 동작한다.
* LISP의 매크로와 추상 구문 트리를 이용한 메타 프로그래밍을 지원한다.
* Clojure와 같은 프로토콜을 이용한 다형성을 지원한다.
* 메시지 전달 액터 모델을 이용한 공유 없음 아키텍처를 채용한다.
* 부작용이 일어나는 순환 구조 대신, 재귀고차 함수에 중점을 둔다.
* 구문은 모두 으로 취급된다.
* 지연 평가와 비동기 처리를 지원한다.
* 표준으로 UTF-8 유니코드를 채용한다.
* 대규모 사이트와 앱을 목표로 하며, 루비, Erlang 및 Clojure의 기능을 사용하여 높은 동시성과 낮은 지연 시간을 가진 언어를 개발한다. 대용량 데이터를 처리하도록 설계되었다.
* 통신, 전자 상거래 및 금융 분야에서 사용된다.
* 2021년에는 Elixir 생태계에 머신 러닝, 신경망, GPU 컴파일, 데이터 처리 및 컴퓨팅 노트북을 도입하기 위해 Numerical Elixir 노력이 발표되었다.

2.3. Numerical Elixir

2021년, Elixir 생태계에 머신 러닝, 신경망, GPU 컴파일, 데이터 처리 및 컴퓨팅 노트북을 도입하기 위한 Numerical Elixir 노력이 발표되었다.

3. 특징

Elixir는 얼랭 가상 머신(BEAM) 위에서 동작하며, Erlang과의 완벽한 상호 운용성을 제공한다. 런타임에 영향을 주지 않고 얼랭 함수를 Elixir에서 호출할 수 있다.

Elixir는 다음과 같은 특징을 가진다:

* [[메타프로그래밍]] 지원: 추상 구문 트리(AST)에 직접 접근하여 위생적인 메타프로그래밍을 지원한다.
* [[다형성 (컴퓨터 과학)|다형성]] 지원: 프로토콜 메커니즘을 통해 다형성을 지원하며, 클로저의 영향을 받았다.
* 문서화 지원: Markdown 형식의 문서화를 지원한다.
* 메시지 전달 방식 지원: 액터 모델을 기반으로 한 메시지 전달 방식을 지원한다.
* [[재귀 함수|재귀]]와 [[고차 함수]] 강조: 루프 대신 재귀와 고차 함수 사용을 강조한다.
* 경량 [[동시성 프로그래밍|동시성]] 지원: 얼랭의 메커니즘을 활용하여 경량 동시성을 지원한다.
* [[지연 계산법|지연]] 및 [[Futures and promises|비동기 컬렉션]] 지원: 지연 계산법과 비동기 컬렉션을 지원한다.
* [[패턴 매칭]] 지원: 패턴 매칭을 지원한다.
* [[유니코드]] 지원: 유니코드를 지원하며 문자열은 UTF-8 형식을 사용한다.

3.1. 기본 특징

Elixir는 얼랭 가상 머신(BEAM) 위에서 동작하는 함수형, 동시성 프로그래밍 언어이다. Elixir는 Erlang과 동일한 추상화 위에서 구축되어 분산, 내결함성, 실시간 소프트웨어 개발에 사용된다.

Elixir의 주요 특징은 다음과 같다.

* 컴파일하여 바이트코드로 BEAM 가상 머신에서 실행되며, Erlang과 완전히 상호 운용 가능하며, 런타임에 영향을 미치지 않는다.
* Erlang의 가볍고 동시성을 지원하는 메커니즘 덕분에 확장성과 내결함성을 가진다.
* 종속성 관리, 코드 컴파일, 테스트 실행, 코드 형식 지정, 원격 디버깅 등을 위한 내장 도구가 있다.
* 실행 중인 프로그램(예: Phoenix 웹 서버) 내에서 코드 재로드 및 내부 상태에 접근할 수 있는 대화형 REPL을 제공한다.
* 모든 것이 표현식이다.
* 단언적 코드를 장려하기 위한 패턴 매칭을 지원한다.
* 정적 분석 도구를 위한 타입 힌트가 있다.
* 다른 함수형 언어와 마찬가지로, 재귀고차 함수에 중점을 둔 불변 데이터와 부작용 기반의 반복 대신에 사용한다.
* 메시지 전달(액터 모델)을 통한 공유 없음 동시 프로그래밍을 지원한다.
* 스트림을 사용한 지연 평가 및 비동기 컬렉션을 지원한다.
* `with` 구문을 통한 철도 지향 프로그래밍을 지원한다.
* 추상 구문 트리 (AST)에 직접 접근하여 위생적인 메타프로그래밍을 지원한다. 라이브러리는 종종 데이터베이스 또는 테스트와 같은 작은 도메인 특정 언어를 구현한다.
* 컴파일 시 코드 실행을 지원한다. Elixir 컴파일러 또한 BEAM에서 실행되므로, 컴파일 중인 모듈은 이미 컴파일된 코드를 즉시 실행할 수 있다.
* 프로토콜이라는 메커니즘을 통한 다형성을 지원한다. Clojure와 같이 동적 디스패치를 지원하지만, Elixir 프로토콜은 단일 유형에 대해 디스패치하므로 다중 디스패치는 지원하지 않는다.
* Markdown 형식 언어로 Python과 유사한 docstring을 통한 문서화 지원을 한다.
* 유니코드 및 UTF-8 문자열을 지원한다.

4. 문법 및 예제

Elixir는 함수형 프로그래밍 언어로, 다양한 문법적 특징을 가지고 있다.

아래 예제는 `iex` 셸에서 실행되거나 파일에 저장될 수 있으며 `elixir ''` 과 같이 커맨드라인으로 실행할 수 있다.

```elixir
1..5
|> Task.async_stream(&File.read!("#{&1}.txt"))
|> Stream.filter(fn {:ok, contents} -> String.trim(contents) != "" end)
|> Enum.join("\n")
```

위 코드는 1부터 5까지의 숫자에 대해 각각 비동기적으로 파일을 읽어온다. 각 파일의 내용은 빈 줄을 제외하고 결합된다.

```elixir
def fib(n) when n in [0, 1], do: n
def fib(n), do: fib(n-2) + fib(n-1)
```

위 코드는 가드를 사용하여 함수의 다형성을 구현하는 예시이다.

```elixir
schema "weather" do
field :city # 기본값은 :string 타입
field :temp_lo, :integer
field :temp_hi, :integer
field :prcp, :float, default: 0.0
end

Weather |> where(city: "Kraków") |> order_by(:temp_lo) |> limit(10) |> Repo.all
```

위 코드는 Ecto 라이브러리를 사용한 관계형 데이터베이스의 사용 예시이다.

Elixir는 Hello world, 리스트 컴프리헨션, 패턴 매칭, 파이프 연산자, 모듈, 동시성 프로그래밍, 스트림, 가드 등 다양한 기능을 제공한다.

4.1. Hello world

다음은 `iex` 셸에서 실행하거나, 파일에 저장하여 명령 줄에서 `elixir `를 입력하여 실행할 수 있는 전형적인 Hello world 예제이다.

```elixir
iex> IO.puts("Hello World!")
Hello World!

4.2. 컴프리헨션

elixir
for n <- [1,2,3,4,5], rem(n,2) == 1, do: n*n
#=> [1, 9, 25]
```

위 코드는 리스트 컴프리헨션의 예시이다. `n`은 1부터 5까지의 값을 가지며, `rem(n, 2) == 1` 조건을 만족하는, 즉 홀수인 경우에만 `n*n` (n의 제곱)을 계산하여 리스트로 반환한다. 결과는 `[1, 9, 25]`이다.

4.3. 패턴 매칭

elixir
[1, a] = [1, 2]
# a => 2

{:ok, [hello: a]} = {:ok, [hello: "world"]}
# a => "world"
```

Elixir에서 패턴 매칭은 변수에 값을 할당하는 강력한 방법이다. 위 예제에서처럼, 리스트나 튜플의 구조를 이용하여 각 요소에 해당하는 변수에 값을 할당할 수 있다.

4.4. 파이프 연산자

elixir
"Elixir" |> String.graphemes() |> Enum.frequencies()
```

위 코드는 "Elixir" 문자열을 글자 단위로 분해한 후, 각 글자의 빈도를 계산한다.

```elixir
%{values: 1..5} |> Map.get(:values) |> Enum.map(& &1 * 2)
```

위 코드는 1부터 5까지의 숫자를 포함하는 맵에서 `:values` 키에 해당하는 값을 가져온 후, 각 값에 2를 곱한다.

```elixir
|> Enum.sum()
```

위 코드는 앞선 연산 결과로 나온 숫자 목록의 합계를 계산한다.

4.5. 모듈

elixir
defmodule Fun do
def fib(0), do: 0
def fib(1), do: 1
def fib(n) do
fib(n - 2) + fib(n - 1)
end
end

4.6. 동시성

Elixir는 얼랭의 가볍고 동시성을 지원하는 메커니즘을 활용하여 공유 없음 동시 프로그래밍을 지원한다. 이는 메시지 전달(액터 모델)을 통해 이루어지며, 부작용이 발생하는 반복 구조 대신 재귀고차 함수를 사용하는 것을 강조한다. Elixir는 지연 평가 및 비동기 컬렉션도 지원한다.

다음은 1000개의 프로세스를 순서대로 시작하는 Elixir 코드 예시이다.

```elixir
for num <- 1..1000, do: spawn fn -> IO.puts "#{num * 2}" end
```

다음은 비동기 실행을 위한 Task 모듈 활용 예시이다.

```elixir
task = Task.async fn -> perform_complex_action() end
other_time_consuming_action()
Task.await task

4.7. 스트림

Elixir는 스트림을 사용한 지연 평가 및 비동기 컬렉션을 지원한다.

4.8. 가드

Elixir는 패턴 매칭을 지원하여 단언적 코드를 장려한다.

4.9. Ecto (데이터베이스 라이브러리)

elixir
schema "weather" do
field :city # 기본값은 :string 타입
field :temp_lo, :integer
field :temp_hi, :integer
field :prcp, :float, default: 0.0
end

Weather |> where(city: "Kraków") |> order_by(:temp_lo) |> limit(10) |> Repo.all

5. 버전 관리

Elixir영어의 각 마이너 버전은 특정 범위의 오픈 텔레콤 플랫폼(OTP) 버전을 지원한다.