<Enjoy-Elixir>Elixirについて知ろう!

目次

Enjoy-Elixirと称する、プログラミング言語Elixirを勉強する記事群の1つです。

Elixirとは?

Elixir は動的型付けの関数プログラミング言語です。拡張しやすく保守しやすいアプリケーションを構築することができるプログラミング言語です。と、公式サイトには書かれています。

Elixir is a dynamic, functional language for building scalable and maintainable applications.

Elixir は仮想マシン(=VM)の上で動作するプログラミング言語です。仮想マシン上で動作するプログラミング言語で有名なものといえば Java が挙げられますね。JavaJVM という仮想マシンで動作します。ElixirErlang VM と呼ばれる仮想マシンで動作します。

JVM族 と呼ばれるプログラミング言語群があります。これは、JVM 上で動作するプログラミング言語のことで、Javaの他に JRuby, Scala, Clojure などがあります。

同様に Erlang VM族 と呼ぶことができるプログラミング言語があります。まず Erlang という言語があり、そして、これから学ぼうとする ElixirErlang VM族 に入るプログラミング言語です。その他の Erlang VM族 に入るプログラミング言語については(参考 - BEAM Languages)を参照してください。

プログラミング言語 Erlang についても少し触れておきます。

Erlang もまた動的型付けの関数プログラミング言語です。元は電話通信用のシステムを構築するために作られた言語です。並行処理、分散処理に注目した言語といってもいいでしょう。

実は Elixir のコードから Erlang のライブラリを呼び出すことが可能です。これは、ElixirErlang の資産をすべて使うことができるという意味です。もちろん並行処理、分散処理といった Erlang の特徴も Elixir は受け継いでいます。

では ErlangElixir の違いは何でしょうか?

大きな違いは文法です。Elixir はRubyに似た構文を持っていて、一般的に書きやすい言語と評価されます。また、 Erlang は同じ識別子を持つ変数への束縛が1回限りというかなり厳しいルールがありますが、Elixir は変数への再束縛が可能です。

Elixir は、並行処理、分散処理に強く、そして書きやすい動的型付けの関数プログラミング言語ということができるでしょう。

動的型付けとは?

動的型付け というのは、変数に束縛(代入)できる値の型を任意に変更できる、ということです。

どういうことなのか? コードで例を見てみましょう。

# hoge.exs
x = true
IO.puts(x)

x = false
IO.puts(x)

## bool型を束縛していた変数に整数値を束縛する
x = 100
IO.puts(x)

変数x に束縛する値の型を bool型 から途中で 整数型 に変更していますね。このコードを実行してみると、次のような出力を得ます。

$ elixr hoge.exs
true
false
100

動的型付け と対比されるのは 静的型付け です。 静的型付け のプログラミング言語で同様のコードを実行すると、どうなるのか見てみましょう。Rust を例にしてみます。

// hoge.rs
fn main() {
    let mut x = true;
    println!("{}", x);

    x = false;
    println!("{}", x);

    // bool型の変数に整数型の値を代入する
    x = 100;
    println!("{}", x);
}

コンパイルすると、、、

$ rustc hoge.rs
error[E0308]: mismatched types
 --> hoge.rs:8:9
  |
8 |     x = 100;
  |         ^^^ expected `bool`, found integer

error: aborting due to previous error

静的型付け の場合は、変数に対して束縛(代入)できる型が決まっていて、コードの途中で変更することはできません。

関数プログラミングとは?

関数プログラミング とは、関数を連鎖させて仕事をすること と定義できます。

関数プログラミング と対比するものとして オブジェクト指向プログラミング があります。

オブジェクト指向プログラミング の主役は、クラス ですね。クラス には、状態と操作が定義されています。クラスからオブジェクトを生成して、オブジェクトが操作されるとオブジェクト内の状態が変更されて、オブジェクトからの出力が仕事の結果になります。

一方、 関数プログラミング の主役は 関数 です。原則的に 関数 には状態がなく、データや状態は外部からやってきます。これは入力です。入力に対して関数は処理を適用して、出力を返し、これが仕事の結果になります。

Elixir では、クラス を定義する構文はありません。なので、クラス からオブジェクトを生成することはできません。 Elixir には、関数データ軽量プロセス があり、この3つを組み合わせて仕事をさせます。

Hello Elixir

Elixir のインストールについては、次のドキュメントを参照してください。各環境のインストール方法が記載されています。

Elixir インストール方法

私の場合は、macOSでHomebrewを使いました。

$ brew install elixir
$ elixir -v
Erlang/OTP 24 [erts-12.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [dtrace]

Elixir 1.12.1 (compiled with Erlang/OTP 24)

$ iex
Erlang/OTP 24 [erts-12.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [dtrace]

Interactive Elixir (1.12.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> world = "Elixir"
"Elixir"
iex(2)> IO.puts "Hello, #{world}"
Hello, Elixir
:ok

Enjoy-Elixirシリーズでは、Elixir について学習した内容を記事にします。

どうぞよろしくお願いします。

参考