OCaml

出典: フリー百科事典『ウィキペディア(Wikipedia)』
Objective Camlから転送)
移動: 案内, 検索
OCaml
パラダイム 関数型言語オブジェクト指向言語
開発者 INRIA
最新リリース 3.12.1(2011年7月4日(7か月前) (2011-07-04)
型付け 強い静的型付け
主な処理系 OCaml
影響を受けた言語 Caml, Standard ML
影響を与えた言語 F#, Scala, HaXe
プラットフォーム クロスプラットフォーム
ライセンス Q Public License
ウェブサイト http://caml.inria.fr/ocaml/
テンプレートを表示

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

目次

[編集] 概要

もとはCaml(Categorical Abstract Machine Language)という、MLの方言の処理系実装、および言語であったが、クラス宣言やオブジェクトの生成、継承などのオブジェクト指向的要素が追加されObjective Camlという名前になり、その後、略称だったOCamlを正式な名前とした。ウェブサイトのOverviewでは「OCaml is the most popular variant of the Caml language.」としている。もとの処理系も配布され続けており、Caml Lightという名前になっている。英語ではCamlはcamel (ラクダ)と同様に発音されており、アイコン等にもラクダを使っているが、Perlの「ラクダ本」と違いをつけるためか、ふたこぶラクダである。

MLの特徴の他に、関数型とオブジェクト指向の両方を併せもつことが特徴的である。ただしそのため、オブジェクト指向を利用した破壊的操作を伴うプログラムがかなり容易に書けてしまう。また、polymorphic variantという特殊なバリアント型が特徴的である。

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

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

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

[編集] Caml

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

[編集] MinCaml

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

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

[編集] その他

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

[編集] 外部リンク

[編集] プログラム例

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

JavaやC言語のプログラマから見て特異である点は、静的型付け言語であるにも関わらず、型の宣言が一切ないことである。MLの型推論を活用している。

[編集] 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 で書かれたソフトウェア

[編集] 参考文献

  • OCaml-Nagoya 『入門OCaml - プログラミング基礎と実践理解』 毎日コミュニケーションズ、東京、2007年5月。ISBN 978-4-8399-2311-2
  • 五十嵐淳 『プログラミングin OCaml : 関数型プログラミングの基礎からGUI構築まで』 技術評論社、東京、2007年12月。ISBN 978-4-7741-3264-8

[編集] 脚注

  1. ^ http://caml.inria.fr/ocaml/name.en.html
  2. ^ OCaml-Nagoya (2007). 『入門OCaml』. 毎日コミュニケーションズ. pp. p.17. ISBN 9784839923112. 

[編集] 関連項目

[編集] 外部リンク

個人用ツール
名前空間

変種
操作
案内
ヘルプ
ツールボックス
他の言語