Today アクセスカウンター Yesterday アクセスカウンター

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。

LablGTK は素晴らしい

Common Lisp で Gtk を上手く使えなかったので,OCaml を使って見ようとちょっと思いつく.

別に Ruby とか Python みたいな P 言語でも良いのですが,個人的な信念により,私はネイティブコンパイラとインタラクティブインタプリタの両方を備えていない言語は,どうも片手落ちという気がして使う気になれないので (私の主用途では).そうなると,事実上,現状まともに使える言語は ML か Lisp に限定されてしまうという罠.

# じゃぁ,なんで C なんて使ってるの ? 惰性.あと Gtk Programming に Haskell を使うってのは,いろいろ微妙過ぎる気がする.

検索してみたところ,lethevert さんの素晴らしいチュートリアルが一発でヒットし,これはいけそうだ,という確信を得ました.

現在では,さらに簡単になっていて (ネイティブコンパイルをしないならば),以下のように一瞬でインストールできます.

(1) 本家から,OCaml のインストーラ ocaml-3.09.3-win-mgw.exe を拾ってくる.

LablGTK のサイト から,lablgtk-2.6.0-win32.zip と gtk-2.6.8-dlls-win32.zip を拾ってくる.

(2) OCaml をインストールする.標準では C:\Program Files\Objective Caml にインストールされるので,上の 2 つの zip ファイルを解凍して,中身 (bln, lib, etc などを,ディレクトリ構成を維持したまま全部マージする) をそこに移動する.

(3) スタブファイルをコンパイルする.

C:\Program Files\Objective Caml\lib\lablgtk2 に移動.

# 私は cygwin と MinGW 入ってるので,cygwin 上で移動した.

$ ocaml build.ml

とタイプするだけ.これでインストールは終了.

試しに Objective Caml/examples/lablgtk2 に移動して,

$ lablgtk2.bat testgtk.ml

とか打って見ると,ちゃんとウィンドウが開くことが確認できました.

ただ,ネイティブコンパイルして実行ファイルを作るのは,lethevert さんが試した時

>> lablgtk-2.4.0-ocamlwin-3.08.zip
>> Supports only bytecode linking (you need to compile from source for custom and native code.)

とは異なり,現在の lablgtk2 のバイナリは対応しているものの,上記した dlls の zip ファイルの中にはエクスポートライブラリ (*.lib) が入ってないので,別途持ってきてパスを指定してコンパイルする必要がある模様.

>> Supports both bytecode and native code, but you need the GTK+ export libs (not included with the above dlls) for native linking.

んな殺生いわんと,入れといてくれや〜 たいした容量じゃにゃいだろうに.そもそもどっからもってくるねん !!

LablGtk2-install.txt だけみると,まるで同梱されているような言い回しがされてるけど.

5) For custom linking or native code, you need to use the export libraries in the above DLL package. There is not default place to put them, so you should specify that at link time:
ocamlopt -ccopt "/link /libpath:/home/garrigue/gtk-2.6.8/lib"
-I +lablgtk2 lablgtk.cmxa gtkInit.cmx testgtk.ml -o testgtk.exe
or, on Mingw
ocamlopt -ccopt "-L/home/garrigue/gtk-2.6.8/lib" -I +lablgtk2 \
lablgtk.cmxa gtkInit.cmx testgtk.ml -o testgtk.exe
Again, if this fails you must make sure that your ocamlopt really works, and that all paths are correctly specified.

まぁ,今後の研究課題ということで.

# Gauche の時に作った win32 の Gtk コンパイル一式パッケージは,2.10.x とかだから流用できんしのう.面倒.

GLADE for Windows の Gtk+/Win32 Development Environment (runtime, devel, docs, glade, etc.) Installer 2.6.8-rc1 (.exe, 9.01M)

が流用できそうな気もする.これを適当にインストールして,lib/*.lib だけを取り出せば良さそう.だけど微妙なので,やっぱりソースからコンパイルした方が良いのかもしれない.




まぁ,別にいいや (現代の若者).バイトコードでも,P 言語よりは速いよ (たぶん).移植性が高まるかもしれないし (後付け).少し使い込んで,気に入ったら,それからネイティブコンパイルする方法を探しても全然遅く無いし.

それにしても,ML は素晴らしい.とりあえず hello, world.


open GMain

let main () =
let window = GWindow.window ~border_width: 15 () in
let button = GButton.button ~label:"hello, world!" ~packing: window#add () in
window#connect#destroy ~callback:Main.quit;
button#connect#clicked ~callback:window#destroy;
window#show ();
Main.main ()

let _ = Printexc.print main ()


いや,ML の M の字も知らない子なんで,文法とかはよくわからんのだけど (サンプルを書き換えて短くしただけ.というか,本家よりもサンプルコードが豊富なような.examples 以下にいっぱいあります).

とりあえず,ローカル変数が使いたかったら, let 変数 = 式 in と書けば良いということはわかった (笑) 再帰的定義がしたかったら,let rec 変数 = 式 わかりやすいのう.

OCaml プログラミング入門




昔書いた Gtk のプログラムを OCaml に書きなおすのは面倒なので,C -> ML への逆コンパイラとかあれば良いのに,と思った (いろいろ間違ってる).

あと ML は,現在メジャーな言語の中で最もマイナー (名前だけ非常に有名) という微妙な位置付けな気がするので,せっかく作っても反応が薄いであろうことがアリアリと予想できます.

スルーされぢから

# いや,あきらかに Prolog の方がマイナーだな.というか,Prolog はもう死んだ言語.少なくとも純粋なのは.

そもそも,ML で拡張可能なエディタとかって作れるのだろうか ? OCaml に文字列からの eval ってあるの ? 型付けできないだろうから無理っぽい気がするけど.
いや,string -> () とかに限定すれば可能か.副作用中心で (もはや関数型でもなんでもない w)




ありゃ… しまった (Readme.windows).

Do *not* install the Mingw/MSYS development tools from www.mingw.org: these are not compatible with this Caml port (@responsefile not
recognized on the command line).





Debian だと,ネイティブコンパイルもとても簡単.

# apt-get install liblablgtk2-ocaml liblablgtk2-ocaml-dev

そして,上記の hello, world をネイティブコンパイルするためには

$ ocamlopt -w s -I +lablgtk2 lablgtk.cmxa gtkInit.cmx hello.
ml -o hello
$ ./hello

だけで良いらしい.-w s ってのは,複文中で () 以外を返す関数に対する警告を抑制するオプションらしい.これが無いと,異様に警告が出てびびる.

ちなみに,バイトコードコンパイルしたい場合は,ocamlc を使って,.cma と .cmo というライブラリの方をリンクするようにすれば良いみたい.cma や cmo は,動的にリンクできるというメリットがあるらしい

$ ocamlc -w s -I +lablgtk2 lablgtk.cma gtkInit.cmo hello.ml
-o hello

hello 程度じゃわかんないけど,ネイティブコンパイルの方が,若干コンパイルに時間がかかるけど起動が速い,バイトコードはコンパイルがやたら速いけど,若干起動に時間がかかるような.

まぁ,いくらバイトコードといえでも,Linux でコンパイルしたやつを Windows で動かすとかは無理なんだろうね.gtk が絡むから (たぶん)

あと,ここのサンプルコードが素晴らしすぎる.

とりあえず,ここまでのところ OCaml は非常に素晴らしい感じなので,今日からボクもらくだっこになって数理科学的にバグを撲滅していく所存であります.

コメント

Secret

>ML で拡張可能なエディタとかって作れるのだろうか ?

昔あったんですが...そういえばブラウザもありました。

ほほう,やはりありましたか.大変興味深いのですが,ML にせよ,Meta Language にせよ,ちょっと検索に引っかかりにくすぎて… (^-^;

名前を入れ忘れていました。匿名になってしまい申し訳ありません。件のエディタやブラウザは

http://pauillac.inria.fr/cdrom/prog/unix/efuns/eng.htm
http://pauillac.inria.fr/mmm/jmmm/index.html

にあります。

> yoriyuki さん

なるほど〜 大変興味深いです.

私見では,(見方によっては悪口に聞こえてしまうかもしれませんが… 悪意は全くありません) ブラウザやエディタのように,ある程度以上のマシンパワーを要求し,日常使いたくて (ネイティブコードまで落としておきたい),ある程度仕様が決まっていて,あとはひたすら実装を進めていくようなタイプのアプリケーションこそ,もっとも OCaml が力を発揮する分野だと思います.特に GUI が絡むような領域.C++ の代替の,有力候補というか (まぁ,単に置き換えるだけではもちろん駄目ですが.C/C++ の実績と資産には勝てない).

# しかし,やはり Xlib だと見た目と国際化に少々難があるようですね (いや,本質ではありませんが…) Qt や Gtk のようなツールキットがもう少し整備されて (できれば標準ライブラリで) 配布されるようになれば,一躍 OCaml は最前線に踊りでるかもしれません (というか,ほぼ全ての流行ってない言語は,GUI に弱いような… やっぱり見た目重要というか).

# … まぁ,国際化や文字列処理などにもいろいろ難はありそうですが. > そこでカモミ〜ルですよ !!! と.

http://camomile.sourceforge.net/index.html.ja.jis

# というか,結局 (CLX みたいに,ネイティブで X しゃべってるのでも無い限り) ボトルネックはどうせ Gtk の内部なんだから,どの言語で書いても同じなのかもしれない.ネイティブコンパイルできた方が,起動は少々早まるでしょうが (その時点でけっこう狭まるけど),最近のマシンは速いしなぁ (いや,起動の速度こそ,実は一番重要なのかもしれませんが.Java は,平均的には,下手な C よりも速いと思いますが,ほんの一部に過ぎないとはいえ, JVM と JIT の起動時間のせいで,印象が最悪になっていると思います (そして,ほぼサーバサイドでしか流行ってない.日常のアプリに,Java で書かれたものを積極的に使いたいと思う人は少ないと思う).

おおっと,脱線の方が圧倒的に長くなってしまいました.やっぱり眠いときにレス書くと駄目ですね.

コメント感謝いたします.
プロフィール
  • Author:あろは (alohakun)
  • 京都のデバッガベンダーに勤めるアラサー会社員。

    本ブログの内容は、あくまでも個人的な感想や意見であり、会社の意見を代表するものでは一切ありません。

    最近は会社の方のブログをメインに更新しています。

    KMC Staff Blog

    連絡先 : alohakun ___at___ gmail.com
    mixi : http://mixi.jp/show_friend.pl?id=182927
    twitter : http://twitter.com/alohakun













    あわせて読みたい


    この日記のはてなブックマーク数


    スカウター : ホワット・ア・ワンダフル・ワールド


    Map
FC2カウンター
ブロとも申請フォーム

この人とブロともになる

最近のコメント
リンク
最近のトラックバック
人生の残り日数
日本人男性の平均寿命は 28700日.
RSSフィード
カテゴリー
  1. RSSリーダー