OCaml

GNU Octave}}

OCamlは、フランスの fr が開発したプログラミング言語MLの方言とその実装である。MLの各要素に加え、オブジェクト指向的要素の追加が特長である。かつては Objective Caml という名前で、その略として OCaml と広く呼ばれていたが、正式に OCaml に改名された。

1. 概要
-----

もとはCamlという名前の、MLの方言の処理系実装、および言語であった。この名前はcategorical abstract machine languageの頭字語に由来する。やがて、categorical abstract machineよりも効率の良い抽象機械ベースに書き直され、クラスや継承などクラスベースオブジェクト指向の言語機能が追加され Objective Camlという名前になり、その後、略称だったOCamlを正式な名前とした。ウェブサイトの概要説明では「OCamlはCaml派生の言語の中で最も知られたものである」としている。もとの処理系も配布され続けており、Caml Lightという名前になっている。英語ではCamlはcamelと同様に発音されており、アイコン等にもラクダを使っている。

MLの特徴の他に、関数型とオブジェクト指向の両方を併せもつことが特徴的である。ただしそのため、オブジェクト指向を利用した破壊的操作を伴うプログラムがかなり容易に書けてしまう。また、多相バリアント型という特殊なバリアント型により、サブセットとスーパーセットの関係になっているバリアント型などを記述できるなどといった特徴もある。

処理系としての特徴は、関数型言語としてはかなり高速に動作することが挙げられ、gccでコンパイルされたC言語と互角かやや遅い程度と言われる。

関数型言語としては比較的アプリケーションの数が多く、例えばMediaWikiにおいてTeXの記述からHTML、MathMLおよび画像の数式を生成するプログラムもOCamlで記述されている。

2. Caml
-------

Caml は OCaml の前身であるMLの方言とその実装である。現在も Caml Light という名前で配布され続けている。

2.1. MinCaml
------------

MinCamlは、ペンシルベニア大学の住井英二郎がOCamlで実装した、Caml似のMLの小型版である。同作者により、コンパイラが OCaml 自身で書かれている。MinCaml は、2004年度の未踏ソフトウェア創造事業に採択された。

MinCaml コンパイラは教育目的での利用を主眼としている。わずか2000行前後のコードで書かれており、実装されている機能はMLのサブセットである。バックエンドはSPARCとx86に対応しており、ある程度の学習をすれば比較的容易に改造を行うことができる。実際に東京大学理学部情報科学科などで教育目的に利用され、国内における OCaml および関数型言語の普及と理解に一定の役割を果たしているdate=2016年3月。

[1] - MinCamlの配布・解説

2.2. Moscow ML
--------------

CamlやOCamlのような方言ではなく、SMLの処理系の実装にCaml Light利用している。完全なSMLを実装する。

2.3. その他
--------

OchaCaml など、研究用の改造のベースとして、規模の大きくなった OCaml ではなく Camlを利用する例がみられる。

3. プログラム例
---------

以下の例は、プログラム自体としてはMLと比べ特別なものでもないし、オブジェクト指向を活用したものでもないが、OCaml を含む Caml では旧来のMLや Standard ML からの記法や演算子や名前の変更が多く、簡単なプログラムでもそのままではエラーになるものが多いので、ここでは OCaml のコードを示す。

特徴として、型推論の活用により、多くの場合に型の宣言が必要なく、一部の静的型付き言語にありがちな煩雑さがないことが挙げられる。

3.1. Hello World
----------------

Hello world の例を示す。以下のプログラム hello.ml は、 print_endline "Hello world!";;

以下のようにしてバイトコードにコンパイルされる。 $ ocamlc hello.ml -o hello

以下が実行結果である。 $ ./hello Hello world! $

3.2. クイックソート
------------

クイックソートのコード例を示す。MLは多くの関数型言語と同様、再帰処理に秀でる。また、Haskell などにも見られるパターンマッチの機能がここでも使われている。

let rec quicksort = function | [] -> [] | pivot :: rest -> let is_less x = x < pivot in let left, right = List.partition is_less rest in quicksort left @ [pivot] @ quicksort right

3.3. チャーチ数
----------

以下は、ラムダ計算の教科書などに見られる、自然数のチャーチ符号化のコード例である。

let zero f x = x let succ n f x = f  let one = succ zero let two = succ  let add n1 n2 f x = n1 f  let to_int n = n  0 let _ = print  two)

チャーチ数//n//は、高階関数として表され、関数fと値xを受け取りxにn回fを適用する関数として定義されている。チャーチ数//n//を自然数//n//に変換するには、チャーチ数に、インクリメントする関数と初期値0を渡せばよい。MLは関数型言語であるため、数学的なプログラミングの理論そのままに、記述することができる。

4. OCaml で書かれたソフトウェア
--------------------

FFTW – 離散フーリエ変換を高速に行う高速フーリエ変換のライブラリ。C言語のコードを出力するgenfft という OCaml プログラムが使われている。
Unison – 二つのディレクトリのファイルを比較し同期をとるプログラム。
Mldonkey – EDonkey network 用の P2P クライアント。
GeneWeb – マルチプラットフォームの、フリーの家系図ソフトウェア。
Haxe – オープンソースのプログラミング言語およびコンパイラ実装。
Frama-c – C言語のプログラムを解析するためのフレームワーク。
Coq - INRIAで開発されている定理支援証明系言語。
Flow - JavaScriptの静的型チェッカー。Facebookにより開発されている。
fbinfer - Java、C言語、C++、Objective-C 向けの静的解析チェッカー。Facebookがオープンソース化した。
Tezos - 自己進化型のスマート・コントラクト プラットフォーム。XTZ を仮想通貨とする。

5. 参考文献
-------

6. 脚注
-----

7. 関連項目
-------

HDCaml
F Sharp

8. 外部リンク
--------

[2]
[3]
[4]
[5]
[6]
[7]
[8]