OCaml






















































OCaml

OCaml
OCamlのロゴ

パラダイム
関数型言語、オブジェクト指向言語
登場時期
1996年 (1996)
開発者
INRIA
最新リリース
4.07.0/ 2018年7月10日(7か月前) (2018-07-10
型付け
強い静的型付け
主な処理系
OCaml
影響を受けた言語
CamlStandard ML
影響を与えた言語
F#ScalaHaXe
プラットフォーム
クロスプラットフォーム
ライセンス
LGPL 2.1
ウェブサイト
ocaml.org
テンプレートを表示



Computer n screen.svg


プログラミング言語
>>他のプログラミング言語


■カテゴリ / ■テンプレート



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




目次






  • 1 概要


  • 2 Caml


    • 2.1 MinCaml


    • 2.2 Moscow ML


    • 2.3 その他




  • 3 プログラム例


    • 3.1 Hello World


    • 3.2 クイックソート


    • 3.3 チャーチ数




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


  • 5 参考文献


  • 6 脚注


  • 7 関連項目


  • 8 外部リンク





概要


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


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


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


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



Caml


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



MinCaml


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


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



  • 速攻MinCamlコンパイラ概説 - MinCamlの配布・解説(SourceForge.net


Moscow ML


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



その他


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




  • FFTW – 離散フーリエ変換を高速に行う高速フーリエ変換のライブラリ。C言語のコードを出力するgenfft という OCaml プログラムが使われている。


  • Unison – 二つのディレクトリのファイルを比較し同期をとるプログラム。


  • MldonkeyEDonkey network 用の P2P クライアント。


  • GeneWeb – マルチプラットフォームの、フリーの家系図ソフトウェア。


  • Haxe – オープンソースのプログラミング言語およびコンパイラ実装。


  • Frama-c – C言語のプログラムを解析するためのフレームワーク。


  • Coq - INRIAで開発されている定理支援証明系言語。

  • Flow - JavaScriptの静的型チェッカー。Facebookにより開発されている。


  • Tezos - 自己進化型のスマート・コントラクト プラットフォーム。XTZ を仮想通貨とする。



参考文献



  • OCaml-Nagoya 『入門OCaml - プログラミング基礎と実践理解』 毎日コミュニケーションズ、東京、2007年5月。.mw-parser-output cite.citation{font-style:inherit}.mw-parser-output .citation q{quotes:"""""""'""'"}.mw-parser-output .citation .cs1-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/6/65/Lock-green.svg/9px-Lock-green.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output .citation .cs1-lock-limited a,.mw-parser-output .citation .cs1-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Lock-gray-alt-2.svg/9px-Lock-gray-alt-2.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output .citation .cs1-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Lock-red-alt-2.svg/9px-Lock-red-alt-2.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registration{color:#555}.mw-parser-output .cs1-subscription span,.mw-parser-output .cs1-registration span{border-bottom:1px dotted;cursor:help}.mw-parser-output .cs1-ws-icon a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Wikisource-logo.svg/12px-Wikisource-logo.svg.png")no-repeat;background-position:right .1em center}.mw-parser-output code.cs1-code{color:inherit;background:inherit;border:inherit;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;font-size:100%}.mw-parser-output .cs1-visible-error{font-size:100%}.mw-parser-output .cs1-maint{display:none;color:#33aa33;margin-left:0.3em}.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registration,.mw-parser-output .cs1-format{font-size:95%}.mw-parser-output .cs1-kern-left,.mw-parser-output .cs1-kern-wl-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right,.mw-parser-output .cs1-kern-wl-right{padding-right:0.2em}
    ISBN 978-4-8399-2311-2。

  • 五十嵐淳 『プログラミング in OCaml : 関数型プログラミングの基礎からGUI構築まで』 技術評論社、東京、2007年12月。
    ISBN 978-4-7741-3264-8。



脚注





  1. ^ https://caml.inria.fr/ocaml/name.en.html


  2. ^ 英: OCaml is the most popular variant of the Caml language.


  3. ^ OCaml-Nagoya (2007). 『入門OCaml』. 毎日コミュニケーションズ. pp. p.17. ISBN 9784839923112. 


  4. ^ Texvc - MediaWiki


  5. ^ 正確には名前だけでなく、新しい手法で再実装されたもので、OCaml より Caml Light のほうが古くからある。


  6. ^ https://mzp.hatenablog.com/entry/2013/05/08/214712




関連項目



  • HDCaml

  • F Sharp



外部リンク




  • OCaml (INRIA)による旧サイト


  • OCaml 新しい公式サイト


  • Objective Caml 入門


  • OCaml プログラミング入門


  • Akihito Nagata's Page

  • OCaml.JP


  • OCamlチュートリアル

  • ODT: OCaml Development Tools

  • PLEAC-Objective CAML




Popular posts from this blog

MongoDB - Not Authorized To Execute Command

How to fix TextFormField cause rebuild widget in Flutter

Npm cannot find a required file even through it is in the searched directory