Objective CAMLとは? わかりやすく解説

OCaml

(Objective CAML から転送)

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2026/04/10 20:01 UTC 版)

OCaml
OCamlのロゴ
登場時期 1996年 (30年前) (1996)[1]
開発者 フランス国立情報学自動制御研究所 (Inria)
最新リリース 5.4.0[2] / 9 October 2025年 (6か月前) (9 October 2025)
型付け 強い静的型付け型推論構造的型付け英語版
影響を受けた言語 CCaml英語版Modula-3PascalStandard ML
影響を与えた言語 ATS英語版Rocq(旧称: Coq)、ElmF#F*HaxeOpa Rust[3]ScalaGleam
プログラミング言語 OCaml、C
プラットフォーム クロスプラットフォーム: LinuxUnixmacOSWindows
ライセンス LGPLv2.1
ウェブサイト 公式ウェブサイト
拡張子 .ml, .mli
関連言語 ML: Caml英語版
テンプレートを表示

OCaml(オーキャムル、オーキャメル、旧称: Objective Caml)は、汎用、高水準、マルチパラダイムプログラミング言語であり、MLCaml英語版方言にオブジェクト指向の機能を追加したものである。1996年にグザヴィエ・ルロワジェローム・ヴイヨン英語版[4]ダミアン・ドリジェ英語版ディディエ・レミ英語版[5]、Ascánder Suárezらによって開発された。

OCamlのツールチェーンには、対話型のトップレベルインタプリタバイトコードコンパイラ、最適化を行うネイティブコードコンパイラ、リバーシブルなデバッガパッケージ管理システムOPAM)、および組み合わせ可能なビルドシステム(Dune)が含まれている。OCamlは当初、自動定理証明の文脈で開発され、静的解析形式手法のソフトウェアで利用されている。これらの分野を超えて、システムプログラミング英語版Web開発、特定の金融ユーティリティなど、様々なアプリケーション領域で活用されている。

名称の「CAML」は元々「Categorical Abstract Machine Language(圏論的抽象機械言語)」の頭字語であったが、OCamlではこの抽象機械を省略している[6]。OCamlはフランス国立情報学自動制御研究所(Inria)によって管理および主に保守されているフリーかつオープンソースのプロジェクトである。2000年代初頭、OCamlの要素は多くの言語、特にF#Scalaなどに採用された。

設計思想

ML派生の言語は、その静的な型システム型推論コンパイラで最もよく知られている。OCamlは、ML風の型システムの下で関数型命令型、およびオブジェクト指向のパラダイムを統合している。そのため、プログラマはOCamlを使用するにあたって、純粋関数型言語のパラダイムに精通している必要はない。

プログラマに対し、その静的型システムの制約内で作業することを要求することにより、OCamlは動的型付け言語によく見られる型に関連した実行時の多くの問題を排除する。また、OCamlの型推論コンパイラは、多くの静的型付け言語で必要とされる手動による型アノテーションの必要性を大幅に減らす。たとえば、変数のデータ型や関数の型シグネチャ英語版は、コード内の変数や他の値に適用される演算子や他の関数から推論できるため、JavaC#などの言語のように明示的に宣言する必要がない場合が多い。OCamlの型システムを効果的に使用するには、プログラマに一定の熟練が求められることがあるが、この規律は信頼性の高い高性能なソフトウェアという形で報われる。

学術界に起源を持つ他の言語と比較して、OCamlを最も特徴づけているのはパフォーマンスへの重点かもしれない。その静的型システムは実行時の型の不一致を防ぐため、動的型付け言語のパフォーマンスの負担となる実行時の型チェックや安全性チェックを不要にしつつも、配列の境界チェック英語版をオフにした場合や、シリアライズのような型安全でない機能を使用した場合を除いて、実行時の安全性を保証する。これらは極めて稀であるため、実際には避けることが十分に可能である。

型チェックのオーバーヘッドを別としても、関数型言語は一般に、Funarg問題などの問題により、効率的な機械語コードにコンパイルするのが難しい。標準的なループ、レジスタ、命令の最適化に加えて、OCamlの最適化コンパイラ英語版静的プログラム解析手法を用いて値のボクシング(boxing)とクロージャの割り当てを最適化し、関数型プログラミングの構造を多用した場合でも、生成されるコードのパフォーマンスを最大化するよう支援する。

グザヴィエ・ルロワは「OCamlは、まともなCコンパイラの少なくとも50%のパフォーマンスを発揮する」と述べているが[7]、直接的な比較は不可能である。OCamlの標準ライブラリのいくつかの関数は、他の言語の標準ライブラリにおける同等の関数よりも高速なアルゴリズムで実装されている。たとえば、OCaml標準ライブラリにおける集合の和集合の実装は、OCamlの実装が集合の不変性(immutability)を利用して入力集合の一部を出力で再利用できるため(永続データ構造を参照)、理論的には命令型言語(C++、Javaなど)の標準ライブラリにおける同等の関数よりも漸近的に高速である。

歴史

プログラミング言語の原理に関するシンポジウム (POPL)2024で賞を受け取るOCaml開発チーム

ML(Meta Language)の開発

1970年代から1980年代にかけて、イギリスの計算機科学者でありチューリング賞受賞者のロビン・ミルナーは、エディンバラ大学計算機科学基礎研究所英語版で研究を行っていた[8][9]。ミルナーらは定理証明器の開発に取り組んでおり、これらは歴史的にLispなどの言語で開発されていた。ミルナーは、定理証明器が証明ではないものを組み合わせることで証明が有効であると主張しようとする問題に繰り返し直面した[9]。その結果、彼は自身の計算可能関数ロジック英語版(LCF)のためのメタ言語(meta language)を開発することになった。これは多相型システムによって、プログラマが有効な証明のみを構築できるようにする言語であった[10]。MLは、異なるマシンでのLCFの使用を簡素化するためにコンパイラへと変えられ、1980年代までにはそれ自体が完全なシステムとなった[10]。MLは最終的にOCamlの基盤として機能することになる。

1980年代初頭、フランス国立情報学自動制御研究所(Inria)のFormelチームがMLに関心を持つきっかけとなるいくつかの進展があった。オックスフォード大学の研究教授であったルカ・カルデリ英語版は、自身の「関数型抽象機械(functional abstract machine)」を使用してMLのより高速な実装を開発し、ロビン・ミルナーは様々な実装間の相違を避けるためにMLの新しい定義を提案した。同時に、パリ・ディドロ大学(現・パリ・シテ大学)の上級研究員であったピエール=ルイ・キュリアン(Pierre-Louis Curien)は圏論的コンビネータ(categorical combinators)の計算を開発し、それをラムダ計算に結びつけた。これにより「圏論的抽象機械英語版(CAM)」の定義が導かれた。パリ・ディドロ大学の研究者ガイ・クジノー(Guy Cousineau)は、これがMLのコンパイル手法として適用できることを認識した[11]

初期の実装

Caml英語版は、ジェラール・ユエ英語版率いるInriaのFormelチームによって最初に設計および開発された。Camlの最初の実装は1987年に作成され、1992年までさらに開発が続けられた。開発はAscánder Suárezによって主導されていたが、1988年に彼が去った後はピエール・ワイスとミシェル・モーニー(Michel Mauny)が開発を引き継いだ[11]

Caml Light

1990年から1991年にかけて、グザヴィエ・ルロワC言語で書かれたバイトコードインタプリタに基づくCaml英語版の新しい実装を設計した。これに加えて、ダミアン・ドリジェ英語版はこの実装のために、シーケンシャルなガベージコレクションとして知られるメモリ管理システムを記述した[10]Caml Light英語版として知られるこの新しい実装は、古いCamlの実装を置き換え、小型のデスクトップマシンで動作した[11]。その後数年で、ミシェル・モーニーの構文操作ツールなどのライブラリが登場し、教育や研究チームでのCamlの使用を促進するのに役立った[10]

Caml Special Light

1995年、グザヴィエ・ルロワはCaml英語版の改良版であるCaml Special Lightをリリースした[11]。バイトコードコンパイラに最適化されたネイティブコードコンパイラが追加され、これによりパフォーマンスがC++などの主要言語と同等レベルにまで大幅に向上した[10][11]。また、ルロワはStandard MLのモジュールシステムに触発された高水準モジュールシステムを設計した。これにより、抽象化とパラメータ化のための強力な機能が提供され、より大規模なプログラムの構築が容易になった[10]

Objective Caml

ディディエ・レミとジェローム・ヴイヨンは、オブジェクトとクラスのための表現力豊かな型システムを設計し、それがCaml Special Lightに統合された。これにより、1996年に初めてリリースされたObjective Caml言語が誕生し、後に2011年にOCamlへと改名された。このオブジェクトシステムは、C++やJavaなどの言語では型の不健全性(unsoundness)を引き起こしたり、実行時のチェックを必要としたりするような、普及している多くのオブジェクト指向のイディオムを、静的かつ型安全な方法でサポートしていた。2000年にジャック・ガリグ(Jacques Garrigue)は、多相メソッド、バリアント、ラベル付きおよびオプションの引数など、複数の新機能でObjective Camlを拡張した[10][11]

継続的な開発

増大するOCamlの商業的および学術的なコードベースをサポートするため、過去20年間にわたり言語の改善が段階的に追加されてきた[10]。2012年のOCaml 4.0のリリースでは、言語の柔軟性を高めるために、一般化代数的データ型(GADT)とファーストクラス・モジュールが追加された[10]。2022年のOCaml 5.0.0リリース[12]は言語ランタイムの完全な書き直しであり、グローバル・インタプリタ・ロック英語版(グローバルGCロック)が削除され、限定継続(delimited continuations)を介したエフェクトシステム英語版(effect handlers)が追加された。これらの変更により、それぞれ共有メモリ並列処理と、カラーブラインド並行性(color-blind concurrency)のサポートが可能になる。

OCamlの開発は2005年までInriaのCristalチーム内で行われていたが、その後Galliumチームに引き継がれた[13]。続いて、2019年にGalliumはCambiumチームに引き継がれた[14][15]。2023年現在、コンパイラ配布のコア開発者は様々な組織からの23名で構成されており[16]、幅広いOCamlツーリングおよびパッケージング・エコシステムには41名の開発者がいる[17]。2023年、OCamlコンパイラはSIGPLAN英語版(ACM SIGPLAN Programming Languages Software Award)を受賞した。

特徴

OCamlは、静的な型システム型推論パラメトリック多相性英語版末尾再帰パターンマッチング、ファーストクラスの静的クロージャ、ファンクタ(パラメータ化されたモジュール)、例外処理エフェクトシステム英語版(effect handling)、およびインクリメンタルな世代別ガベージコレクションを特徴としている。

OCamlは、汎用言語においてMLスタイルの型推論をオブジェクトシステムに拡張していることで知られている。これにより、宣言された継承に関係なく、メソッドのシグネチャが互換であればオブジェクト型に互換性があるという、構造的型付け英語版(structural subtyping)が可能になる(これは静的型付け言語では珍しい機能である)。

CやFORTRANと互換性のある形式の効率的な数値配列(array)の言語サポートを含む、C言語のプリミティブをリンクするためのForeign function interface(FFI)が提供されている。OCamlは、Cの「main」プログラムにリンクできるOCaml関数のライブラリの作成もサポートしており、OCamlの知識がない、またはインストールしていないCプログラマにもOCamlライブラリを配布することができる。

OCamlには、言語の不可分な一部としてのマクロシステム(メタプログラミング)、すなわちプリプロセッサによる前処理の組み込みサポートはないが、OCamlプラットフォームは公式に、そのようなプリプロセッサを記述するためのライブラリをサポートしている。これらには2つの種類がある。1つは(C言語のように)ソースコードレベルで機能するもの、もう1つは抽象構文木(AST)レベルで機能するものである。後者は「PPX」(Pre-Processor eXtensionの略)と呼ばれ、推奨されている方式である。

OCamlのディストリビューションには以下が含まれる:

ネイティブコードコンパイラは、UNIXMicrosoft WindowsApple macOSを含む多くのプラットフォームで利用できる。主要なアーキテクチャに対するネイティブコード生成のサポートにより、移植性が実現されている:

  • x86-64 (AMD64)、RISC-V、およびARM64(OCaml 5.0.0以降)[18]
  • IBM Z(OCaml 5.0.0以前、およびOCaml 5.1.0で復活)
  • Power(OCaml 5.0.0以前、OCaml 5.2.0で再登場予定)
  • IA-32およびARM(OCaml 5.0.0以前)
  • SPARC(OCaml 4.06.0以前)
  • DEC AlphaHPPAIA64、およびMIPS(OCaml 4.00.0以前)

バイトコードコンパイラは、ネイティブコード生成が利用できない場合でも、Cコンパイラさえあれば、任意の32ビットまたは64ビットアーキテクチャでの動作をサポートする。

OCamlのバイトコードおよびネイティブコードプログラムは、プリエンプティブなコンテキストスイッチを備えたマルチスレッドスタイルで記述できる。同じドメイン[19]内のOCamlスレッドは、タイムシェアリングによってのみ実行される。ただし、1つのOCamlプログラムには複数のドメインを含めることができる。

その他の派生実装および方言

Caml Light

前述の通り、OCamlの前身である実装。正確には名前だけでなく、新しい手法で再実装されたものであり、OCamlよりCaml Lightのほうが古くからある。現在もCaml Lightとして配布され続けている。

MinCaml

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

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

Moscow ML

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

その他

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

派生言語

MetaOCaml

MetaOCaml[21] は、実行中に新しい機械語コードのインクリメンタルなコンパイルを可能にする、OCamlの多段階プログラミング英語版拡張である。いくつかの状況下では、多段階プログラミングを使用することで大幅な高速化が可能になる。これは、通常のコンパイル時よりも実行時の方が処理するデータに関する詳細な情報が得られるため、インクリメンタルコンパイラが条件チェックなどの多くのケースを最適化して排除できるためである。

例として、コンパイル時に何らかの冪乗関数x -> x^nが頻繁に必要になることがわかっているが、nの値はランタイム時にしかわからない場合、MetaOCamlでは2段階の冪乗関数を使用できる。

let rec power n x =
  if n = 0
  then .<1>.
  else
    if even n
    then sqr (power (n/2) x)
    else .<.~x *. .~(power (n - 1) x)>.

実行時にnが判明するとすぐに、特化された非常に高速な冪乗関数を作成できる。

.<fun x -> .~(power 5 .<x>.)>.

その結果、以下のようになる。

fun x_1 -> (x_1 *
    let y_3 = 
        let y_2 = (x_1 * 1)
        in (y_2 * y_2)
    in (y_3 * y_3))

新しい関数は自動的にコンパイルされる。

その他の派生言語

プログラム例

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

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

OCamlのコード・スニペットは、トップレベルの対話型環境(REPL)に入力することで最も簡単に学習できる。これは、結果または定義された式の推論された型を出力する対話型のOCamlセッションである[22]。OCamlのトップレベルは、単にocamlプログラムを実行することで起動する。

$ ocaml
OCaml version 5.4.0
Enter #help;; for help.

#

その後、プロンプト "#" にコードを入力できる。例えば、

全般 国立図書館 その他

Objective Caml

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2011/09/23 01:53 UTC 版)

Objective Caml
パラダイム 関数型言語オブジェクト指向言語
開発者 INRIA
最新リリース 3.12.1(2011年7月4日(2か月前) (2011-07-04)
型付け 強い静的型付け
影響を受けた言語 Caml Light, Standard ML
影響を与えた言語 F#, Scala, HaXe
プラットフォーム クロスプラットフォーム
ライセンス Q Public License
ウェブサイト http://caml.inria.fr/
テンプレートを表示

Objective Caml(オブジェクティブ・キャムル)は、フランスのINRIAが開発したプログラミング言語MLの方言とその実装である。通常 OCaml(オキャムル) と略称される。MLの各要素に加え、オブジェクト指向的要素の追加が特長である。

目次

概要

もとは Caml という言語だったが[1][2]、クラス宣言やオブジェクトの生成、継承などのオブジェクト指向的要素が追加され Objective Caml という名前になった。もとの Caml は現在も caml-light という名前で配布されている[3]。 なお、英語では Caml は camel (ラクダ) と同様に発音されている。

関数型言語の一種だが、Haskellなどの純粋関数型言語と比べると、容易に破壊的な操作や命令的な記述をすることができること、デフォルトが遅延評価でないことなどの理由により、非純粋関数型言語である。

関数型言語であるので、破壊的操作なしに宣言的にプログラムを書くことができる。 OCaml は静的な型付け言語であるが、型推論の機能を持つため、たいていの場合は明示的に型を定義しなくても処理系がうまく推論してくれる。

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

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

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

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

コード例

以下のコード例の全てに特徴的なのは、静的型付け言語であるにも関わらず、型の宣言が一切ないことである。OCamlの型推論がこれを可能にしている。

Hello World

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

 print_endline "Hello world!";;

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

$ ocamlc hello.ml -o hello

以下が実行結果である。

$ ./hello
Hello world!
$

クイックソート

クイックソートのコード例を示す。OCamlは多くの関数型言語と同様、再帰処理に秀でる。また、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を渡せばよい。OCamlは関数型言語であるため、プログラミングの理論的背景であるこれらの事柄を、そのまま記述することができる。

MinCaml

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

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

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

  • FFTW離散フーリエ変換を高速に行う高速フーリエ変換ライブラリC言語のコードを出力するgenfft という OCaml プログラムが使われている。
  • Unison – 二つのディレクトリのファイルを比較し同期をとるプログラム。
  • Mldonkey – EDonkey network 用の P2P クライアント。
  • GeneWeb – マルチプラットフォームの、フリーの家系図ソフトウェア。
  • Haxe – オープンソースのアドビ Flash コンパイラ。
  • Frama-c – C言語のプログラムを解析するためのフレームワーク。

参考文献

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

脚注

  1. ^ A History of Caml”. The Caml Language. 2009年12月19日閲覧。
  2. ^ OCaml-Nagoya (2007). 『入門OCaml』. 毎日コミュニケーションズ, p.15. ISBN 9784839923112. 
  3. ^ Latest Caml Light release”. The Caml Language. 2009年12月19日閲覧。
  4. ^ OCaml-Nagoya (2007). 『入門OCaml』. 毎日コミュニケーションズ, p.17. ISBN 9784839923112. 

外部リンク





固有名詞の分類


英和和英テキスト翻訳

英語⇒日本語日本語⇒英語

辞書ショートカット

すべての辞書の索引

「Objective CAML」の関連用語

Objective CAMLのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Objective CAMLのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのOCaml (改訂履歴)、Objective Caml (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2026 GRAS Group, Inc.RSS