もともとはClojureのことが読みたくてBruce A. Tateの「Seven Languages in Seven Weeks(訳書)」を買ったのですが、読んでいくとErlangが気になりはじめました(ほぼ同時期に発掘して読んだMatz氏のブログ記事もErlangに言及していたので)。その後、2013年ごろにベータ版が公開されたDave Thomasの「Programming Elixir(訳書)」でElixirを知りました。
とうとうElixir本の日本語訳が出版されることになりました。Elixir本の日本語訳*1の出版を勝手に祝して、以下のようなブログ記事の日本語訳をしてみました。
今後10年の言語(原文:A Language for the Next 10 Years - Programming Zen)
2016年6月14日(火) | Antonio Cangiano
2006年の初め、僕がIBMで働き始めたばかりの頃、僕は「Ruby野郎 [1]」だった(Rails野郎ともいう)。
ある日、大物エンジニアたちとミーティングする機会があったので、そこでRubyのスゴさを語ってみたんだ。そしたら一人の技術理事(Distinguished Engineer、訳注:IBM社内の役職名) [2] が僕の話をさえぎって、「それ、遅そうだな」と言った。
僕はRubyのことをとてつもなく愛していたんだけど、その人の言うことはもっともだった。Rubyはいつだって、実行時の効率よりもプログラマの効率を重視しているからね。
一般的に言って、Rubyで書かれたプログラムは、同じことをするCやJavaのプログラムと比べて明らかに遅い。
もちろんRubyのパフォーマンス向上のために様々な作業がされていて、実際のところかなり良くなっているし、それは素晴らしいことではある。……ただ、はたして今日の世界において、このパフォーマンスで十分なんだろうか?
いろんな場面において、答えはイエスだ。誰もRubyを使って13兆桁の円周率を計算したりしないし、数百万人もの利用者がいるメッセージング・アプリのバックエンドに使ったりもしない。
スクリプトを書くのにRubyはかなり適している。さらにRailsは、特にCRUDなWebアプリの比較的大規模なサブセットを書くためのWebフレームワークとしては、いまだにコスパは最高のはずだ。
Rubyはステキだしユーザも多い。しかし、今後10年の方向性を決定づけるような言語じゃない。言語の設計は今のままでも十分に美しい。でも、ますます分散化する世界が投げかけてくる問題を解決するための言語としては理想的でないんだ。
その世界では並行性が肝要になる。そして残念ながら、その場面でRubyができることは——いろいろとがんばってはいるものの——限られている。Rubyで並行性を扱うことができないということではないよ。実地検証ずみのより良い道具があるというだけ。
僕と同じように今から10年後もこの業界で戦っていたいと考えているRuby開発者諸君、Rubyをメインとしつつも一緒に使える新しい言語を探し始めてはどうだろう。(もしかしたらその言語がRubyを置き換えてしまうかもしれないが)
もちろん、次の10年間つかえる言語とはいっても、どれを選ぶかは開発の文脈によるところが大きい。iOSアプリを開発しているのならSwiftになるだろうし、AndroidならKotlinあたりがいいかもしれない。データサイエンスならJuliaかな。Juliaがパフォーマンスにおけるいくつかの問題を解決できれば、PythonやRの牙城を奪うかもしれない。もっとハードに近い部分でのシステムプログラミングならRustとGoを試す価値がある。[3]
広く浅くいろんなところに手を出さないといけないのはウンザリするし、僕は何よりWebデベロッパだと自認してる。だから僕が次の10年に使う言語は、n台のマシンがm個のリクエストを発するような分散環境において突出したものじゃないといけない。そしてnとmは大きな数だ(IoT分野だけ考えてもそうなるだろう?)。
じゃ、Rubyの次には何が来るんだろう。Node.jsを挙げる人もいるかもしれないが、僕には向いてない。僕はRubyに完全にヤられちまってるんだ。Rubyは使ってて楽しいけど、JavaScriptはそうでもない。
高級言語で、並行性にかけては一等よくて、洗練された可読性の高い文法で、開発者に素晴らしいユーザ体験をもたらす。……そして、関数型言語でないといけない。つまり、歓びの関数型言語ってことだな。🙂
ほとんどの問題を解決するにあたって、(イミュータブルなデータ型をもつ)関数型プログラミングはオブジェクト指向プログラミングに勝ると思う [4]。以前HaskellとClojureに手を出した経験から、そう考えるようになったんだと思う。
そうそうClojureといえばJava VM上では、Scala(+Akka)とClojure(+STM&Pulsar)の両方とももっともな選択肢だと思う。
二つのうちClojureの方が僕の理想には近い。とても近い。ただ、僕にも言語にたいする嗜好というものがあって、しかもRuby派だということもあり、Lispの文法は時代を逆行してるように感じる。
もちろんJava VMはすごくいいんだけど、並行性における信頼度の高さとなるとErlang VM(BEAM)に軍配があがる(Whatsappのやつらに聞いてごらん)。
Erlangにも問題があって、Prologっぽい文法が古めかしく感じるというところ。今までErlangのコードを読んで「楽しく読ませてもらったな〜」なんて思ったことは一度たりとてない。リファクタリングするにしたって、最悪とまでと言わないけど、扱うのに魅力的な言語だとは思えない。
幸いなことに、フォールトトレランスと並行性を兼ね備えたこの素晴らしいVMで使える言語はErlangだけじゃない。ドキドキするにふさわしい言語があるんだ。
僕にとって、その言語はElixirだ。Elixirはこれまで挙げてきた全ての条件に合致するし、読むのも書くのも楽しいと思える。
Rubyに似た文法なこともあって、初めてElixirを見たときは他のRuby使い同様に僕もElixirはErlang VMで動くRubyなんだと思った。使ってみたらそれ以上だった。そしてErlangも超えてた。
特徴をざっとまとめてみるね。
- 可読性が高く洗練された並行性をサポートする関数型言語
- Erlang VM(BEAM)およびOTPとの素晴らしき一体感
- リソース共有なし(Shared Nothing)のアクターベース並行処理
- マクロによるメタプログラミング
- プロトコルによるポリモーフィズム
- その他たくさんのイかした機能(パイプライン演算子、パターンマッチング、docstring、ストリーム、ミックスなど)
- Phoenixという優れたWebフレームワーク
- Rails初期の頃のRubyをほうふつとさせる、大きくなりつつある温かいコミュニティ
Rubyの利用は過去10年間で急上昇した。今はまだElixirはそれほど使われていないけど、今後10年間にRubyと同じくらいの広がりを見せる潜在力を持ってると思う。
気に入るかどうか、ちょっと試してみてほしい。
【脚注】
- 名実ともにRuby野郎であるSamほどではないけどね 😉 ^
- その人は、今ではIBMのフェロー(技術系の社員がなれる最高の地位だ)になっている。僕はそのプレゼンのとき、まだパフォーマンスについては話していなかったことは特筆しておきたい。僕が語った言語の特徴だけから、その人が自分で推測したんだ。 ^
- Nimもいいかもしれないし、Ruby使いにとってはRubyライクな文法のCrystalも候補になるかもしれない。 ^
- ハード寄りのシステムプログラミングを除くと、次の10年に来る言語は関数型言語か、関数型言語に大きく影響を受けた言語になるんじゃないかな。 ^
- 文法のことを重視しすぎだって言いたいんだろー? でもみんなが言うより文法って大事だと思うんだよね。 ^
以上でーす!
Homebrewを使っている人は
$ brew install elixir
だけで必要なものがそろうので、始めやすいと思います。ぜひ。