『プログラミングElixir 第2版』を読んだ
作成日:
DMMブックスの7割引セールで買った本の一つ、『プログラミングElixir 第2版』をここ2週間ほど少しずつ読んでいましたが、概ね読み終えました。感想を書いておきます。
LISPっぽい
Elixirは、Erlangの仮想マシン上で動く函数型言語です。ここに「Rubyのようでとっつきやすい」という宣伝文句がつくことが多い印象なのですが、この本を読んでいるとむしろLISPっぽいと思えました。私の思う「LISPっぽい」は「なんでも手作りしてて言語自体も魔改造できたりする」あたりなのですが、その片鱗を第6.2節「関数のボディはブロックだ」で感じました。いわく、do...end
ブロックは基本構文ではなくて構文糖衣なんだとか。そして、終わりの方の第22.9節ではついに「同図像性(homoiconic)」なんて単語が出てきました。答え合わせですね。
ちなみに、この話をKMCのオタクたちにしてみたところ、「あらゆるものはLISP」「RubyはLISP」などの発言が返ってきました。こわいですね。もしSICPでなぐられたらしんでしまいます。
並行処理は面白い
これはElixirがすごいというよりはErlangがすごいのかなと思いますが、やはり売りの並行処理1まわりは面白い。「プロセス」をたくさん作ってそれらの間で通信させることで計算させていきます。
手続き型言語でプログラミングを始め、オブジェクト指向スタイルにうつったことがあるなら、オブジェクトを使って思考するように頭を切り替える際、混乱した時期があったと思う。
今や、プロセスを使ってプログラムを考え始めている。同じような混乱が起こるだろう。ほとんどのまともなElixirプログラムは、本当にたくさんのプロセスを使う。そして、だいたいにおいて、プロセスの生成と管理を、オブジェクト指向プログラミングでオブジェクトを生成・管理するのと同じぐらい気楽に行う。でも、この考え方を学ぶには、もうしばらくかかるだろう。粘り強くいこう。
これは216ページからの引用です。最初は「そうなのかー」くらいに思って軽く流していましたが、しばらくプロセスを用いたコードを読んでは写経していった後、ふと気づくと「ええっと、これこれをするにはまずモジュールの函数をspawnして……」と考えるようになっていました。こういう、新たな思考法を得る体験は最高ですね。
さて、このElixir(Erlang)の、並行に動くプロセス(アクター)の間で相互に通信させて処理するような模型をアクターモデルといいますが、アクター(役者)という言葉が当てられているように、いかにも生物らしいという印象を受けました。正確には、「痛みを共有する」とか「死を伝える」とか書かれているので、「百合か?」と言いながら読んでいました。オブジェクトよりよほど感情移入できるので、百合好きにはおすすめです。
私がElixirを学びたいと思ったのは「非同期処理なんもわからん」状態から脱出したいからだったのですが、その目的は達せられたなと思います。今後Elixirを書く機会がどれほどあるかは分かりませんが、様々な言語に「これはErlangのアクターモデルを参考にして作られた」という枕詞のつくライブラリやフレームワークが存在しています(代表的なのはScalaのAkkaだと思います)。そういったものへの苦手意識、拒否反応というものが、すっかりなくなったというのがもっとも大きな収穫かなと思います。本家本元で学んだので、その模造品はもうこわくないのです2。
Erlang VMすごい
並行処理もそうなのですが、それだけでなく広く「分散処理」のために設計されたErlang VMには視座の高さを感じさせられます。
まず驚くのは、ネットワークで繋がった別のマシン(ノード)で動いているVMと簡単に通信できること。通信して、別のマシンでプロセスを動かすなんてことができます。Elixir: The DocumentaryというElixirのミニドキュメンタリーがあるのですが、ここでもデモとして別マシンのプロセスを呼んでいます。それくらいには初見で驚く機能です。
圧巻だったのはバージョンアップまわり。システムを止めることなく無停止でソースコードの修正を反映させられます(ホットアップグレード)。これを支えるのが、「変更されたモジュールをコードが明示的に参照するまで、モジュールの古いコードを使い続ける」手法、そして「コードだけでなくデータにもバージョンを持たせる」というモデルです。一般人の書くソフトウェアにはオーバーエンジニアリングな周到さで思わず笑ってしまいました(本質的に大変な問題は真っ当に対処しても大変だなというかんじです)。
動的型付けはちょっとつらい
Elixirは動的型付け言語です。やはりエディタでの補完が弱かったり実行時エラーに悩まされたりという部分で辛さを感じます。一応(最近多くの動的型付け言語で導入されたように)型注釈の機能があり、VS Codeを使っていると勝手に型注釈が表示される上にそのままコードに書き込むこともできるのですが、本の付録曰くあまり普及していないとのこと。こういうのは一般的なライブラリに型注釈がついていないうちはあまり嬉しくなさそうです。
ただ、動的型付けなのは合理的な選択の結果なのだろうと思います。
まず、土台となるErlangが動的型付けです。
次に、ここまで分散型を指向すると型は相性が悪いのではないかということ。特に、ホットアップグレードを許すと型による保証が弱くなりそうな気がします(気がするだけ)。HTTPなどの多くの通信プロトコルは型なんてなく文字列でやりとりしているわけで、それに近いものと考えれば納得できます。他のモジュールの知識がなくても自分だけは動ける、通信したければ相手のことを文書で調べる。こう考えるといかにも人間らしいなって。
最後に、これは感覚ですが、前述の「LISPっぽい」自由さは型に縛られないからなのかなと。Matzが「楽しさを重要視するRubyには型を入れたくない」みたいなことをいつか言っていたのが、ちょっとわかった気がしました。
おわりに
というわけで、『プログラミングElixir 第2版』、良い本でした。本の感想というよりElixirの感想を書いていた気がしますが、Elixirを全く知らない状態から読み始めてこういうことを考えられる程度には理解できるということです。
次は、作ってみたいWebアプリケーションをPhoenix Frameworkで作ってみようかというところ。
なお、DMMブックスのブラウザ版とMac版ビューアの「ページ送りすると縮尺が戻る」という仕様が結構つらく、Androidタブレットを持っていなかったらちょっと読むのが億劫だったかなと思っています。