OCamlは関数型言語の一つで、実用性の高さで人気があります。オブジェクト指向や強い静的型付けなどの特徴を持ち、実行速度がC言語並みに速いことも特徴の一つです。筆者の中ではデキるプログラマーが好んで使っているイメージがあります。Microsoftが開発した.NET対応言語のF#をはじめ、多くの言語にも大きな影響を与えました。今回は、OCamlについて紹介します。

OCamlのWebサイト

○OCamlについて

OCamlは、もともとプログラミング言語ML言語の方言の一つです。もともと、「Objective Caml」という名前でしたが、OCamlに改名されました。つまり、OCamlのOはオブジェクト指向のOなのです。1996年にフランスのINRIA(フランス国立研究所)で開発されました。

残念ながら原稿執筆時点では、TIOBE Indexなどの人気プログラミング言語ベスト50にはランクインしていません。しかし50位以下の『次の50言語』には含まれています。

なお、関数型プログラミング言語とは複数の式を組み合わせてプログラムを作るパラダイムです。最近では、ScalaやF#が頑張っていることもあり、関数型のプログラミング言語もそれなりに使われていますが、C言語やJavaなど『手続き型』のプログラミング言語の方が多数派です。ただし、関数型言語で役立つ機能や考え方は、JavaScriptやRustなど新しいプログラムに積極的に取り込まれています。

OCamlの特徴は、強力な型システムであり『型推論』という便利な機能を持っています。この型推論の機能は、明示的なデータ型の宣言を省略して書くことができるというものです。Go言語やRustなど比較的新しい静的型付け言語には当然のように搭載されるようになりました。

どんなプロダクトで使われているのでしょうか。プログラミング言語のHaxeやRust(初期バージョン)、MediaWikiの数式画像を生成するプログラムや、Facebookが開発したJavaScript構文チェッカーのFlowなど、プログラミング言語の関連ツールでOCamlが使われています。

○OCamlのインストール

Windows用のOCamlは、こちらのWebサイトで配布されています。インストーラーの形式です。インストールするには、EXE形式のファイルを右クリックし「管理者として実行」をクリックします。すると、インストーラーが起動するので、数回[Next]を押せばインストールが完了します。OCamlを動かすためにCygwinをインストールするため、若干インストールに時間がかかる場合があります。

OCamlをWindowsにインストールしているところ

なお、上記のWindows用のインストーラーを利用してインストールするのも良いのですが、WSL(Windows Subsystem for Linux)もオススメです。こちらを参考に、Ubuntu(Linux)をインストールし、その上でコマンド『sudo apt install ocaml』を実行すると、素直にOCamlをインストールできます。

そして、macOSでは、Homebrewを利用してインストールできます。コマンドラインで『brew install ocaml』のコマンドを実行するとインストールされます。

○簡単なプログラムを作ってみよう

それでは、OCamlを使って簡単なプログラムを作ってみましょう。以下は、画面に「Hello, OCaml.」とだけ出力するプログラムです。

(* 挨拶を表示 *)

print_endline "Hello, OCaml."

プログラムを実行するには、上記のプログラムを「hello.ml」という名前で保存します。そして、コマンドラインで『ocaml hello.ml』とタイプします。すると、以下のように表示されます。

挨拶を出力するだけのプログラム

OCamlでは、コメントは『(* ... *)』のように書きます。そして、print_endline関数で文字列を画面に表示します。これだけ見ると、他のプログラミング言語とそれほど違いがない気がしますね。

○FizzBuzz問題のプログラム

次にOCamlを使ってFizzBuzz問題を解いてみましょう。FizzBuzz問題とは、以下のような問題です。この問題は、条件分岐や繰り返しなどを使うことが必須なので、プログラミング言語の雰囲気を見るのに向いています。

> 1から100までの数を出力するプログラムを書いてください。ただし、3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示してください。3と5の倍数の時は「FizzBuzz」と表示してください。

以下のプログラムを「fizzbuzz.ml」という名前で保存します。

(* FizzBuzzの条件を定義 --- ※1 *)

let is_fizz n = (n mod 3) = 0

let is_buzz n = (n mod 5) = 0

let is_fizzbuzz n = is_fizz(n) && is_buzz(n)

(* FizzBuzzを出力する関数 --- ※2 *)

let fizzbuzz n =

if is_fizzbuzz n then "FizzBuzz"

else if is_fizz n then "Fizz"

else if is_buzz n then "Buzz"

else string_of_int n;;

(* 1から100まで出力 --- ※3 *)

let rec loop n =

if n