OCamlは関数型言語の一つで、実用性の高さで人気があります。オブジェクト指向や強い静的型付けなどの特徴を持ち、実行速度がC言語並みに速いことも特徴の一つです。筆者の中ではデキるプログラマーが好んで使っているイメージがあります。Microsoftが開発した.NET対応言語のF#をはじめ、多くの言語にも大きな影響を与えました。今回は、OCamlについて紹介します。
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をインストールするため、若干インストールに時間がかかる場合があります。
なお、上記の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 <= 100 then begin
print_endline (fizzbuzz n);
loop(n + 1)
end else 0;;
loop 1
コマンドラインで『ocaml fizzbuzz.ml』を実行すると、以下のように表示されます。
プログラムを確認してみましょう。プログラムの※1の部分では、FizzBuzzの条件を定義します。letを使うと変数に式や値を束縛します。『let 変数名 引数 = 式』のように記述できます。
そして、※2の部分では引数nに応じたFizzBuzzの値を返すFizzBuzz関数を定義しています。※1で定義したFizzBuzzの条件を利用するので比較的見やすいのではないでしょうか。
最後の※3の部分で1から100までFizzBuzzの値を画面に出力します。なお、OCamlにはfor文も用意されていますが、ここでは敢えて再帰を利用して繰り返しFizzBuzz関数を呼び出してみました。
OCamlのまとめ
以上、OCamlについて簡単に紹介しました。OCamlはデータ型にうるさい言語なのですが、FizzBuzzのプログラムを見ても、何一つ型宣言している部分がないことに気づいたのでしょうか。ここからも型推論の威力を見ることができます。また、コードが非常に簡潔になるのもOCamlの特徴です。実行速度も申し分なく、実用的な製品が多く開発されています。OCamlは「とても人気がある」という言語ではありませんが、多くの言語に多大な影響を与えただけでなく、現在も使われています。今後も特定分野で使われいくことでしょう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。