「Opening Keynote」
Elixirの作者であるJosé Valimさんによるオープニングキーノートです。Joséさんが日本にいらっしゃるのは2回目で、前回は2013年のRubyKaigiのキーノートでRubyにおける並行プログラミングの可能性について話されて以来4年ぶり、また日本へ来られてうれしいとのことでした。
2011年当時のRails 2.2にThread Safetyという特徴が入りました。ただしこれは「壊れない」という保証をするのみで、実際に使えることや使いやすいということについては考えられていませんでした。当時JoséさんはRails Core Teamにおり、並行性が今後も重要になるのなら他のコミュニティからRubyに導入しようと思い調べはじめたのが最初であったとのことです。
Erlangには”Seven Languages in Seven Weeks”という本の中で出会いました。Erlangは(たとえCPUが複数コア存在しても)マシンの全てのリソースを使えるような並行性を備えているだけでなく、それを生かした長期の目標である分散や安定したソフトウェアを書くという点についても考えられていました。ただErlangを気にいって使っているうちに、Erlangが備えていない機能も見えてきました。例えばユニコードのサポートです。Joséさんが自分の名前をプログラムの中に書くのにはユニコードのサポートが必要でした。
そこで2011年の初めに自分の言語を作りはじめたということです。そのころは今のElixirと異なる、プロトタイプオブジェクトを用いたJavaScriptのような言語で、Erlangとも協調して動作しなかったといいます。一旦は完成したのですが問題が多く行き詰まってしまいました。それでも問題を頑張って修正して完成度を上げようと試みたのですが、うまくいかなかったそうです。振り返るとパズルで手元にあるピースをとにかく無理矢理当てはめていくような作業に似ていて、どうやって完成させるかという点について考えられていなかったとJoséさんは述べられました。
そこでElixirのゴールを以下のように設定して再出発したそうです。
-
生産性
- ツール
-
拡張性
- ポリモーフィズムとメタプログラミング
- (Erlangとの)互換性
マクロを使ったLispのようなメタプログラミングは非常に自由かつ強力ではありますが、それをどのように既存の構文と組み合わせるか、そしてどのように明示的に宣言させるかについて悩んだそうです。そこでマクロの適用をコンパイル時にのみに制限することでうまく組み合わせることができ、Elixirでデータ操作を書くことでElixirの構文を変更できるマクロの構築に成功しました。
それでは2017年現在にJoséさんが考えるElixirとは何なのでしょうか。それは以下の3つの要素を考えることで成り立っていると言います。
- Data(types)
- Modules
- Processes
例えばデータの上書きが可能なオブジェクト指向プログラミングでdictionary.store("key", "value")
というコードがあったとき、状態はdictionary
が持っており、振舞いはstore
で定義されます。さらに、データの上書きが可能で一旦上書きしてしまうと過去のデータはどこにも残らないため、それぞれのオブジェクトは時間という概念も内包しています。つまりこの言語では、状態、振舞、時間が一つのオブジェクトへと纏められているということが言えます。
一方Elixirでは役割が分けられており、状態のことはDataに、振舞のことはModuleに、時間のことはProcessへと分離して扱うことができます。特にProcess(プロセス)が特徴的で、プロセスはデータを持ち、プロセス内ではコードは直列で実行されますが、各プロセスは互いに影響を及ぼさずに並行動作することができます。プロセスが協調動作するときにはプロセス間でメッセージをやりとりします。この仕組みがElixirでモデルの時間による変更を表しているということでした。そしてこの理解しやすいメンタルモデルがあるために、プログラムの中で並列化できている部分が多ければ多いほど、コアが増えたときに速度を上げることができるアムダールの法則を生かすことができるそうです。
Joséさんは、最後に2017年以降のElixirについて以下のような計画があることを提示し、
- GenStage & Flow
- UTF-8 Atoms
- GenHTTP
- Type System
- Data streams & Property testing
これらによってElixirが適用できるドメインが広がり、さらにElixirが広がっていくだろうと述べられました。