Skip to content

OCamlをJavaScriptに変換しちゃうjs_of_ocamlをMacにインストール!

やあshi3zだ。
なんだか避暑地に来てみたんだけど、やっぱりコンピュータをいじっちゃうのだ。

どうも来る9月2日に、Proof Summit 2012という面白そうなイベントが開催されるらしく、しかもARCの坂口君も喋るらしいので、それに向けていろいろ勉強しとかなきゃ、と思ったわけだ。

この「Proof Summit 2012」というのは、定理証明支援系言語や自動証明器をテーマとした集まりで、去年も開催されたらしい。

定理証明支援系言語ってのは、僕も坂口君に聞いて初めて知ったんだけど、AgdaやCoqといった言語のことを言うらしい。

簡単に説明すると、今、主流になりつつあるソフトウェアのバグを無くす方法は、とにかくテストをしっかりやるということ。けど、テスト自体も人間が書くものだから当然、漏れもある。つまりかなりテストを頑張っても、バグがないことは誰も保証しない。

しかしプログラムといえど、広い意味では理屈の組み合わせのわけだから、これが「完全に正しい」と「数学的に証明」することができれば、ソフトウェアの世界は次の世代へと大きく前進するかもしれない。

それを実現するための言語が色々と研究されていると言うワケ。
特に坂口君は最近はCoqを推してるらしいんだけど、このCoqを作ったのはフランスのINRIAという研究所で、そのINRIAという研究所が作った有名な関数型言語がOCaml。OCamlはあまり日本では馴染みのある言語ではないかもしれないけど、最近の東大の情報学科では必修科目で教えるくらい優れた言語らしいし、けっこう、面白いソフトや重要なソフトが、意外にもOCamlで書かれていたりするのだ。で、CoqもOCamlをもとにしてるっていうか文法が結構似てるらしい。

そんなOCamlを僕も多少は齧ったことはあるんだけど、それは齧ってみてすぐに味を忘れるようなくらいにしか齧ってなかった。Proof Summitでの会話について行くためには、最低でもOCamlでなにか実用的なコードを書いてみないことには感覚が掴めない。

まあ実用的というのが何を意味するのかイマイチわからんけど、僕にとって目下のところ「実用的」というのはenchant.jsでゲームが書ける、ということだ。

長年の知己であるかみやんこと神谷栄治からも、「前田ブロックは関数型言語にアプローチが似てる」という指摘を貰ったりしたので、いまもう一度関数型言語に入門し直してみるともしかしたらenchant.jsや前田ブロックをもっといいものにするヒントが得られるかも知れない。

そのためには、とりあえずOCamlを使ってJavaScriptのコードを書きたい、と思ったんだけど、OCamlをJavaScriptに変換する方法はいくつかあって、混乱してしまった。こういうの、オープンソースの不人気フレームワークの大きな欠点だと思うんだけど、オープンソースとはいえ、誰かがメンテをやめちゃうと言語のバージョンが上がった時にもう対応できなくなっちゃうんだよねえ。なんとかなんないものか。

色々探した挙げ句、どうやら今一番新しくて良さそうなやり方はjs_of_ocamlを使う方法で、これは今年も更新されてるプロジェクトだからまあとりあえず今すぐ使える、という点は素晴らしい。

ところがどっこい、これのインストールでものすごく詰まってしまった。
こういうのも本当はなんとかなんないかなあと思ってるんだけど、ドキュメントが整備されてなくてインストール方法がよくわからんって凄く面倒だし、せっかく優れたソフトでもインストールすらされずに終わってしまうって勿体ないよね。

OSXにjs_of_ocamlをインストールするっていう話が日本語で書かれた情報はOh, you `re no (fun _ → more) の記事しか見つからなかったんだけど、これもちょっと内容が古くて僕のLionではこのままでは上手く行かなかった。

本当は実用的なコードを書くまでやってから記事にしようと思ったけど、あまりに大変だったので結論だけメモ程度に書いてみます。

まず、インストールするにはMac portsを使う。これしかない。

http://www.macports.org/でMac Portsをダウンロードしてインストール。まあ言語ちょっと弄ろうとしてる人は既にインストールしてるはず。

次に、実はいまのところほとんどのものはMacPortsにあるので、こんな感じのコマンドを叩く

$ sudo port install ocaml ocaml-findlib ocaml-pcre ocaml-ocamlnet ocaml-zip ocaml-cryptokit ocaml-sqlite3 ocaml-menhir ocaml-ssl ocaml-react ocaml-lwt

これでたいていのもんは入るはず。
それからhttp://ocsigen.org/js_of_ocaml/に行ってダウンロード。

それでまあいつものようにmake & sudo make installでエラーがでなければ終了。
エラーが出ると面倒なんだけどエラーみていちいち原因探しに行かないとなんない。

これもいつまで通用するかわからない。portのパッケージ名がたまに変わったりするので。

それから、まあとりあえず面倒だったのでさっきのブログを参考にもっと簡単なところからテストしてみる。

以下のようなコードをtest.mlとして保存

open Js
let square (x) = x*x
let _ = Unsafe.eval_string ("alert('" ^ (string_of_int ( square 5 )) ^ "');")

それからおもむろにコンパイルして変換。これは先のブログと一緒

$ ocamlfind ocamlc -syntax camlp4o -package lwt,js_of_ocaml.syntax -g -c test.ml
$ ocamlfind ocamlc -package lwt,js_of_ocaml -linkpkg -o test.byte test.cmo
$  js_of_ocaml test.byte

すると、test.jsというファイルができあがる。
js_of_ocamlはバイトコードをJavaScriptに変換するタイプみたいね

これだけだと動作確認できないのでindex.htmlを

<html>
  <head>
<script type="text/javascript" src="test.js"></script>
</head>
<body>
</body>
</html>

こんなシンプルな感じにして実行してみる。
うん、実行できた。

これ、JavaScriptをOCamlに文字列として書いて、それをそのまま表示(eval)しただけという、やる気がないにもほどがあるサンプルだけどまずは動いて良かった。

これでenchant.jsをOCamlから使う準備は整った。
さて、と。

このエントリーをはてなブックマークに追加
はてなブックマーク - OCamlをJavaScriptに変換しちゃうjs_of_ocamlをMacにインストール!
Post to Google Buzz
Share on GREE

Related posts:

  1. enchant.jsで自動的に画面が拡大されるのを抑制するには?
  2. JavaScriptが27%も高速化できる!?新言語JSXが登場!
  3. 10分で作るnode.jsで動くリアルタイムwebチャット
  4. 夏休みの宿題はこれで決まり!絵心ゼロでもブラウザだけで簡単にアートが作れる!CTXFR.COM
  5. socket.enchant.jsに重大なバグ発見!と、もっとわかりやすいサンプル

Facebook comments:

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*