OCaml プログラミング入門


OCaml のすすめ

OCaml とはフランスの 情報技術系の研究機関の INRIA で開発されている関数型言語 ML (の方言) です。ML には多相型、型推論、ガーベージコレクション (GC)、 データ構造のパターンマッチング等、プログラミング言語理論の研究の 成果 (すごく最新のものと言うわけでは無いそうですが) が詰め込まれ ています。これらの目的・効用は、

等です。私は OCaml を研究でのデータ処理をはじめ、作成するプログラムほとんど 全てにおいて日常的に使っているのですが、 とにかく開発効率が良いです。 コンパイル時の型チェックの厳しさには慣れないとちょっと面倒に感じる かもしれませんが、 その苦労は実行時に報われます。ある程度の規模の プログラムになってきても、コンパイル直後に デバッグする事無く、そのまま実行できちゃう 事も少なくありません。型チェックが通ってすんなり実行できた 時の快感は病み付きになります (^^;。 実行速度のほうも、関数型言語は遅いと思われているようですが、 最近では gcc 等の C 言語のコンパイラに迫る程になって来ています。 (さすがに商用のコンパイラには敵わないようですが)

とにかく良い事づくめの言語で、 なんであまり普及していないの? と言うのが不思議でたまりません。 万能な言語なんてもちろんないですが、ML や OCaml はもっとひろまっても 良い言語だと思っています。なぜいまだにマイナーな言語か、Ocaml のマイナス点を 幾つか理由を考えてみました。

手続型言語に比べて実行速度が遅いのでは?
LISP や Scheme などの関数型言語は、実行時に変数の型情報を持っている必要があるため、 どうしてもオーバーヘッドが生じてしまいます。 それに比べて、ML は C 言語と同じように「静的に型付けされた」言語、つまり、 コンパイル時に型の整合性をチェックするので、実行時にはこのオーバヘッドはありません。 確かに OCaml で書いたプログラムは、高度に最適化された C で書いたプログラムには実行速度の点で勝てないでしょう。 でも、ちゃらっと書いたコードが (gcc でコンパイルする) C のコードと同等 (もしくはまぁ2倍程度の遅さ) の実行速度である、と言うのはほとんどの場合十分速いと思われます。 (まぁ Perl などが流行ってる今日この頃、実行速度は多くの場合あんまり関係無いような気もしますが...)
ライブラリが少ない?
商用目的で企業がバリバリ使うにはちょっと心細いかもしれないです。 が、最近はライブラリが色々と充実して来ているようで、 日常的な仕事(?)なら十分に事足りる感じはします。 この点で一番私が残念に思うのは、gtk, tk などが使えるライブラリがあるものの、 Java のように「公式な GUI ライブラリ」が無い事でしょうか。 残念なのはコンパイラ自体はクロスプラットフォームで使えて、 GUI を使わなければ何も考えずにそのまま移植ができるのに... と言うことですかね。まあクロスプラットフォーム GUI の問題は OCaml に限った話でも無いですね。
使っている人があまりいない?
プログラミング言語などの研究者の間では結構使われているようです。 って一般人から見ると、別にあんまり嬉しくないですね。(^^; OCaml 本家のメイリングリストを見ると、研究者以外でもいろんな用途で 使っている人がいるみたいですが...日本ではほとんど聞かないですねぇ。
難しいのでは?
私が思うにML は すごく頭の良い人達が難しい理論で色々と考えてくれた結晶 なのです。 背景となっている理論は難しそうに思えますが、 理論なんてのは、「このプログラミング言語の性質がこうである」 と言うのをキチンと言うためだけのもので、 その言語を使うだけならあまり関係無いように思えます (現に私は良くわかっていないです)。 (おそらく) 理論のおかげで ML の言語仕様はとても綺麗で、 C や C++ 等と比べると、コアの部分では覚えるべき事はかなり少ないです。 ただしドキュメント不足が痛いところで、このページがそれを少しでも解消できたら幸いです。

普及していない一番の理由はやっぱりマイクロソフトが開発環境を作ってないからなのではないかと思う今日この頃。 でも最近ではマイクロソフトも F# と言うのを作ってるみたいですね。楽しみです。

まあそんな事言っていてもしょうがないので、 現状はと言うと、OCaml に関しては、Linux (UNIX 系なら大抵 OK)、 MacOS (X 含む)、Windows などの環境でも使えます。 また、OCaml はコンパイラーと、インタープリタの両方を備えていて、 インタープリタを通じてインタラクティブな開発をし、速度のためにコンパイルをする等の事が行なえます。 リアルタイム性や厳しいメモリ使用の条件が要求されたりする場合ならばともかく、 いわゆる普通のアプリケーションを作成する場合には自信を持ってお勧めできる言語です。 また、多くの大学の情報系の学科等で教育に使われている事を考えると、 初心者や(私のような)素人プログラマーに最適の言語では無いかと思います。

ただ、初心者にとって最も大きな問題となっているのは、(英語でさえも) 良い入門書などがそれほど多くない事、 あっても、プログラミング言語理論の専門家によって書かれていたりして、 背景知識がある程度必要だったり、あまり親切に書かれていなく :-P、 初心者にはちょっととっつきにくいような気がします。 というわけで、このページでは あまり難しい事は考えずに (私が考えられない、とも言う)、 プログラミングをちょこっとした事ある人なら理解できそうな簡単な OCaml のチュートリアルを目指そうと思います。このページを通じて ML の素晴らしさを知ってもらえたら幸いです。 ただし、私のようにハマってしまうと C、C++ 等でのコーディングが 苦痛になるので、気をつけて下さい (^^;。

なお、このページに書かれている事に関する注意ですが、 私は OCaml を日常的に利用していますが、 プログラミング言語理論の専門家ではないので、 間違った理屈を述べてるところも大いにあります。 間違っている場合は御指摘頂ければ適宜修正します。

目次

虫食い(&あまり整理されていない)状態ですが、 徐々に改善して行こうかと思います。更新のペースが遅すぎるようでしたら、 元気が出るようメールでも下さい (^^;。 「初心者には何が難しいのか?」を自分で学んだ時の事を思い出しながら 書いていますが、そんなのは十人十色だと思うので、「ここをもうちょっと 詳しく説明して!」や、「なんでこうなるの?」などの質問・要望も歓迎です。

入門編

  1. はじめに
  2. インストール
  3. とにかく使ってみる
  4. 基本
  5. モジュール
  6. ループあれこれ

応用編

  1. 文字列処理
  2. グラフィックス
  3. C との連携
  4. 効率の追及
  5. はまりやすい罠
  6. より高度な機能
  7. 「○○がしたい時はどうする?」集

LINKS

ocaml.jp

『僕と一緒に型推論しませんか?』日本語の OCaml 情報ページ。 言語じゃない方の ML (メイリングリスト) もあります。

OCaml のホームページ (英語|日本語)

OCaml の公式ホームページ (?) です。日本語版は「正式なもの」では無いらしく、完全ではないみたいです(&ちょっと古い)。

http://www.ocaml.org/ (英語)

上とはどういう関係なのでしょう? OCaml に関する色々な情報があります。

京都大学五十嵐先生の授業のページ

結構詳しく、わかりやすいのではないでしょうか。しかもかなり専門の方です。というか、私のページの意義が...。アハハ (T_T)

関数型プログラミング言語MLスレ@2ch

初心者からかなりレベルの高い人までいるようです。>>1 は私ではありません。いや本当に。