Elixir Lang 소개

게시 됨: 2015-02-27

Elixir 프로그래밍 언어 소개(그리고 내가 그것을 사랑하는 이유)

몇 달 전에 Golang을 소개하는 기사를 썼고, 제가 왜 Golang을 그렇게 좋아했는지도 알 수 있습니다. 나는 여전히 그것을 사랑하지만 최근에는 새로운 언어를 가지고 놀고 있습니다. 비약. 나는 Programming Elixir라는 책을 사서 그것을 따라하고 있다. 저는 이미 Elixir를 사랑하게 되었고 이 기사에서 그 이유를 보여드리고 싶습니다.

몇 년 전 Couchbase에서 일하면서 Erlang과 분산 시스템에 큰 관심을 보였습니다. 저에게 Erlang은 혼란스럽습니다. Elixir를 보았을 때 나는 즉시 내가 좋은 것을 찾고 있다는 것을 알았습니다. Elixir는 Erlang VM 위에서 실행되는 기능적 동시성 언어로 자세히 설명되어 있습니다.

Elixir가 'Ruby for Erlang'이라고 말하는 사람들을 많이 들었습니다. 이 이론이 완전히 틀린 것은 아니지만, 현실적으로는 Ruby의 영향을 받는 것은 주로 Elixir의 구문일 뿐입니다. 많은 동일한 프로그래밍 구성. 물론 Erlang VM 위에 구축되고 기본적으로 Erlang 기본 요소에 직접 액세스할 수 있다는 점에서 Erlang과 유사합니다.

어쨌든, 더 이상 망설이지 말고, 엘릭서에 빠져들어 봅시다.

설치

OSX에서 실행 중인 경우 설치는 Homebrew를 사용하는 것만큼 쉽습니다.
~ brew update
~ brew install erlang
~ brew install elixir

이 작업을 완료하면 다음을 실행할 수 있습니다.

~ elixir -v
> Elixir 1.0.2

이제 Elixir가 제대로 설치되었으므로 Interactive Elixir 를 열고 몇 가지 기본 공통 유형을 가지고 놀 수 있습니다.

엘릭서의 종류

다음을 입력하여 Interactive Elixir REPL을 시작하십시오.
> iex

변수:

iex(1)> name = "rbin"
#=> "rbin"

원자:

Elixir에서 Atom은 이름이 자체 값인 상수입니다.
iex(2)> :this_is_an_atom
#=> :this_is_an_atom
iex(3)> :my_atom == :atom
#=> false

튜플:

중괄호 표기법을 사용하여 튜플을 정의합니다. Elixir에서 Tuple은 즉시 메모리에 저장됩니다. 즉, Tuple의 크기를 얻거나 Tuple 요소에 액세스하는 것은 빠르지만 요소를 업데이트하거나 추가하는 것은 메모리에 전체 튜플을 복사해야 하기 때문에 비용이 많이 듭니다.

iex(4)> tuple = {:hello, "world"}
#=> {:hello, "world"}
iex(5)> elem(tuple, 1)
#=> "world"

기울기:

Elixir에서 목록은 연결 목록으로 메모리에 저장됩니다. 요소를 추가하여 목록을 간단하게 업데이트할 수 있지만 요소를 추가하는 것은 크기를 파악하기 위해 전체 목록을 탐색해야 하므로 비용이 더 많이 듭니다.

iex(8)> list = [1, 2, :atom]
#=> [1, 2, :atom]
iex(9)> ["string"] ++ list
#=> ["string", 1, 2, :atom]
iex(10)> list ++ [31]
#=> [1, 2, :atom, 31]

목록의 Head & Tail 가져오기를 포함하여 목록과 함께 사용할 수 있는 매우 유용한 내장 함수가 있습니다.

iex(11)> hd(list)
#=> 1
iex(12)> tl(list)
#=> [2, :atom]

익명 기능:

Elixir에서 함수는 일급 시민입니다. 즉, 다른 함수에 대한 인수로 함수를 전달할 수 있습니다. 아래에서 함수를 포함하는 add 라는 변수를 정의한 다음 is_function/1 func 에 인수로 전달할 것입니다.

iex(14)> add = fn a, b -> a + b end
#Function<12.90072148/2 in :erl_eval.expr/5>

iex(15)> add.(13, 31)
#=> 44

iex(16)> is_function(add)
#=> true

프로젝트 구성(믹스)

Elixir는 Mix라는 매우 유용한 도구와 함께 제공됩니다. Mix는 프로젝트를 매우 쉽게 생성, 구성, 컴파일 및 테스트할 수 있는 빌드 도구입니다. 또한 종속성을 쉽게 관리할 수 있습니다. (항상 민감한 주제입니다!) Mix로 새 프로젝트를 생성하려면 다음을 수행하기만 하면 됩니다.
~ mix new myapp --module MyApp
그러면 내부에 몇 개의 파일이 있는 myapp 이라는 디렉토리가 생성됩니다. 또한 lib/myapp.ex 내부에 MyApp 모듈을 정의합니다.
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/myapp.ex
* creating test
* creating test/test_helper.exs
* creating test/myapp_test.exs


Your mix project was created successfully.
You can use mix to compile it, test it, and more:

cd myapp
mix test

보시다시피 기본 프로젝트 구조에 필요한 모든 파일을 얻습니다. 이것이 Elixir와 함께 제공되는 더 좋은 기능 중 하나라고 생각합니다. 프로젝트 관리 도구가 있으면 매우 유용하고 시간을 크게 절약할 수 있습니다.

mix.exs 파일은 프로젝트를 구성하고 종속성 등을 관리하는 데 사용되는 기본 파일입니다. 우리는 프로젝트에 대한 매우 루비 같은 테스트 를 작성할 수 있는 test/folder 를 얻습니다. 물론 우리는 프로젝트의 소스 파일을 포함하는 lib/folder 를 얻습니다. 앱에서 혼합 테스트 를 실행하면 다음을 얻습니다.
$ mix test
Compiled lib/myapp.ex
Generated myapp.app
.

Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 tests, 0 failures

Randomized with seed 543313

동시성

Erlang과 마찬가지로 Elixir는 동시성을 위해 '액터' 모델을 사용합니다. 우리의 모든 코드는 Processes 내부에서 실행되며 이러한 프로세스는 서로 격리되어 있습니다. 우리는 프로세스를 생성하고 프로세스 사이에서 메시지를 주고 받음 으로써 Elixir에서 완전한 동시 프로그램을 만들 수 있습니다.

Elixir에서는 다른 함수를 인수로 사용하는 spawn 함수를 사용하여 프로세스를 시작합니다.

iex(1)> spawn(fn -> IO.puts 1 + 1 end)
#=> 2
#PID<0.55.0>

보시다시피 1 + 1을 출력하는 프로세스를 생성하고 프로세스 ID도 반환했습니다. 이 프로세스 ID를 반환하는 것은 변수에 할당하고 프로세스에 메시지를 보내는 데 사용할 수 있으므로 유용합니다. 그렇게 하기 전에 프로세스에 보내는 메시지를 얻기 위해 수신 메커니즘을 만들어야 합니다. (우리는 Interative Elixir 세션에서 한 줄씩 이 작업을 수행할 수 있습니다.)

일단 완료하면 area_loop 를 평가하는 프로세스를 생성하고 이를 pid 에 할당할 수 있습니다.

pid = spawn(fn -> Geometry.area_loop() end)
#=> #PID<0.40.0>

그런 다음 :rectangle 원자 또는 :circle 원자를 수신하는지 여부에 따라 사전 정의된 코드가 일치하는 pid 에 메시지를 보낼 수 있습니다.

send pid, {:rectangle, 2, 3}
#=> Area = 6
# {:rectangle,2,3}

send pid, {:circle, 2}
#=> Area = 12.56000000000000049738
# {:circle,2}

Process.alive? 를 사용하여 프로세스가 여전히 실행 중인지 확인할 수 있습니다. 함수.

Process.alive?(pid)
#=> false

결론

우리는 이 블로그에서 표면을 긁지 않았습니다. Elixir에는 많은 놀라운 기능이 있습니다. 계속해서 직접 확인해 보시기 바랍니다. 그 과정에서 도움이 될 몇 가지 학습 리소스를 아래에 나열했지만, 본격적으로 시작하기 전에 Elixir에 대해 개인적으로 가장 좋아하는 몇 가지를 소개합니다.

  • 루비 같은 문법과 얼랭 같은 프리미티브로 이해하기 쉬웠다.
  • 그 뒤에는 환상적인 커뮤니티가 있습니다.
  • 동시성 모델은 나에게 친숙하고 매우 강력합니다.
  • Mix 는 신의 선물이며 많은 시간을 절약합니다.
  • Elixir는 모든 것을 문서화 하도록 권장합니다.
  • 분산 앱 구축을 훨씬 덜 혼란스러운 전장으로 만듭니다.
  • 나는 Elixir가 먼 길을 가고 있는 것을 볼 수 있습니다.

자원

짧은 시간에 Elixir를 배우는 데 매우 유용한 리소스:

  • http://elixir-lang.org/getting-started/introduction.html
  • https://pragprog.com/book/elixir/programming-elixir
  • https://teamgaslight.com/blog/the-best-resources-for-learning-elixir
  • http://운동.io

* 가서 저 엘릭서를 마시세요! – @rbin *