Elixir
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
Elixir는 호세 발림이 설계한, 얼랭 가상 머신(BEAM) 위에서 동작하는 함수형, 동시성 프로그래밍 언어이다. Erlang 생태계와의 호환성을 유지하면서 높은 확장성과 생산성을 목표로 개발되었으며, 루비, 얼랭, Clojure의 기능을 활용하여 대규모 사이트, 앱, 통신, 전자 상거래 및 금융 분야에서 사용된다. Elixir는 얼랭의 가상 머신(BEAM)을 기반으로 하며, 컴파일, 표현식, 메타프로그래밍, 다형성, 문서화, 동시성, 함수형 프로그래밍, 지연/비동기 처리, 패턴 매칭, 유니코드, 확장성 및 내결함성, 내장 도구, 대화형 REPL, 철도 지향 프로그래밍, 컴파일 시 코드 실행 등의 특징을 갖는다.
더 읽어볼만한 페이지
- 2012년 개발된 프로그래밍 언어 - 줄리아 (프로그래밍 언어)
줄리아는 2012년에 공개된 고수준 프로그래밍 언어로, 다중 디스패치, 동적 타입 시스템, C와 유사한 성능을 제공하며, 수치 계산, 과학 기술 계산 등에 활용된다. - 2012년 개발된 프로그래밍 언어 - 러스트 (프로그래밍 언어)
러스트는 모질라 재단 후원으로 개발된 시스템 프로그래밍 언어로서, 높은 안정성과 병렬성을 제공하며 메모리 안전성을 보장하고 효율적인 리소스 관리를 가능하게 하여 웹 브라우저 엔진, 운영체제, 웹 서비스 등 다양한 분야에서 활용되며 개발자들에게 인기가 높다. - 패턴 매칭 프로그래밍 언어 - AWK
AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다. - 패턴 매칭 프로그래밍 언어 - 하스켈
하스켈은 해스켈 커리의 이름을 딴 순수 함수형 프로그래밍 언어로, 여러 함수형 언어 통합 노력의 결과로 탄생하여 느긋한 계산법, 패턴 매칭, 타입 클래스, 모나드 등의 특징을 가지며 GHC가 표준 구현체로 사용된다. - 병행 프로그래밍 언어 - 자바 (프로그래밍 언어)
자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다. - 병행 프로그래밍 언어 - 스칼라 (프로그래밍 언어)
스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
Elixir - [IT 관련 정보]에 관한 문서 | |
---|---|
개요 | |
이름 | 엘릭서 |
설계자 | 호세 발림 |
발표 연도 | 2012년 |
특징 | |
프로그래밍 패러다임 | 다중 패러다임 프로그래밍 언어: 함수형 프로그래밍, 병행 프로그래밍, 분산 프로그래밍, 프로세스 지향 프로그래밍 |
타입 시스템 | 동적, 강 |
플랫폼 | 얼랭 |
기술 정보 | |
영향 받은 언어 | 클로저, 얼랭, 루비 |
영향을 준 언어 | 글림, LFE |
파일 확장자 | .ex, .exs |
라이선스 | |
라이선스 | 아파치 라이선스 2.0 |
웹사이트 | |
공식 웹사이트 | 엘릭서 공식 웹사이트 |
2. 역사
엘릭서 프로그래밍 언어는 호세 발림이 설계했으며, [http://plataformatec.com.br Plataformatec]의 연구 과제였다. 그는 얼랭 도구와 생태계를 계승하면서 얼랭 VM에서 작동하는 높은 확장성과 생산성을 가진 언어를 만들고자 했다.[23]
2. 1. 개발 배경
호세 발림은 [http://plataformatec.com.br Plataformatec]에서 연구 개발 프로젝트로 Elixir 프로그래밍 언어를 만들었다. 그의 목표는 얼랭 도구와 생태계를 계승하면서 얼랭 VM에서 작동하는 높은 확장성과 생산성을 가진 언어를 만드는 것이었다.[23][9][10]Elixir는 대규모 사이트와 앱을 목표로 한다. 루비, 얼랭 및 Clojure의 기능을 사용하여 높은 동시성과 낮은 지연 시간을 가진 언어를 개발하며, 대용량 데이터를 처리하도록 설계되었다. Elixir는 통신, 전자 상거래 및 금융 분야에서도 사용된다.[11]
2021년에는 Elixir 생태계에 머신 러닝, 신경망, GPU 컴파일, 데이터 처리 및 컴퓨팅 노트북을 도입하기 위해 Numerical Elixir 노력이 발표되었다.[12]
2. 2. 주요 특징 및 활용 분야
- 얼랭 가상 머신(BEAM)용 바이트 코드로 소스코드를 컴파일한다.[24]
- 모든 것은 expression이며, side effect를 동반하는 statement와는 다르다.[24]
- 런타임 영향 없이 얼랭 함수들을 엘릭서에서 호출할 수 있다.
- 메타 프로그래밍을 지원한다.[24]
- 프로토콜이라고 불리는 메카니즘에 의해 다형성을 지원하며, 클로저 reducers에서 영향을 받았다.[25]
- 마크다운 형식언어의 문서화를 지원한다.[24]
- 메시지 전달 방식을 지원한다.(Actor model)
- 루프 대신에 재귀와 고차원 함수를 강조한다.
- 얼랭의 메카니즘을 활용하여 경량 동시성을 지원한다. (e.g. ''Task'')[24]
- Lazy와 async collections을 지원한다.
- 패턴매칭을 지원한다.[24]
- 유니코드를 지원하며 스트링들은 UTF-8이다.
- Erlang의 가상 머신(BEAM) 위에서 동작한다.
- LISP의 매크로와 추상 구문 트리를 이용한 메타 프로그래밍을 지원한다.
- Clojure와 같은 프로토콜을 이용한 다형성을 지원한다.
- 메시지 전달 액터 모델을 이용한 공유 없음 아키텍처를 채용한다.
- 부작용이 일어나는 순환 구조 대신, 재귀와 고차 함수에 중점을 둔다.
- 구문은 모두 식으로 취급된다.
- 지연 평가와 비동기 처리를 지원한다.
- 표준으로 UTF-8 유니코드를 채용한다.
- 대규모 사이트와 앱을 목표로 하며, 루비, Erlang 및 Clojure의 기능을 사용하여 높은 동시성과 낮은 지연 시간을 가진 언어를 개발한다. 대용량 데이터를 처리하도록 설계되었다.
- 통신, 전자 상거래 및 금융 분야에서 사용된다.[11]
- 2021년에는 Elixir 생태계에 머신 러닝, 신경망, GPU 컴파일, 데이터 처리 및 컴퓨팅 노트북을 도입하기 위해 Numerical Elixir 노력이 발표되었다.[12]
2. 3. Numerical Elixir
2021년, Elixir 생태계에 머신 러닝, 신경망, GPU 컴파일, 데이터 처리 및 컴퓨팅 노트북을 도입하기 위한 Numerical Elixir 노력이 발표되었다.[12]3. 특징
Elixir는 얼랭 가상 머신(BEAM) 위에서 동작하며, Erlang과의 완벽한 상호 운용성을 제공한다.[24] 런타임에 영향을 주지 않고 얼랭 함수를 Elixir에서 호출할 수 있다.
Elixir는 다음과 같은 특징을 가진다:
- 메타프로그래밍 지원: 추상 구문 트리(AST)에 직접 접근하여 위생적인 메타프로그래밍을 지원한다.[24]
- 다형성 지원: 프로토콜 메커니즘을 통해 다형성을 지원하며, 클로저의 영향을 받았다.[25]
- 문서화 지원: Markdown 형식의 문서화를 지원한다.[24]
- 메시지 전달 방식 지원: 액터 모델을 기반으로 한 메시지 전달 방식을 지원한다.
- 재귀와 고차 함수 강조: 루프 대신 재귀와 고차 함수 사용을 강조한다.
- 경량 동시성 지원: 얼랭의 메커니즘을 활용하여 경량 동시성을 지원한다.[24]
- 지연 및 비동기 컬렉션 지원: 지연 계산법과 비동기 컬렉션을 지원한다.
- 패턴 매칭 지원: 패턴 매칭을 지원한다.[24]
- 유니코드 지원: 유니코드를 지원하며 문자열은 UTF-8 형식을 사용한다.
3. 1. 기본 특징
Elixir는 얼랭 가상 머신(BEAM) 위에서 동작하는 함수형, 동시성 프로그래밍 언어이다.[24] Elixir는 Erlang과 동일한 추상화 위에서 구축되어 분산, 내결함성, 실시간 소프트웨어 개발에 사용된다.Elixir의 주요 특징은 다음과 같다.
- 컴파일하여 바이트코드로 BEAM 가상 머신에서 실행되며, Erlang과 완전히 상호 운용 가능하며, 런타임에 영향을 미치지 않는다.[24]
- Erlang의 가볍고 동시성을 지원하는 메커니즘 덕분에 확장성과 내결함성을 가진다.
- 종속성 관리, 코드 컴파일, 테스트 실행, 코드 형식 지정, 원격 디버깅 등을 위한 내장 도구가 있다.
- 실행 중인 프로그램(예: Phoenix 웹 서버) 내에서 코드 재로드 및 내부 상태에 접근할 수 있는 대화형 REPL을 제공한다.
- 모든 것이 표현식이다.[24]
- 단언적 코드를 장려하기 위한 패턴 매칭을 지원한다.[24]
- 정적 분석 도구를 위한 타입 힌트가 있다.
- 다른 함수형 언어와 마찬가지로, 재귀와 고차 함수에 중점을 둔 불변 데이터와 부작용 기반의 반복 대신에 사용한다.
- 메시지 전달(액터 모델)을 통한 공유 없음 동시 프로그래밍을 지원한다.
- 스트림을 사용한 지연 평가 및 비동기 컬렉션을 지원한다.
- `with` 구문을 통한 철도 지향 프로그래밍을 지원한다.
- 추상 구문 트리 (AST)에 직접 접근하여 위생적인 메타프로그래밍을 지원한다.[24] 라이브러리는 종종 데이터베이스 또는 테스트와 같은 작은 도메인 특정 언어를 구현한다.
- 컴파일 시 코드 실행을 지원한다. Elixir 컴파일러 또한 BEAM에서 실행되므로, 컴파일 중인 모듈은 이미 컴파일된 코드를 즉시 실행할 수 있다.
- 프로토콜이라는 메커니즘을 통한 다형성을 지원한다.[25] Clojure와 같이 동적 디스패치를 지원하지만, Elixir 프로토콜은 단일 유형에 대해 디스패치하므로 다중 디스패치는 지원하지 않는다.
- Markdown 형식 언어로 Python과 유사한 docstring을 통한 문서화 지원을 한다.[24]
- 유니코드 및 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
```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는 얼랭의 가볍고 동시성을 지원하는 메커니즘을 활용하여 공유 없음 동시 프로그래밍을 지원한다.[24] 이는 메시지 전달(액터 모델)을 통해 이루어지며, 부작용이 발생하는 반복 구조 대신 재귀와 고차 함수를 사용하는 것을 강조한다. 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는 스트림을 사용한 지연 평가 및 비동기 컬렉션을 지원한다.[24]
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. 버전 관리
참조
[1]
웹사이트
elixir/LICENSE at master · elixir-lang/elixir · GitHub
https://github.com/e[...]
[2]
뉴스
Most Popular Programming Languages of 2018 - Elite Infoworld Blog
https://www.eliteinf[...]
2018-03-30
[3]
웹사이트
Elixir
https://elixir-lang.[...]
2013-02-17
[4]
웹사이트
ElixirConf
http://elixirconf.co[...]
2018-07-11
[5]
웹사이트
ElixirConf
http://elixirconf.eu[...]
2018-07-11
[6]
웹사이트
Erlang & Elixir Fest
https://elixir-fest.[...]
2019-02-18
[7]
웹사이트
Elixir LDN
http://www.elixir.lo[...]
2018-07-12
[8]
웹사이트
EMPEX - Empire State Elixir Conference
http://empex.co/
2018-07-12
[9]
AV media
Elixir - A modern approach to programming for the Erlang VM
http://vimeo.com/532[...]
2013-02-17
[10]
AV media
José Valim - ElixirConf EU 2017 Keynote
https://www.youtube.[...]
2017-07-14
[11]
웹사이트
Behinde the code: The One Who Created Elixir
https://www.welcomet[...]
2019-11-25
[12]
웹사이트
Numerical Elixir (Nx)
https://github.com/e[...]
2024-05-06
[13]
Citation
Elixir is a dynamic, functional language designed for building scalable and maintainable applications: elixir-lang/elixir
https://github.com/e[...]
Elixir
2019-04-21
[14]
웹사이트
Elixir
https://elixir-lang.[...]
2014-09-07
[15]
웹사이트
Writing assertive code with Elixir
http://blog.platafor[...]
2014-09-24
[16]
서적
Erlang and Elixir for Imperative Programmers
https://leanpub.com/[...]
Leanpub
2015-05-12
[17]
웹사이트
Railway Oriented Programming
https://fsharpforfun[...]
2013-05
[18]
웹사이트
Elixir
http://elixir-lang.o[...]
2013-02-17
[19]
AV media
Elixir - A modern approach to programming for the Erlang VM
http://vimeo.com/532[...]
2013-02-17
[20]
웹인용
Elixir Protocols
http://elixir-lang.o[...]
2016-11-18
[21]
웹인용
Elixir Quote and unquote
http://elixir-lang.o[...]
2016-11-18
[22]
웹인용
Elixir Macros
http://elixir-lang.o[...]
2016-11-18
[23]
웹인용
Elixir - A modern approach to programming for the Erlang VM
http://vimeo.com/532[...]
2013-02-17
[24]
웹인용
Elixir
http://elixir-lang.o[...]
2014-09-07
[25]
웹인용
Elixir Enumerable
https://pminten.gith[...]
2014-09-07
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com