OCaml (オーキャムル) とは
OCaml(オーキャムル、オーキャメル)は、フランスの INRIA が開発した
プログラミング言語で、関数型言語 ML の方言の一つです。当初は Objective Caml という名称でしたが、後に OCaml に改名されました。関数型プログラミングの特徴に加え、
オブジェクト指向の要素も取り入れている点が大きな特徴です。
歴史
OCaml の前身は Caml という ML の処理系実装でした。Caml は "categorical abstract machine language" の頭字語に由来します。その後、より効率的な抽象機械ベースに書き直され、クラスや継承などの
オブジェクト指向機能が追加されて Objective Caml となりました。現在では略称だった OCaml が正式名称となっています。公式サイトでは、「OCaml は Caml 派生の言語の中で最も知られたものである」と紹介されています。また、オリジナルの処理系も Caml Light という名前で配布され続けています。
特徴
OCaml は、関数型プログラミングと
オブジェクト指向プログラミングの両方のパラダイムをサポートしています。関数型言語としての特徴を持ちながら、
オブジェクト指向の機能も利用できるため、柔軟なプログラミングが可能です。しかし、その一方で、
オブジェクト指向の機能を使った破壊的操作も容易に記述できるため注意が必要です。また、多相バリアント型という特殊な型により、サブセットやスーパーセットの関係にあるバリアント型を定義できるのも特徴の一つです。
処理系としての特徴としては、関数型言語でありながら高速に動作することが挙げられます。gcc でコンパイルされた C 言語とほぼ同等の速度で実行できると言われています。
また、関数型言語としてはアプリケーションの数が比較的多く、
MediaWiki の数式処理などにも使われています。
Caml と MinCaml
Caml は OCaml の前身であり、現在も Caml Light として配布されています。
MinCaml は、
ペンシルベニア大学(当時)の住井英二郎氏が OCaml で実装した、Caml の小型版です。
コンパイラ自体が OCaml で記述されており、教育目的での利用を主眼としています。MinCaml は 2000 行程度のコードで実装されており、ML のサブセットを実装しています。バックエンドは
SPARC と x86 に対応しており、比較的容易に改造できます。
東京大学理学部情報科学科などでも教育目的に利用されており、OCaml および関数型言語の普及に貢献しています。
Moscow ML
Moscow ML は、Caml や OCaml のような方言ではなく、Standard ML (SML) の処理系実装に Caml Light を利用しています。完全な SML を実装している点が特徴です。
その他の関連技術
研究用途では、大規模化した OCaml ではなく、Caml Light をベースに改造する事例も見られます。OchaCaml などがその例です。
プログラム例
以下に、OCaml のコード例を示します。これらの例は、OCaml の特徴である型推論や関数型プログラミングのスタイルを示しています。多くの場合、型宣言を省略でき、コードが簡潔になるのが特徴です。
Hello World
ocaml
print_endline "Hello, world!";
これをコンパイルし、実行すると以下のようになります。
Hello, world!
ocaml
let rec quicksort = function
| [] -> []
| pivot :: rest ->
let smaller, larger = List.partition (fun x -> x < pivot) rest in
quicksort smaller @ [pivot] @ quicksort larger
let list = [5; 2; 8; 1; 9; 4]
let sorted_list = quicksort list
List.iter (Printf.printf "%d ") sorted_list;; (
Output: 1 2 4 5 8 9 )
チャーチ数
ocaml
let church n f x =
let rec apply_n times value =
if times = 0 then value else apply_n (times-1) (f value)
in apply_n n x
let to_int n = n (fun x -> x+1) 0
let three = church 3
let result = to_int three
Printf.printf "%d
" result (
Output: 3 )
OCaml で書かれたソフトウェア
OCaml は、多くの著名なソフトウェアの開発にも利用されています。
FFTW: 高速フーリエ変換ライブラリ。C言語のコードを生成する OCaml プログラムが使用されています。
Unison: ディレクトリ間のファイル同期ツール。
Mldonkey: P2P ファイル共有クライアント。
GeneWeb: 家系図ソフトウェア。
Haxe: プログラミング言語およびコンパイラ。
Frama-c: C言語プログラム解析フレームワーク。
Coq: 定理証明支援系。
Flow: JavaScript の静的型チェッカー。
fbinfer: Java、C言語、C++、Objective-C向けの静的解析チェッカー。
Tezos: 自己進化型のスマートコントラクトプラットフォーム。
参考文献
OCaml-Nagoya『入門OCaml - プログラミング基礎と実践理解』毎日コミュニケーションズ、東京、2007年5月。
五十嵐淳『プログラミング in OCaml: 関数型プログラミングの基礎からGUI構築まで』技術評論社、東京、2007年12月。
関連項目
HDCaml
F Sharp
外部リンク
公式ウェブサイト
Objective Caml 入門
OCaml プログラミング入門
Akihito Nagata's Page
OCaml.JP
OCamlチュートリアル
ODT: OCaml Development Tools
PLEAC-Objective CAML