7つの言語 7つの世界を読みました。

7つの言語 7つの世界

7つの言語 7つの世界

よくコードが「美しい」と表現されますが、「美しい」というのは実は今までよくわからなかった。
でも本書を読んでコードの美しさがわかるようになって来ました。

コードの例

例えばリストの中にある数字を全て足し合わせるコードを書くとします。

Javaだとこう書きます。
Java

int[] array = {1,2,3};
int sum = 0;
for (int value : array) {
  sum += value;
}
// => 6

Scalaだとこう書きます。
Scala

val list = List(1,2,3)
list.foldLeft(0)((sum, value) => sum + value)
// => 6

Ioだとこう。
■Io

list(1,2,3) sum
// => 6

さらにClosureだとこう書きます。
■Closure

(reduce + [1 2 3])
// => 6

Io, Closureは同じ事をやっているのかと疑問に思うほど美しいですね。
Closure, Scalaなどの関数型プログラミングは
Javaなどのオブジェクト指向型よりも簡潔に記載できるという強みがあります。
ただ記法に慣れるまでがかなり大変。

Closureの記法の一つで三目並べの真ん中の文字を取るには下記のように記載します。

//ボードを定義
// x o x
// o x o
// o x o
(def board [[:x :o :x] [:o :x :o] [:o :x :o]])

(defn center [[_ [_ c _] _]] c)
// => x

コードそのものは美しい、だがこの記法になれるまでに時間がかかりそうな感じは自分と同じ、
オブジェクト指向プログラマーにとってはわかってもらえるかと思います。

ただ、本書には下記のように記載されております。

本書で紹介するプログラミングパラダイムの中で最も多く期待されているのはおそらく、
関数型プログラミングだ。関数型の純粋さの程度は言語によって異なるが概念は一貫して
変わらない。関数型プログラミングは数学の関数で構成されている。同じ関数を何度呼び出しても
毎回同じ結果が得られる。

というように最も期待されているのが関数型のようです。未だ慣れませんが、次のパラダイムには
必要となる概念だと思われます。どうにかして付き合い方を考えていく必要があると思います。

ここで紹介されているのは、Scala, Closure, Erlang, Haskellですが、
それぞれ関数型プログラミングの実現に対するアプローチが違います。
まずはオブジェクト指向の考え方から徐々にシフトしていくならScalaやClosureを学習する方が良いです。
オブジェクト指向の考え方から一気に関数型に行く場合はErlang, Haskellを学習する方が良いです。

言語特有の機能

この本を読むとそれぞれの言語に特徴的な機能があり、面白いです。
特に下記の機能が面白いと感じました。

  • Rubyのメタプログラミング
  • Scala, Erlang, Ioのアクター
  • Closureのトランザクショナルメモリ

Rubyのメタプログラミング
Rubyのmethod_missingメソッドを利用すると、存在しないメソッドを呼び出した時の処理を記述することができます。
この機能を応用して、独自に言語を拡張させることができます。
このようにプログラミングを書くプログラミングのことをメタプログラミングと言います。
上のmethod_missingは一例で、この他にもメタプログラミングをするツールはあります。
コードの可読性は多少犠牲になりますが、うまく隠蔽すれば強力なツールになります。

■アクター
アクターというのはアクター間でメッセージをやりとりしながら並列処理を実現するための仕組みです。
メッセージのやり取りが厳密に制御されているため、デッドロックのような状態が発生しにくくなっています。
特にScalaの!演算子で送信するメッセージングは割りと直感的に見えます。

■Closureのトランザクショナルメモリ
Closureでは並行性でのリソース競合が起きないようにデータベースのようにトランザクションでくるむ
機構が存在します。これにより安全な並行性を簡単に実現する仕組みをサポートしています。

この他にもHaskellモナドやClosure, Erlang, Haskellのリスト内包表現、Prologのユニフィケーション
なんかも面白い機能だと思いました。(ただモナドはもう少し勉強しないと理解しきれませんでしたが)

from scratch的次に勉強したい言語

やっぱりScalaですね。
なんとなく読んでいて一番オブジェクト指向と関数型の良い所取りをしている感じがしました。
並行処理やXMLにも強いというのがまた魅力的です。
最近はやりのPlay! Frameworkと合わせて勉強したいと思います。
Play! Frameworkについては勉強会に参加して何ができるか聞いてきます。
第二回 #Playframework 勉強会 in Tokyo #play_ja : ATND

もちろん内容はブログで公開します。

Scalaで慣れたらClosureかHaskellのようなもう少し関数型志向が強い言語にチャレンジしたいかと思います。