「OCaml」の版間の差分

提供: miniwiki
移動先:案内検索
(1版 をインポートしました)
(内容を「{{テンプレート:20180815sk}}」で置換)
(タグ: Replaced)
 
1行目: 1行目:
{{Infobox プログラミング言語
+
{{テンプレート:20180815sk}}
|logo = OCaml Logo.svg
 
|logo_size = 250px
 
|名前 = OCaml
 
|パラダイム = [[関数型言語]]、[[オブジェクト指向言語]]
 
|設計者 =
 
|開発者 = [[フランス国立情報学自動制御研究所|INRIA]]
 
|released = {{Start date|1996}}
 
|latest_release_version = 4.05.0
 
|latest_release_date = {{Release date and age|2017|07|13}}
 
|型付け = 強い[[静的型付け]]
 
|処理系 = {{lang|en|OCaml}}
 
|影響を受けた言語 = {{lang|en|[[Caml]]}}、{{lang|en|[[Standard ML]]}}
 
|影響を与えた言語 = {{lang|en|[[F Sharp|F#]]}}、{{lang|en|[[Scala]]}}、{{lang|en|[[HaXe]]}}
 
|operating_system = [[クロスプラットフォーム]]
 
|license = [[GNU Lesser General Public License|LGPL 2.1]]
 
|website = {{URL|https://ocaml.org/}}
 
}}
 
 
 
{{プログラミング言語}}
 
'''OCaml'''({{IPAc-en|oʊ|ˈ|k|æ|m|əl}} {{respell|oh|KAM|əl}}、オーキャムル、オーキャメル)は、フランスの {{lang|fr|[[INRIA]]}} が開発した[[ML (プログラミング言語)|プログラミング言語ML]]の方言とその実装である。MLの各要素に加え、オブジェクト指向的要素の追加が特長である。かつては {{lang|en|Objective Caml}} という名前で、その略として {{lang|en|OCaml}} と広く呼ばれていたが、正式に {{lang|en|OCaml}} に改名された<ref>https://caml.inria.fr/ocaml/name.en.html</ref>。
 
 
 
== 概要 ==
 
もとはCamlという名前の、MLの方言の処理系実装、および言語であった。この名前はcategorical abstract machine languageの頭字語である。クラスや[[継承 (プログラミング)|継承]]など[[クラスベース]][[オブジェクト指向]]の言語機能が追加され Objective Camlという名前になり、その後、略称だったOCamlを正式な名前とした。ウェブサイトの概要説明では「OCamlはCaml派生の言語の中で最も知られたものである」<ref>{{lang-en-short|OCaml is the most popular variant of the Caml language.}}</ref>としている。もとの処理系も配布され続けており、Caml Lightという名前になっている。英語ではCamlはcamel(ラクダ)と同様に発音されており、アイコン等にもラクダを使っている。
 
 
 
MLの特徴の他に、関数型とオブジェクト指向の両方を併せもつことが特徴的である。ただしそのため、オブジェクト指向を利用した破壊的操作を伴うプログラムがかなり容易に書けてしまう。また、多相バリアント型という特殊なバリアント型により(通常のバリアント型については[[代数的データ型]]を参照のこと)、サブセットとスーパーセットの関係になっているバリアント型などを記述できるなどといった特徴もある。
 
 
 
処理系としての特徴は、関数型言語としてはかなり高速に動作することが挙げられ、[[GNUコンパイラコレクション|gcc]]でコンパイルされた[[C言語]]と互角かやや遅い程度と言われる<ref>{{cite book | author=OCaml-Nagoya | year=2007 | title=『入門OCaml』 | publisher=毎日コミュニケーションズ | isbn=9784839923112 | pages=p.17}}</ref>。
 
 
 
関数型言語としては比較的アプリケーションの数が多く、例えば[[MediaWiki]]において[[TeX]]の記述から[[HyperText Markup Language|HTML]]、[[MathML]]および画像の数式を生成するプログラムもOCamlで記述されている<ref>[https://www.mediawiki.org/wiki/Texvc Texvc - MediaWiki]</ref>。
 
 
 
=={{lang|en|Caml}}==
 
{{lang|en|Caml}} は、{{lang|en|OCaml}} の前身であるMLの方言とその実装である。現在も {{lang|en|Caml Light}} という名前で<ref>正確には名前だけでなく、新しい手法で再実装されたもので、{{lang|en|OCaml}} より {{lang|en|Caml Light}} のほうが古くからある。</ref>配布され続けている。
 
 
 
===MinCaml===
 
MinCamlは、[[ペンシルベニア大学]](当時)の[[住井英二郎]]がOCamlで実装した、Caml似のMLの小型版である。同作者により、[[コンパイラ]]が OCaml 自身で書かれている。MinCaml は、[[2004年]]度の[[情報処理推進機構|未踏ソフトウェア創造事業]]に採択された。
 
 
 
MinCaml コンパイラは教育目的での利用を主眼としている。わずか2000行前後のコードで書かれており、実装されている機能はMLのサブセットである。バックエンドは[[SPARC]]と[[x86]]に対応しており、ある程度の学習をすれば比較的容易に改造を行うことができる(実際、有志によって[[PowerPC]]用に出力できるバージョンも提供されている。バックエンドを[[Low Level Virtual Machine|LLVM]]に置き換えた例も報告されている<ref>https://mzp.hatenablog.com/entry/2013/05/08/214712</ref>。)。実際に[[東京大学]]理学部情報科学科などで教育目的に利用され、国内における OCaml および関数型言語の普及と理解に一定の役割を果たしている{{要出典|date=2016年3月|}}。
 
 
 
*[http://min-caml.sourceforge.net/ 速攻MinCamlコンパイラ概説] - MinCamlの配布・解説(<code>SourceForge.net</code>)
 
 
 
===Moscow ML===
 
CamlやOCamlのような方言ではなく、SML([[Standard ML]])の処理系の実装にCaml Light利用している。完全なSMLを実装する。
 
 
 
===その他===
 
{{lang|en|OchaCaml}} など、研究用の改造のベースとして、規模の大きくなった {{lang|en|OCaml}} ではなく{{lang|en|Caml}}({{lang|en|Caml Light}})を利用する例がみられる。
 
 
 
==プログラム例==
 
以下の例は、プログラム自体としてはMLと比べ特別なものでもないし、オブジェクト指向を活用したものでもないが、{{lang|en|OCaml}}を含む {{lang|en|Caml}} では旧来のMLや {{lang|en|[[Standard ML]]}} からの記法や演算子や名前の変更が多く、簡単なプログラムでもそのままではエラーになるものが多いので、ここでは {{lang|en|OCaml}} のコードを示す。
 
 
 
特徴として、型推論の活用により、多くの場合に型の宣言が必要なく、一部の静的型付き言語にありがちな煩雑さがないことが挙げられる。
 
 
 
==={{lang|en|Hello World}}===
 
{{lang|en|[[Hello world]]}} の例を示す。以下のプログラム <code>hello.ml</code> は、
 
<source lang="ocaml">
 
print_endline "Hello world!";;
 
</source>
 
 
 
以下のようにして[[バイトコード]]に[[コンパイル]]される。
 
<source lang="sh">
 
$ ocamlc hello.ml -o hello
 
</source>
 
 
 
以下が実行結果である。
 
<source lang="sh">
 
$ ./hello
 
Hello world!
 
$
 
</source>
 
 
 
===クイックソート===
 
[[クイックソート]]のコード例を示す。MLは多くの関数型言語と同様、[[再帰]]処理に秀でる。また、{{lang|en|[[Haskell]]}} などにも見られるパターンマッチの機能がここでも使われている。
 
 
 
<source lang="ocaml">
 
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
 
</source>
 
 
 
===チャーチ数===
 
以下は、[[ラムダ計算]]の教科書などに見られる、[[自然数]]のチャーチ符号化のコード例である。
 
 
 
<source lang="ocaml">
 
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)
 
</source>
 
 
 
チャーチ数nは、[[高階関数]]として表され、関数fと値xを受け取りxにn回fを適用する関数として定義されている。チャーチ数nを自然数nに変換するには、チャーチ数(実体は関数)に、[[インクリメント]]する関数と初期値0を渡せばよい。MLは関数型言語であるため、数学的なプログラミングの理論そのままに、記述することができる。
 
 
 
=={{lang|en|OCaml}} で書かれたソフトウェア ==
 
*[[FFTW]] – [[離散フーリエ変換]]を高速に行う[[高速フーリエ変換]]の[[ライブラリ]]。[[C言語]]のコードを出力する<code>genfft</code> という OCaml プログラムが使われている。
 
*{{lang|en|[[Unison]]}} – 二つのディレクトリのファイルを比較し同期をとるプログラム。
 
*{{lang|en|[[Mldonkey]]}} – {{lang|en|[[EDonkey network]]}} 用の {{lang|en|P2P}} クライアント。
 
*{{lang|en|[[GeneWeb]]}} – マルチプラットフォームの、フリーの家系図ソフトウェア。
 
*{{lang|en|[[Haxe]]}} – [[オープンソース]]のプログラミング言語およびコンパイラ実装。
 
*{{lang|en|[[Frama-c]]}} – [[C言語]]のプログラムを解析するためのフレームワーク。
 
*{{lang|en|[[Coq]]}} - [[INRIA]]で開発されている定理支援証明系言語。
 
*Flow - [[JavaScript]]の静的型チェッカー。[[Facebook]]により開発されている。
 
 
 
== 参考文献 ==
 
*{{Cite book|和書
 
|author    = OCaml-Nagoya
 
|year      = 2007
 
|month      = 5
 
|title      = 入門{{lang|en|OCaml}} - プログラミング基礎と実践理解
 
|publisher  = 毎日コミュニケーションズ
 
|location  = 東京
 
|isbn      = 978-4-8399-2311-2
 
}}
 
*{{Cite book|和書
 
|author    = 五十嵐淳
 
|year      = 2007
 
|month      = 12
 
|title      = プログラミング {{lang|en|in OCaml}} : 関数型プログラミングの基礎からGUI構築まで
 
|publisher  = 技術評論社
 
|location  = 東京
 
|isbn      = 978-4-7741-3264-8
 
}}
 
 
 
==脚注==
 
{{reflist}}
 
 
 
==関連項目==
 
*{{lang|en|[[HDCaml]]}}
 
 
 
== 外部リンク ==
 
*[https://caml.inria.fr/ocaml/ {{lang|en|OCaml}}] ({{lang|fr|INRIA}})による旧サイト
 
*[https://ocaml.org/{{lang|en|OCaml}}] 新しい公式サイト
 
*[http://www.fos.kuis.kyoto-u.ac.jp/~t-sekiym/classes/isle4/mltext/ocaml.html {{lang|en|Objective Caml}} 入門]
 
*[http://www.i.kyushu-u.ac.jp/~bannai/ocaml-intro/intro.html {{lang|en|OCaml}} プログラミング入門]
 
*[http://web.yl.is.s.u-tokyo.ac.jp/~ganat/ocaml/ocaml.html {{lang|ja-Latn|Akihito Nagata}}{{lang|en|'s Page}}]
 
*[http://ocaml.jp/ <code>OCaml.JP</code>]
 
<!-- 上のサイトからたどれるのでとりあえず消しておきます *[http://wiki.ocaml.jp/] -->
 
*[http://www.ocaml-tutorial.org/ja {{lang|en|OCaml}}チュートリアル]
 
*[http://ocamldt.free.fr/ {{lang|en|ODT: OCaml Development Tools}}]
 
*[http://pleac.sourceforge.net/pleac_ocaml/index.html {{lang|en|PLEAC-Objective CAML}}]
 
 
 
[[Category:関数型言語]]
 
[[Category:オブジェクト指向言語]]
 

2018/12/28/ (金) 10:18時点における最新版



楽天市場検索: