最もメタになる「初心者用言語」 O’Caml

O'Caml、いいんじゃないかな。Objective Camlオープンソース関数型言語
詳しい実装を知っているわけじゃないけど、課題でO'Camlを使っているのでプログラミング初心者へ向けて紹介しておくよ!
O'Camlにはプログラミング・情報科学であらわれる概念が盛りだくさんだ。O'Camlの面白いところは

関数型言語

すべての式が値を持つ。関数・演算が値を返すのは当たり前として、if文だって値を持つ。unitという変な値を返す式もあるけど、そんなのも含めてすべての式が価を持つんだ。Cなどの手続き型言語Prologなどの論理型言語だけをやっていた人から見るとほんとに?とおもうかもしれないけど、ほんとにすべての式が値を持つんだよ。
あと、関数型言語を使うと、関数を受け取って処理する関数(高階関数)などの概念が身に付くよ。関数型だからループをまわそうと思ったら再帰で書きたくなってくるよ。

インタプリタコンパイラ

ちょっとだけコードを書きたいときに便利なインタプリタ(対話環境ocamlコマンド)。O'Camlはインタプリタがありながら、LL系では行わない「コンパイル」という操作も行うことが出来るんだ(ocamlc, ocamloptコマンド)。たいていの場合インタプリタで実行するよりもゆっくり時間をかけて最適化した実行ファイルを実行したほうが実行速度が早いしね。

ループ、配列もあるよ

関数型のくせにループもあるよ。配列もある。参照もある。普通のLL言語に似た仕組みは備わってる。ちなみにこれらが返す型はunitというもの。すげえ破壊的。でもこういうのを使わなければ参照透明になるから安心して。要は使い方次第ってことで。

浮動小数点と整数の区別

整数の足し算は"+"記号で表すよ。浮動小数点での足し算は"+."で表すよ。そもそも整数と不動小数点数ではレジスタやメモリに格納される方法が違うんだから当たり前だよね。O'Camlは型に厳格なんだ。

型推論

そう、O'Camlは型チェックが面白い。「型推論」をするんだ。
例えば、((if A then B else C) > 0)という式の型を推論してみよう。形をみればわかるとおり大小比較をしているので式全体ではbool値を返す。if文の値は0(Int)と比較されているので、if文の型はInt。if文がIntを返すためには次の3つが正しければいい。すなわち:「Aがbool型」、「BがInt型」、「CがInt型」。(考えてみてよ、よくある「if 3 then ...」っていう表現、おかしいと思わない?)
こんな風に式の型をチェックする際にその式の要素を推論していくんだ。こんなのが型推論。むずかしそうだけど、とりあえず型をしっかり見るよ、ということを覚えておこう。

match文

現在課題で参考にしている東北大学の住井先生の書いたMinCamlのコードにmatch文がいっぱいあるからかわからないけど。match文便利。Variant型やRecord型とっても便利。

構文解析器, 字句解析器がある。

コンパイラを作るのに便利なocamlyacc, ocamllexというツールがあるよ。(お世話になってます。)

オブジェクト

オブジェクト指向もあるらしいよ。使ったこと無いけど > <

慣れないところ。。。

O'Camlは変な文法を持つよ。対話環境で1つの入力の終了を表すのは";;"だし、変数定義がlet hoge = fuga in ...という式だし、ときどき親切なエラーを出力してくれない型チェックにイラっとくるときもあるかも。。。



O'Camlは関数型言語(ループも配列もあるけどね!)、オブジェクトも持てる、多相型、抽象型(Javaのprivateみたいなの?)、インタプリタ(対話型環境)もコンパイラも用意されている盛りだくさんの言語だ。O'CamlはMLの一種。Meta Language、メタ言語WikipediaによるとMLは最初は推論規則を記述する言語として開発されたらしい。
初心者がもっともMetaになるにはこれがいいんじゃないかな。って、あれ?


...いや、メタとタメをかけたフランス的なジョークは置いておいて、ホントにO'Camlは上に書いたようにプログラミング・情報科学にまつわる様々な概念を教えてくれる良い言語だと思うよ!



詳しくはO'Camlのウェブサイトを参照してみよう。処理系のダウンロードもここからできるよ。
http://caml.inria.fr/ocaml/index.en.html

もっともタメになる「初心者用言語」まとめはこちら。
http://generation1986.g.hatena.ne.jp/ukstudio/20080204/1202113687


参考
http://d.hatena.ne.jp/amachang/20080204/1202096633
http://d.hatena.ne.jp/hayamiz/20080204/1202108447
http://d.hatena.ne.jp/tasukuchan/20080204/1202112965