OCaml

出典: フリー百科事典『ウィキペディア(Wikipedia)』
2014年6月1日 (日) 16:17時点におけるMetaNest (トーク)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

テンプレート:Infobox プログラミング言語

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

概要

もとは Caml[2]という、MLの方言の処理系実装、および言語であったが、クラス宣言やオブジェクトの生成、継承などのオブジェクト指向的要素が追加され Objective Caml という名前になり、その後、略称だった OCaml を正式な名前とした。ウェブサイトの概要説明では「OCamlCaml派生の言語の中で最も知られたものである」[3]としている。もとの処理系も配布され続けており、Caml Light という名前になっている。英語では Camlcamel(ラクダ)と同様に発音されており、アイコン等にもラクダを使っている。

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

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

フランスではプログラミング教育などに用いられることもある言語であるテンプレート:要出典が、日本国内では一部の研究者を除き、あまり知られていなかった。2007年に OCaml の入門書が2点発売されるなど、徐々に知名度を上げている。

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

Caml

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

MinCaml

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

MinCaml コンパイラは教育目的での利用を主眼としている。わずか2000行前後のコードで書かれており、実装されている機能はMLのサブセットである。バックエンドはSPARCx86に対応しており、ある程度の学習をすれば比較的容易に改造を行うことができる(実際、有志によってPowerPC用に出力できるバージョンも提供されている。バックエンドをLLVMに置き換えた例も報告されている[7]。)。実際に東京大学情報科学科などで教育目的に利用され、国内における OCaml および関数型言語の普及と理解に一定の役割を果たしている。

その他

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

プログラム例

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

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

Hello World

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

 print_endline "Hello world!";;

以下のようにしてバイトコードコンパイルされる。

$ ocamlc hello.ml -o hello

以下が実行結果である。

$ ./hello
Hello world!
$

クイックソート

クイックソートのコード例を示す。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

チャーチ数

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

let zero f x = x
let succ n f x = f (n f x)
let one = succ zero
let two = succ (succ zero)
let add n1 n2 f x = n1 f (n2 f x)
let to_int n = n (fun k -> k+1) 0
let _ = print (add (succ two) two)

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

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

参考文献

脚注

テンプレート:Reflist

関連項目

外部リンク

  • http://caml.inria.fr/ocaml/name.en.html
  • 圏抽象機械語を意味する英語「categorical abstract machine language」に由来する。
  • テンプレート:Lang-en-short
  • テンプレート:Cite book
  • Texvc - MediaWiki
  • 正確には名前だけでなく、新しい手法で再実装されたもので、OCaml より Caml Light のほうが古くからある。
  • http://mzp.hatenablog.com/entry/2013/05/08/214712