Commits

camlspotter  committed 9e6b4ec

update

  • Participants
  • Parent commits 05a5adf

Comments (0)

Files changed (1)

File ocaml-ext-tools.rst

 もしかしたらあなたの問題を解決するツールがあるかもしれないから。
 ライブラリとツールの中間のようなコード生成系も取り上げた。
 基本的に触ったことのある物しか紹介しない。
+リンクは貼るの面倒だからググれ
 
 ★は重要度。五点満点。
 
 
 私は5日程使った記憶がある
 
+CamlIDL ★★
+================
+
+OCaml と C の間を取り持つ FFI(Foreign Function Interface) の自動生成ツール
+
+OCaml は C や他言語との橋渡しに C を使う。C関数を OCaml の関数として使うことができるのだが、
+そのままでは普通は使用できない。C関数を OCamlの GC やメモリモデルに沿った形で呼び出す
+ラッパ関数から間接的に呼び出す必要がある。このラッパ関数はスタブとよく呼ばれる。
+そのスタブの型安全性は全く保証されていない。正しい記述方法は
+http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual033.html
+に記載されているとおりだが、ちょっと間違うとすぐにプログラムがクラッシュする。
+それも GC に関連する問題だと大変だ、間違った関数を呼んでもそこではクラッシュしない…
+しばらくたって GC が走るとクラッシュする。スタブのデバッグは大変だ。
+
+CamlIDL は MIDL という C のヘッダにアノテーションを記述することで
+C関数を OCaml から呼び出すためのスタブを自動生成するツール。
+一応 OCaml のモジュールを COM コンポネントにする機能も付いているが、まあこっちは知らない。
+
+アノテーションが正確である限り CamlIDL は正しいスタブを作ってくれる。
+むろん、アノテーションを間違うとどうしようもないが、それでも手でスタブを書くよりは
+手間は省けるし安全かもしれない。簡単な型の C関数ならかなり楽にスタブを作ってくれる。
+
+が、そのアノテーションが抑えられないような物を書こうとすると工夫が必要になる。
+例えば polymorphic variant を使ったサブタイプを入れたいなど…
+そういう場合は IDL ファイルに前処理をしたり
+生成された OCaml コードに後処理をしたり、まあいろいろとやれないこともない。
+が、まず CamlIDL のチュートリアルから。
+
+まあスタブが10個くらいですむなら私は手で書く。ちゃんと OCaml ランタイムのことがわかっていれば
+手書きでもそう間違いはおこらないはずだ。
+
 OCamlSpotter ★★★★
 ================================
 
+名前の定義を探しだすコード解析ツール
+
+人が書いた OCaml コードで、この変数の定義はどこか?とか、この型の定義はどこに?
+とか検索するのは結構骨が折れる。 grep や tags では polymorphism や let shadowning がある
+OCaml ではいくつも候補が出てきてしまい、そういう際にはどれが正しい定義かよくわからなくなってくる。
+
+しかし人間にはわからなくてもコンパイラは全てを知っている。OCamlSpotter はコンパイラがソースを
+コンパイルした際の結果である cmt ファイルを解析し、ソースコードに現れる名前が、どこで定義されたものかを
+解析表示することで、コードを読む際の手間を大幅に短縮するツール。Emacs や Vim からも呼び出すことが
+でき、簡単なキーでカーソルにある名前の定義へとジャンプすることができる。
+
+OCamlSpotter を利用するにはソースコードを -bin-annot というオプションでコンパイルし、 cmt ファイル
+を生成する必要がある。そしてもちろんこの cmt ファイルとソースファイルは消さずに残して置かなければならない。
+ライブラリがインストールされる場合には cmt ファイルも共にインストールする必要がある。
+
+これは私が書いたツールなのだが、私の生計は OCaml プログラミングではなくなった今、あまり以前のように
+ガンガンとメンテする暇がないのが残念。とりあえず最新の OCaml コンパイラでとりあえず動くものは公開しているが
+バグもある(なかなか直らない)。バグは bitbucket の issues 
+( http://bitbucket.org/camlspotter/ocamlspot )に報告してくれれば直す気も出るし、
+パッチはもっと歓迎。
+
 TypeRex ★★★★
 ================================
 
+Emacs 用の OCaml IDE。
+
+OCamlSpotter と同じような機能にさらに独自ハイライトや
+インデント、リファクタリング(変数名を変更すると同じ変数(同じ名前の変数ではなく、同じ定義を指す変数だけ!を変更してくれる)
+も搭載されている。
+
+実はリファクタリングは OCamlSpotter にもあるし、インデントは OCaml-indent のほうが先だし、
+ちょっとパクられてるなーという被害妄想が私にはある。こういう時 OCaml専業+フレンチコネクションは強い。
+
+問題はプロセスをガンガン作るので Cygwin と相性が悪いってことか。
+Mac OS X ともなにか問題があるようで、 TypeRex が動かなかったら OCamlSpotter も試してみてくれい。
+
+Oasis ★★★
+========================
+
+統一的ビルドインターフェースを提供
+
+OCaml のソフトウェアはビルドシステムが自由に選べる。 configure + Make, OCamlBuild, OMake など。
+問題はビルド方法がひとつひとつ違うことだ。ユーザーは一度一度 INSTALL.txt などを読まなければならない。
+Oasis はそんな問題を解決する: OCaml で書かれた setup.ml というファイルを使うのだ。
+``ocaml setup.ml -configure`` で設定、 ``ocaml setup.ml -build`` でビルド、 ``-install`` 
+でインストールすると言った具合。つまり Oasis による ``setup.ml`` があればビルドシステムが何であろうが
+ユーザは ocaml setup.ml からインストール作業ができる。
+
+Oasis では ``_oasis`` という設定ファイルに色々書くと自動的に ``oasis setup`` で setup.ml を
+作成してくれるのだが、その際、``_oasis`` から OCamlBuild のビルドファイルを自動的に作ってくれたり
+OCamlFind の META フィアルを作ってくれたりするようだ、が、よくわからない。
+Readme や INSTALL.txt を勝手に作ってくれたり、
+ソフトウェアライセンスとかも記述でき、コピーライトファイルを自動的に取ってきたり、
+いろいろ機能はあるみたいなんだけど…私には、ちょっとやりたいことが多すぎて手が回ってない感じのツールだな。
+
+私は OMake ユーザーであり、 OMake は Oasis で全くサポートされていないので恩恵は殆ど無い。
+まあ _oasis ファイルを書いて oasis setup すると OMake を呼んでくれる setup.ml を
+作成することはできる…でもそれだけであまり嬉しくはない。参考までに OMake で使うばあいの ``_oasis``:: 
+
+    OASISFormat: 0.2
+    Name:        spotlib
+    Version:     2.1.0
+    Synopsis:    Useful functions for OCaml programming used by @camlspotter
+    Authors:     Jun FURUSE
+    License:     LGPL-2.0 with OCaml linking exception
+    Plugins:      StdFiles (0.2)
+    BuildType:    Custom (0.2)
+    InstallType:    Custom (0.2)
+    XCustomBuild: yes no | omake --install; PREFIX=$prefix omake
+    XCustomInstall: PREFIX=$prefix omake install
+    XCustomUninstall: PREFIX=$prefix omake uninstall
+    BuildTools: omake
+
+OMake はサポートされていないので ``XCustomなんちゃら`` を使う。まあこれで setup.ml から omake が呼べるようになる。
+( http://d.hatena.ne.jp/camlspotter/20110603/1307080062 )
+Custom なのでビルドの自動設定はできないが… ``_oasis`` の Library エントリとか妙によくわからないので
+書けないなら書けないで…
+
+Oasis パッケージを管理する Oasis DB というモノも作られかけていたが…コケた。
+アップロードがあまりに不親切かつ面倒だったからだ。今はもう OPAM repo だね。
+
+OPAM ★★★★★
+========================
+
+パッケージマネージャとパッケージレポ
+
+Oasis はパッケージとそのビルドに焦点を当てたツールだったが、 OPAM はどちらかというとパッケージとその配布管理
+に重きをおいたパッケージマネージャ。 OPAM では Oasis は setup.ml を提供するツールとして普通に共存できる。
+
+OPAM は Oasis と違ってビルドスクリプトの方には手を出さない。そのかわり ``opam`` ファイルに
+ビルドするには、インストールするには、アンインストールには、どんなコマンドを発行するか、を記述する。
+コマンドはシェルで解釈されるので ``ocaml setup.ml`` だろうが configure + make だろうが
+``ocamlbuild`` だろうが ``omake`` だろうが何でもかまわない。
+
+さらに、パッケージが別パッケージのどのバージョンに依存しているかも ``opam`` ファイルに記述するのだが
+この際のアルゴリズムとして Debian のパッケージと同じアルゴリズムが使われている、まあ枯れていて強力
+ということなのだろう。
+
+この ``opam`` ファイルに加え、ソフトウェアの説明を記述した ``descr``、ソフトウェアの tarball
+をどこに置いたか、そしてそのチェックサムを記録した ``url`` この三点セットのファイルで一つのパッケージ
+情報になる。これを opam-repository のレポに置けば誰もがそこから三点セットをダウンロードして
+opam コマンドで OCaml ソフトウェアを簡単にインストールできるというのが売りだ。自分で OPAM パッケージ
+を作る場合はこの公式レポを fork して変更の pull request を送れば良い。平日なら日本の午前に出せば
+夕方には取り込まれる。
+
+(もちろん OPAM もソースを使ったソフトの配布システムなので環境が違うとインストールできないという事は
+普通にある…万能なソースベースのパッケージシステムなんかないのだ)
+
+GODI ★?
+================
+
+これまたパッケージシステム。 
+
+OCamlFind の人が書いた OCaml パッケージシステムのはしり。 
+私はほとんど使ってないし使っていたのも随分前のことで、いろいろとストレスを感じた記憶がある。
+パッケージにあるソフトを改造しにくかったような…今は改善されているのではないか…とも思うが、
+Oasis や OPAM との比較は私にはできません。誰か教えてください。
+
+Tuareg ★★★★★
+================
+
+Emacs の OCaml コードインデンタとハイライタ。
+
+OCaml コンパイラ付属の OCaml-mode でええやんという人もいるが Tuareg が好きという人もいる。
+どちらがいいのかは、正直よくわからない。特に私は toplevel でコード片を eval したりしない人なので…
+Jane Street が Tuareg を使っていて、特に Monad の bind 関係でインデントを整備していたので
+そのあたり、もしかしたら Tuareg のほうが使い勝手が良いこともあるかもしれない。
+
+繰り返しになるけれども、 Tuareg を使っていても caml-types.el や camldebug.el は普通に使えます。
+
 Type-conv, Sexplib, Bin-prot ★★★
 =====================================
 
 OCaml Batteries Included ★★★★
 ==============================
 
-CamlIDL ★★
-================
-
-OCaml と C の間を取り持つ FFI(Foreign Function Interface) の自動生成ツール
-
-CamlIDL は MIDL という C のヘッダにアノテーションを記述することで
-その C関数を OCaml から呼び出すためのスタブコードを自動生成するツール。
-一応 OCaml のモジュールを COM コンポネントにする機能も付いているが、まあこっちは知らない。
-
-CamlIDL は簡単な型の C関数ならかなり楽に OCaml への変換を作ってくれる。
-が、そのアノテーションが抑えられないような物を書こうとすると工夫が必要になる。
-例えば polymorphic variant を使ったサブタイプを入れたいなど…
-そういった激しく CamlIDL を使う例としては ( ゚∀゚)o彡°O'PyCaml があるが、
-激しすぎるのでこれから見ると多分嫌になるだろう。まず CamlIDL のチュートリアルから。
-
-Oasis ★★★★
-========================
-
-OPAM ★★★★★
-========================
-
-型でOCamlの関数を検索できるサービス、OCaml API Searchをリリース 
-OCaml API search
 
 cmigrep ★
 ================
 
-GODI ★
-================
-
 Menhir ★★★★★
 ==================
 
 Ulex ★★★★
 ==================
 
-Tuareg ★★★★★
-================
-
 utop ★★★★
 ================