前回、PAY.JPのライブラリを作成する上で、せっかくElixirで作成するのでLet it crushの思想を受け継いで作ろうと、Let it crushについて説明しました。
今回は、ElixirはなぜそのLet it crushの哲学で作りやすいのかという事についてErlangのランタイム設計について説明していきたいと思います。
ランタイムとは
ランタイムとは、ソフトウェアやシステムが実行される「動作中の時間」を指します。このため、ランタイム設計とは、プログラムが動作中にどのように振る舞うかを設計するプロセスです
主な役割に、以下があります。
- メモリ管理
- プロセス/スレッド管理
- エラーハンドリング
- 入出力操作の管理
言語ごとのランタイム設計の違いを見るとわかりやすいかも知れません。
Java(JVM)の場合
String text = "Hello"; // メモリ確保はJVMが管理
- ガベージコレクション
- スレッド管理
- メモリ空間の確保・解放
Ruby(Ruby VM)の場合
array = [] # オブジェクトの生成・管理はRuby VMが行う
- オブジェクト管理
- メソッド呼び出しの制御
- メモリ管理
Erlang(BEAM)の場合
spawn(fn ->
# プロセス生成と管理はBEAMが担当
end)
- 軽量プロセスの管理
- プロセス間通信
- 障害検知と回復
とこのようにランタイム設計が違う事で言語による制約や実装の難易度が大きく変わります。
さて、ランタイム設計による違いとLet it crushの観点から説明すると簡単に言えば、
設計思想の違い
設計思想の違いに他なりません。
従来の言語:エラーを防ぐことに重点
Elixir/BEAM:エラーを前提とした設計
その為、学習コストも他の言語に比べて難易度が下がります。
従来の言語:並行処理の深い理解が必要
Elixir:基本的なパターンを学ぶだけで堅牢なシステムが構築可能
従来の言語では、以下の観点や実装をする必要があるのに対し、
- エラー処理の実装
- リソースの解放
- デッドロックの防止
- 状態の整合性維持
Elixirでは、以下だけで多くが解決できてしまいます。
- プロセスの定義
- スーパーバイザーの設定
という事で、いよいよ次はLet it crushの哲学で開発を進めていきたいと思います。