Real World OCaml が出ました




一昨年から少しずつ書かれていた OCaml プログラミングの本、 Real World OCaml (以下 RWO)がついに public beta になり公開されました。 ( https://realworldocaml.org/beta1/en/html/ )


版元の O'Reilly ではこのベータ版の状態の e-book が 今なら安く手に入ります。完全版には後から無料でアクセスできるように なるそうです。( http://shop.oreilly.com/product/0636920024743.do )


!!!!!安く買いたい人は http://shop.oreilly.com/category/deals/early-release.do?code=WKERRLS をよく読んでね!!!!!


この本は、今まで外に伝わりづらかった OCaml プログラミングの最前線の一面を 伝える非常に良く書かれた本だと思います。真面目に OCaml プログラミングに 取り組む方にはぜひ読んでいただきたいと思います。 また、OCaml が初めて、という方でもどんどんと入り込めるような作りに なっています。


昨年からレビューに参加しながらこの本の出来あがるのを見てきたのですが 入門の辺りで気になるところは大体コメントを入れておいたところ ほとんど意図を汲み取っていただき fix されているようです。 去年などは、この秋までに出せるのかヒヤヒヤだったのですが 450 pages の大著にホントになりそうです。すごいね。

真世界大駱駝伝説、その中身

主な著者の紹介


Jason Hickey は、現在はグーグルで働いているそうですね。 この方はカルテクで Assistant Prof していた人でこの時に OCaml で 書かれたビルドシステムである OMake を開発しています。 LaTeX などに便利なビルドルールも元から付いているので、論文書きに 便利に利用している方も多いのではないでしょうか。彼はカルテク時代、2008年に OCaml の入門書 "Introduction to Objective Caml" ( http://www.cs.caltech.edu/courses/cs134/cs134b/book.pdf ) を書いています。この本、非常に良いと思うのですが、 本の内容と関係の無い所でいろんな経緯があり結局出版できなかったという 曰くがあり、この流れをくんだ RWO が出るのはとても良かったと思います。 私はお会いしたことはないので、声が大きいかどうかは知りません。


Anil Madhavapeddy はケンブリッジ大の研究者の人ですが元は Xen の hypervisor を OCaml で開発していた人です。Xen は Citrix に買収されていますね。Xen 関係の 事をやると OCaml が出てきて「えーなにそれひどい」と呟く仮想関係の方がいますが、 まあこれは Anil 達の犯行です。OCaml コミュニティ( http://ocaml.org )の整備など にも尽力されている、声の大きい楽しげな人。


Yaron MinskyOCaml を使ったシステムでトレーディングを行なっている Jane Street Capital の Head of Quants をやっています。というか彼が Jane Street をそそのかしてシステムを OCaml で書き換えさせてしまったのですが。彼のおかげで OCaml と言えば Jane ということになってしまったし、OCaml プログラマーの年収平均が 上がってしまいました。 Jason Hickey とはコーネル大の時からのお知り合いのようです。 私の前の職場のボスでもあります。この人も声が大きく楽しげに話します。超早口。


御三方とも OCaml を使って実用システムを開発する経験の長い方たちです。


面白いのは OCaml と言えばフランスで開発されてきた言語なのに フランス人が入っていないところ。フランス人が書いた OCaml 入門書というと やはり O'Reilly から出た Chailloux の "Développement d'applications avec Objective CAML" (2000) があります。これは英訳もされ、ネットからも無料で 読むことができます http://caml.inria.fr/pub/docs/oreilly-book/ が、いかんせん古いですね…これ以降もいくつかフランス人の書いた OCaml の 本は出ていますがみなフランス語のようです。やはり非英語圏の人が しっかりした英語の大著を書く、というのは大変なことのようで、 世界は英語ネイティブ以外には無理ゲーやなーという感が改めて。あ、Chailloux 氏の声の大きさは普通。

読者を一気に真世界へ誘う思い切った取り組み


RWO の大きな特徴、それは読者を容赦せず OCaml プログラミングの最前線環境に放り込み、そこで OCaml の入門を 丁寧に始めていることです。こういう書き方の OCaml の本やブログ記事は いままでありませんでした。


プログラミング言語の入門書は読者に出来るだけ基本的な言語環境を用意させ、 その out-of-the-box な範囲で言語のできることを説明していく、という流れの ものが大半だと思います。ところが RWO では基本的な OCaml の開発環境最小セット には端から見切りを付けて、世界のトップ OCaml プログラマ(の一部)が使っている 環境をまず用意させるのです。獅子が「お前サバンナでも同じ事言えんの?」とか 甘いこと言っている横で真世界の駱駝はまず最高の環境であるサハラに子供を放つというわけですね。

       \お前サハラでも同じ事言えんの?/

              ( ・´ー・`)
.            | つう     n,,__
        /´⌒i|  /´⌒i   | 、ー,_゚)
      /    .し´   〈    ) | ̄´
     (            ゝ,__ノ  |
    ,,,_ノ!   ノ            _丿
      |  /ゝ、,__  __,ノ  i ̄
      〈 ア     ̄   | .ノ
.      ! |        | ア
        |(_        | |_
        'ー'       'ー'

       (サハラにフタコブラクダはいない)

  • 最新の OCaml コンパイラ 4.01.0 を使う (実はこれはまだリリースされていないのですが RWO が正式に完成したころにはこれもできているはずです)
  • OCaml コンパイラ同梱の標準ライブラリではなく Jane Street が開発した代替標準ライブラリ Core を始めから使う
  • OCaml コンパイラ同梱の REPL ではなく履歴や補完機能のある強化 REPL utop を使う
  • JSON の処理などの非標準的なライブラリも躊躇なく使用して解説を行う


OCaml の標準ライブラリ(通称 stdlib)は、関数ごとの出来は問題ないのですが そのカバーする範囲が小さすぎるのです。 そこで OCaml を使うプログラミング演習などではまず実装されていないリストの 基本関数を演習問題として書かせつつ先に進んでいくわけですが…これは 基礎教育的にはよくても、工業的には常に悪評の一つに数えられていました。 そこで OCaml の開発陣の外で stdlib に変わる拡張標準ライブラリとして extlib, Batteries, Core などが発表されてきたのですが、RWO ではこの Core を始めから使う構成になっています。


これは、 stdlib しか念頭にない OCaml 演習の学生や、 extlib や Batteries を 使っている人達には overkill で置いてきぼりを食らわせてしまう可能性のある賭けではあるのですが、その冒険的試みは心配したよりはなかなか上手く 行っているようです。RWO を読んだ人が stdlib や Batteries でプログラムを 書いても RWO で得た知識を上手く使って OCaml プログラムを書くことは (多少悪態をつきつつでしょうが)できるでしょう。


非標準のライブラリを使う際にはそのインストールの問題が常に発生しますが、 RWO ではこれを OCaml の新しいパッケージマネージャである OPAM によって 省力化しています。RWO には巻末に本で使用する OCaml 開発環境のインストール を解説する小さい章があるのですが、OPAM の出現がなければ RWO は 出なかったと言えるでしょう。

OCaml の入門から最新技術まで


I章 Language Concepts では OCaml の初歩の初歩から初めて 関数型プログラミングの基礎を解説しています。 ちゃんと手続き的なプログラムの書き方も解説されています。 ビルドシステムは Makefile ではなく ocamlbuild を採用していて、 一貫して本の最後まで使っているはずです。


一級モジュールや多相ヴァリアント、オブジェクト、クラス といった比較的新し機能についても詳しく解説があり、良いと思います。 特にクラス抜きでまずオブジェクトを解説する方針は良いですね。 OCaml ではクラスはオブジェクトを便利に生成するための道具でしかない、 構造的多相型の元ではちょっと切り離されている存在、と言う事を 理解しやすくなっています。


おおそうだ、beta1 では GADT には触れられていません。 4.00.1 で既に入ってますが…まあいろいろとバグありそうだしね。


II 章 Tools and Techniques では I章の話を踏まえて、 実際に複雑な OCaml プログラムを書く際にはどのような道具立てをつかうのか 特に型定義からのコード生成に重きを置いて例示しながら解説していきます。


また OCaml での協調コンカレント計算の方法や、それを利用した検索エンジンを叩く例も 載っています。


III 章 The Runtime System では OCaml プログラミングを極める際に 知っていると特になる OCaml の内部の話が載っています。これはかなり 高レベルで、俺は Core は嫌いなんだ、という人でも、この章だけは 読む価値があるでしょう。


特に、C との連携は今までは手で C プログラムを書くのが主流だったのですが それを紹介せず、ついこないだ出てきたばかりの Ctypes というライブラリを使う 方法を紹介しています。OCaml 側で C のデータ型の記述を行なって安全な C 関数 呼び出しを行うんですが…私もまだ使ったこと無いんで、注目しているところです。

まあここが難かな…と思わなくもないところ


今まで褒めちぎってきた RWO ですが、問題が無いわけでもありません。


とにかく Jane Street の臭いがプンプンするぜっー、てのは気になります。 Core を全般に使っているのでしょうがないんですが… 非同期concurrentライブラリ として初めは Jane Street 製ではない lwt を使う事になっていたのですが Jane Street 製の Async を採用したので更にその傾向が強まりました。 (Async はもともと Jane でクローズドで開発されていたのですが lwt が公開されてから、あウチのもありまっせと外に出てきたライブラリです) まあ lwt も Async も同じ monadic style の concurrency ライブラリなんで 一つ習えばも一つも簡単なんですがね。一般的なエラーの取り扱いとして S式を採用しているのもかなり Jane Street の事情を反映しており奇妙に 感じるところです。(彼らはデータのほとんどを人間が読み書きしやすく型変化にも 強い S式でディスクにセーブしたりしています。) II章で JSON のところが浮いているように見えるのもこの辺りは Jane Street とは関係のないライブラリだからです。S式やバイナリプロトコルプリプロセッサ 系の type_conv でやっているのに何故 JSON は外部プログラムの ATDgen なのか… まあ単に type_conv ではできないこともあるってことなんですがね。


II章は元々 Practical examples という建前だったのですが名前が変わって Tools and Techniques になりました。つまりあまり Practical な例に 溢れた章ではなくなったわけです。もちろんすごく実用的なことばかり書かれており、 解説されているそれぞれのテクニックはいろんなことに使うことができるのですが、 細かい用例が足りない感じはします。例えば GUI は全く触れられていませんし Web プログラミングとかも薄い感じがして、まさにそういう事を OCaml で やりたいと思って RWO を読んだ人は物足りなく感じるのではないでしょうか。 ただし、人が興味の範囲は広すぎ、全てのトピックを抑えるのは大変です。 まあここはしょうがないということでしょう。 RWO は最新 OCaml プログラミングの一面を切り取ったもので、全てを網羅している わけではないということです。 RWO の例から OCaml プログラミング のエッセンスを学んだ上で、 LablGtk なら LablGtk、eliom なら eliom、各フレームワーク作者の解説記事を読めば良いということになりましょう。


RWO では concurrent 計算として Async を紹介していますが OCaml での parallel 計算を 紹介していないのも少し残念です。まあ OCaml は parallelism 向いていない、 と言えばそれまでですが…試みが無いわけではないので、その辺り紹介が欲しかったかと思います。 (Jane Street 的には私が居た頃は parallel 計算必要なかったから、まあ なくても金稼げる Real World ですよと言えばそうなんだけど)

まとめ: OCaml やるなら RWO は読もう


RWO は OCaml を解説した本としては飛び抜けて良くできています。 この本が解説する基本的な OCaml プログラミングのテクニックは 産業的な OCaml プログラミング最前線の世界では特に新しいことではないのですが、 それを一般の人にわかりやすく解説した一冊本は今までありませんでした。 この本の影響でこれからの OCaml プログラミングの基本的なレベルはかなり 向上するのではないかと思います。Jane Street もこれでいい人をよりどりみどりに なりますなw。


関数型言語における Real World シリーズと言えば Real World Haskell が有名ですが その内容が Haskell ライブラリの発展に伴い陳腐化するのも早かったと言われます。 RWO は…あまりそういう事はないと思います。非純粋である OCaml は純粋関数型言語 である Haskell のように副作用の問題を解決するために圏論に基づいた新しい ○○ができて流行りのプログラミングスタイルがある日一変する、みたいなことは あまりおこらないので。RWO はこれから5年くらいは余裕で普通に使えるんじゃないで しょうか。


RWO は Core という代替ライブラリに基礎を置いて OCaml プログラミングを解説する 本なので、 Core を選んでいない人には敷居が高いです。ですがそれを上回る ノウハウやテクニックがこの本には詰まっていると思います。ですので Batteries派や オレオレ派の人も読んで損はない本だと言えるでしょう。

まさに今 RWO で OCaml を試そうとしている人に


RWO は今現在 beta バージョンなのでいくつか問題があります。


ちょっと前の Core は 32bit 環境ではインストールできませんでしたが、109.31.00 は 32bit 環境でも入ります。


Windows はまだ対応 OS に入っていません。OPAM が Windows ではまだ動かない だけでなく… Async とか Windows で問題なく動くんでしょうか…色々と問題が まだあると思います。これは…どうなんでしょうね。OPAM チームは別に RWO の出版とか関係ないので RWO が正式出版されてもまだ無理だったとか 普通にあると思います。まあ WindowsOCaml を使うなら仕事でもない限り、 私のように仮想環境で Linux 入れることをオススメしますね。

PS

並列と並行また入れ換えて書いてた。もーやだー。なので英語にしました。

  • 並列(parallel) computing 時代はマルチコアでびゅんびゅん!
  • 並行(平行にあらず)(concurrent) computing 並べてプログラム実行して並べないときより簡単綺麗!マルチコアでなくてもいいよ