7つの言語 7つの世界 を読んで一瞬で7つの言語を身につける(後編)

後編では Scala, Erlang, Clojure, Haskell について書いていく。

前編はこちら (Ruby, Io, Prolog)

各言語の感想

Scala

Scala については 以前の記事 で一度紹介した。記事では Scala 特有の Implicit (暗黙)という機能をピックアップしている。本書では違った角度から Scala の魅力が紹介される。

Scala はマルチパラダイム言語だ。オブジェクト指向と関数型が高いレベルで融合している。

この言語は Java をベースに関数型のエッセンスを加え、より簡潔に書けるように作られている。一説には同じ処理を Java の半分程度のコードで実装できると言われているが、実感として間違っていないと思う。そのため、特に Java プログラマの方は試してみる価値があるだろう。

Scala はパターンマッチが非常に強力だ。 Prolog や Erlang でもパターンマッチは使えるが、 Scala は静的型言語なので型を含めたより柔軟なパターンマッチができる。 unapply という機能を使えば自作クラスにパターンマッチを定義することすら可能だ。

Scala の最大の欠点として、学習コストが高いことがある。オブジェクト指向と関数型を理解する必要があるため当然とも言える。私見だが、 Scala は凄まじく自由度が高いため、より良い実装を考えながらプログラミングをするのがとても楽しい。一度覚えてしまえばきっとこの楽しさの虜になるだろうと思う。

Erlang

Erlang は「難しいことを簡単にし、簡単なことを難しくする」言語として紹介されている。ここで言う難しいこととは並行処理のことだ。

並行処理といえばスレッドだが、 Erlang ではスレッドは使わない。プロセスとメッセージングによってそれを実現する。 基本は受信プロセスを立ち上げ、そこに他のプロセスからメッセージを送信するだけだ。

Erlang の分岐では主にパターンマッチを用いるが、これはメッセージの受信と相性がいい。受信したメッセージの形式に応じて処理を分け、パラメータを分解するといったコードを読みやすく書ける。

しかし、 Erlang のシンタックスは少し馴染みづらいかもしれない。 Erlang をベースに作られ、 Ruby ライクなシンタックスを持つ Elixir もおすすめだ。

Clojure

Clojure は Lisp の方言のひとつだ。 Lisp には様々な方言があるがその中でも Clojure は人気が高い。

Lisp は List Processing の略で、その名の通りあらゆるものをリストとして扱う。関数呼び出しすらリストであり、「リストの一つ目の要素を関数名とし、それ以降を引数とする」というルールがあるだけだ。つまり関数呼び出しも他のリストと同様に(処理ではなく)データとして扱える。

( Lisp ではなく) Clojure 独自の特徴として、 Scala と同様に JVM 上で実行されるというのがある。豊富な Java のライブラリを利用できるのは大きなメリットだ。

Lisp というと一部の専門家しか扱えないイメージがあるかもしれないが、 Clojure は汎用的な言語を目指して設計されている。つまり、より実用的ということだ。

他の言語に慣れていて Lisp 系言語に挑戦すると、まず最初につまづきがちなのはかっこだらけのシンタックスだろう。 Clojure では例えばマップを定義するには以下のように書ける。 Ruby ライクで馴染みやすいシンタックスだ。

{:darth-vader "obi wan", :luke "yoda"} 

Haskell

Haskell は純粋関数型言語だ。「純粋」とは全く副作用がないということだ。純粋関数型言語には非常に大きいメリットがあるが、使いこなすまでに大きな壁もある。

素晴らしいメリットのひとつとして、関数の引数や戻り値にすら型が必要ない。「 + 演算子を使っているから数値型だ」とコンパイラが推論してくれるわけだ。型推論の優秀な言語は他にもあるが、ここまでできる言語は見たことがない(私は)。これが純粋関数型言語の威力なのだろう。

Haskell を学ぶ上で避けて通れないものとしてモナドがある。概念を理解するより、用法から入るほうがわかりやすいと思う。

代表的なものは Maybe モナド(言語によっては Option とも呼ばれる)だ。どう便利なのかと言うと、中身があるかなしかに関わらず関数を適用できる。 null チェックを忘れて NullPointerException に悩まされることもない。

非常にざっくりとした理解だが、モナドとはある値をラップするものだ。値をラップする機能 ( Haskell では return ) とアンラップして関数を適用する機能 ( Haskell では >>= ) を持つ。これらの機能を持つことで、ラップされた値を意識することなく関数を適用できる。(合ってるか自信がない…。)

余談だが、 Haskell の解説書では Hello, World! が登場するのが中盤という噂がある。純粋関数型言語であるためにふつうには標準出力を扱えず、モナドを活用する必要があるからだ。聞くだけでも恐ろしい話だ…。

まとめ

最初から最後まで楽しんで読むことができた。プログラミング言語が好きで、短期間にいろいろ学んでみたい人には特におすすめだ。

思った以上に個性的な言語揃いだったが、その中でも Haskell に興味を惹かれた。しかし、業務で使うのは難しそうだ。ここで紹介した言語の中では Ruby を使っている会社は多く、次点で Scala もたまに見かける。しかしそれ以外の言語を業務で使える機会はかなり限られているだろう。

パラダイムと言うのは常に変化していくものだが、 Haskell のような純粋関数型言語がスタンダードになる日もいつか来るのだろうか…。あまり期待できない気がする。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です