より長続きするブログ

続けていきたい気持ち。

プログラミングElixir読書メモ 第3章

第3章 不変性

関数プログラミングでは、データは一度作られたら変更されない。

Elixirでも同様。

 

不変性の概要

Elixirでは[1, 2, 3]というリストを一度参照したら、もう一度変数を束縛し直すまで、いつも同じ値のリストを参照する。

リストの各要素に100を足したくなった場合は、新しい値を持つ、元のリストのコピーを生成する。

 

元のリストは変わらず残り、100を足すという動作は、元のリストへの参照を持った他のコードへ影響を与えない。

 

性能への影響

データを更新するごとにコピーを作っているので、非効率であることが想像される。

しかし実際は逆。

 

例えば、あるリストを元に新しいリストを生成するとき、下記のようなコードを書く。

list1 = [ 3, 2, 1 ]

list2 = [ 4 | list1 ] # [4, 3, 2, 1]となる

 

ほとんどの言語では、list2を構築するとき、4, 3, 2, 1が入っている新しいリストを作る。

Elixirでは、list1が変更されないことがわかっているので、先頭に4、末尾にlist1をもつリストを作るだけ。

 

ガーベージコレクション

Elixirでは、それぞれのプロセスが自分のヒープをもっている。

それぞれ個別のヒープは全てのデータをひとつのヒープで扱うよりずっとずっと小さいので、ガーベージコレクションが速く走る。ヒープがいっぱいになる前にプロセスが終了すれば、プロセスと共にヒープも破棄されるので、ガーベージコレクションは必要ない。