Mukai Systems

7週間で個性的なプログラミング言語をはやめぐり——「7つの言語 7つの世界」

原著「Seven Languages in Seven Weeks」が意味するように——随分とおしゃれに意訳したな笑——本書のコンセプトは「7週間で7つのプログラミング言語を紹介する」というものである。

誰かが「1年に1つの言語を学びましょう」なんて言っていたように、様々なプログラミング言語に触れることはとてもよいことだと私は考えている。1

本書で紹介する言語はいずれも個性的で、真面目に取り組めば7年分の価値があるといえる!

Ruby

Rubyはいわずと知れたオブジェクト指向言語である。

一年間Ruby on Railsを用いて開発した経験があるはずなんだけど、mixinmodulemethod_missingなどRubyの基本概念についてはほとんど何も理解せずにプログラムを書いていたんだなと思った。そういった意味で、Ruby on Railsはフレームワークとして上手に抽象化のレイヤを築けているといえる。「Active Recordがどうやってメンバ変数を動的に追加しているのか。」とか、私が理解していなかった技術的な面について解説されているのはありがたかった。

Ruby on Railsの存在が意味するように、「Rubyには強力なメタプログラミング能力がある。」ということは間違いないだろう。

Io

Ioはプロトタイプベースのプログラミング言語で、簡単な構文と高い自由度を特徴としている。

一般的なプログラミング言語では関数の引数は評価された後に関数に渡されるが、Ioではメッセージとコンテキストがそのまま渡される。これによって、メッセージを構築するメッセージのようなメタプログラミングが可能で、ifに該当するような制御構造なども定義できる。

メッセージが存在しない場合の振る舞いを規定するforwardスロット——Rubyのmethod_missingのようなもの——を上書きすることによってXMLジェネレーターを構築するのは見事であった。

簡単な構文を特徴として、シンボルやオペレーターなど言語を構成するすべてを再定義できる柔軟さと危険さはLISPと通ずるものがある。正直なところ、「こんなに簡潔な言語仕様でここまでできるのか。」という驚きを隠せなかった。1日もあれば、十分に言語について知ることができるのに、使いこなすには相当に訓練が必要な奥深い言語だな。という印象を受けた。

Prolog

Prologは論理型プログラミング言語であり、次の3つの要素からなる。

Prologは与えられた事実と規則から知識ベースを構築する。あなたは事実と規則を正しく列挙するだけで、その解法を一切考えることなしに、質問によってその答えを得ることができる。

後半に数独やN Queen Problemを解く演習問題が扱われているが、まさに、これらがPrologが最も得意とする分野であろう。Prologは汎用的に使うには癖が強すぎるかもしれないが、特定の領域には驚くほど強力なツールになることが分かった。

Scala

ScalaはJavaの仮想マシン(JVM: Java virtual machine)上で動作する関数型のパラダイムを加えたオブジェクト指向言語である。

変数ではなく定数の使用を後押しするような仕組みが存在すること、言語レベルでのXMLのサポートや、並列処理、遅延評価、パターンマッチングなどのお馴染みの機能を備えていることなどが特徴として挙げられるだろう。

本書の中でも習得難易度は非常に高いものの、かなり実用的な言語だと思った。

Erlang

Erlangは並列処理指向な関数型言語である。

変数への代入は一度のみという制約と引き換えに、軽量なプロセスによる強力な並列処理がある。プログラムのホットスワップが可能だったりと、他の言語にはない特徴がある。

ビット構文と呼ばれる、バイト配列のpack/unpackは便利だなーと思った。LISPこのアイデアを取り込みたいなと思ったら、Schemeのマクロが既にあった笑

https://higepon.hatenablog.com/entry/20090413/1239592990

前述のPrologの影響を受けているとのことで、確かにPrologを知らないプログラマにとっては最初はとっつきにくいのは間違いない。

Clojure

ClojureはJVM上で動作するLISP方言の一つである。

Schemeが美学を追求したLISPだとすれば、Clojureは実用性を追求したLISPといえるだろう。

波括弧や鉤括弧やカンマを躊躇なく構文に取り入れたり、リストや配列やマップなどのシーケンスの徹底した抽象化、構造化代入や遅延評価や並列処理のサポート、可読性を下げる恐れがあるために意図して廃止したリーダーマクロ、JVM上で動作するために使用できるJavaの豊富な資産など、既存のLISPに対して徹底的に実用性を追及している。正規表現や文字列の操作ライブラリを入れるのが暗黙的ルールとなっているほどに貧弱な言語使用のCommon Lispとは大きな違いだ。

唯一と言っていいほどのデメリットはその学習コストの高さかもしれない。Common LispやSchemeなどたしなんできた私でも相当とっつきにくい言語という印象があった。(逆にLISP系の言語をやっていないほうが学びやすいのかもね笑)

Haskell

Haskellは本物の関数型言語である。

私の個人的な印象ではHaskellは本当に難しい。プログラミングというよりは数学な印象である。圏論?なにそれ。

習得することができたら絶対に新しい世界が見える気がしているんだけど、結局いつも学びたい言語リストに永久に残り続けている。

本書ではモナドについても解説してくれているが、やはり理解はできない。

単純な標準入出力の扱いを見ても実用的なのか私にはまだ分からない。少なくとも実績は沢山あるので、賢い人たちにとっては優れたツールになるのであろう。難しい言語である。

面白いのは、Haskellは委員会によって仕様策定されたことだ。この中の他の言語もそうであるように、「いいプログラミング言語というのは一人の洗練されたセンスと統一感によって作られる。」というのが定説だが、Common Lispのそれが失敗したのとは対照的にHaskellはこの例外だ。これは、Haskellが他の人と共通の基盤である数学に根ざしている。ということが大きいのだろう。

まとめ

ここ最近読んだ技術書でダントツで面白かった。

本書で選択された7つの言語に対してたくさんの賛否両論があったようだが、私はどの言語も作成者の確固たる信念を感じる尖ったものばかりで素晴らしいものだったと思う。言語によっては、作成者のインタビューが収録されているのも熱い。それも形式的なモノではなく、「作り直すとしたらどこか?」といったような有意義なものである。

「新しい発見がないような言語を学ぶのは無駄」的な話をどこかで見た気がするけど、そういった意味で本書の言語選定はまったく無駄がないと断言できる。自分に本当に向いている言語を探す手がかりとしてもいいし、言語を作成するときの思想などを学ぶ用途としても最高だ。ただし、本書のコンセプト上、各言語について本当に理解することは難しい。私はlisperなのでLISPの真髄についてはよくわかっているつもりだが、この本のClojureの章のLISPの紹介は本当によく書かれていた。それでも、非LISP経験者が読んで理解できるとは到底思えない。どの言語も数年間は修業が必要だろう。

Notes

[1] 調べてみたら達人プログラマーっぽい?

More info