<Enjoy-Elixir>Elixirについて知ろう!
Enjoy-Elixirと称する、プログラミング言語Elixirを勉強する記事群の1つです。
Elixirとは?
Elixir
は動的型付けの関数プログラミング言語です。拡張しやすく保守しやすいアプリケーションを構築することができるプログラミング言語です。と、公式サイトには書かれています。
Elixir is a dynamic, functional language for building scalable and maintainable applications.
Elixir
は仮想マシン(=VM)の上で動作するプログラミング言語です。仮想マシン上で動作するプログラミング言語で有名なものといえば Java
が挙げられますね。Java
は JVM
という仮想マシンで動作します。Elixir
は Erlang VM
と呼ばれる仮想マシンで動作します。
JVM族
と呼ばれるプログラミング言語群があります。これは、JVM
上で動作するプログラミング言語のことで、Java
の他に JRuby
, Scala
, Clojure
などがあります。
同様に Erlang VM族
と呼ぶことができるプログラミング言語があります。まず Erlang
という言語があり、そして、これから学ぼうとする Elixir
も Erlang VM族
に入るプログラミング言語です。その他の Erlang VM族
に入るプログラミング言語については(参考 - BEAM Languages)を参照してください。
プログラミング言語 Erlang
についても少し触れておきます。
Erlang
もまた動的型付けの関数プログラミング言語です。元は電話通信用のシステムを構築するために作られた言語です。並行処理、分散処理に注目した言語といってもいいでしょう。
実は Elixir
のコードから Erlang
のライブラリを呼び出すことが可能です。これは、Elixir
は Erlang
の資産をすべて使うことができるという意味です。もちろん並行処理、分散処理といった Erlang
の特徴も Elixir
は受け継いでいます。
では Erlang
と Elixir
の違いは何でしょうか?
大きな違いは文法です。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
のインストールについては、次のドキュメントを参照してください。各環境のインストール方法が記載されています。
私の場合は、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
について学習した内容を記事にします。
どうぞよろしくお願いします。