Pythonistaが
OCamlを実用する方法
     2012年11月24日
  第2回 関数型言語勉強会 大阪
お前、誰よ
n   おのうえ(@_likr)

n   関西大学の大学院生

n   kyoto.py実務の人(?)、関西GPGPU勉強会主宰

n   最適化アルゴリズムの研究とかやってる

n   最適化ソルバーをPython / OCamlで作った話をする
おのうえが関数型言語に求めたこと

n   高い記述性

n   開発効率

n   (実行速度が必要な)アルゴリズムの実装
                      ここを置き換える何か

     Python   Python / C API   C
OCaml

n   関数型言語の高い記述性

n   C言語並の実行速度

n   副作用に寛容
最初のソリューション
  n   Python-C、C-OCaml間の橋渡しをCで実装

  n   問題点

       n   Cの層を実装するのが面倒

                             動的リンクライブラリ

Python      Python / C API   C   OCaml C Interface   OCaml
ctypesによる改良
n   Pythonで外部関数を扱う標準ライブラリctypesを使用

n   OCamlとのインターフェースをpure Pythonで実装

n   Python3系やPyPyでも動く

                          動的リンクライブラリ

       Python    ctypes     OCaml
otypes
n   OCamlへのアクセスに必要なPythonコードをまとめた

     n   ライブラリのロード

     n   OCamlの値との相互変換

     n   OCaml関数の呼び出し

n   https://bitbucket.org/likr/otypes
サンプル(OCaml側)

 (* example.ml *)

 let x = 5;;

 let f x = x * 2;;

 let () =
   Callback.register "x" x;
   Callback.register "f" f;;
サンプル(コンパイル)



$ ocamlopt -c example.ml
$ ocamlopt -output-obj -o example.so example.cmx
サンプル(Python側)
from otypes.bootstrap import make

make('example.so', 'example_module')

import example_module

x = example_module.caml_named_value('x')
print example_module.int_val(x)
f = example_module.caml_named_value('f')
y = example_module.val_int(10)
z = example_module.caml_callback(f, y)
print example_module.int_val(z)
まとめ

n   アプリケーション、UIはLL等で
     実装したいという要求は多いはず

n   他言語インターフェース(FFI)は
     関数型言語「実用」の   になる(かも)
ご清聴ありがとうございました

PythonistaがOCamlを実用する方法

  • 1.
    Pythonistaが OCamlを実用する方法 2012年11月24日 第2回 関数型言語勉強会 大阪
  • 2.
    お前、誰よ n おのうえ(@_likr) n 関西大学の大学院生 n kyoto.py実務の人(?)、関西GPGPU勉強会主宰 n 最適化アルゴリズムの研究とかやってる n 最適化ソルバーをPython / OCamlで作った話をする
  • 3.
    おのうえが関数型言語に求めたこと n 高い記述性 n 開発効率 n (実行速度が必要な)アルゴリズムの実装 ここを置き換える何か Python Python / C API C
  • 4.
    OCaml n 関数型言語の高い記述性 n C言語並の実行速度 n 副作用に寛容
  • 7.
    最初のソリューション n Python-C、C-OCaml間の橋渡しをCで実装 n 問題点 n Cの層を実装するのが面倒 動的リンクライブラリ Python Python / C API C OCaml C Interface OCaml
  • 8.
    ctypesによる改良 n Pythonで外部関数を扱う標準ライブラリctypesを使用 n OCamlとのインターフェースをpure Pythonで実装 n Python3系やPyPyでも動く 動的リンクライブラリ Python ctypes OCaml
  • 9.
    otypes n OCamlへのアクセスに必要なPythonコードをまとめた n ライブラリのロード n OCamlの値との相互変換 n OCaml関数の呼び出し n https://bitbucket.org/likr/otypes
  • 10.
    サンプル(OCaml側) (* example.ml*) let x = 5;; let f x = x * 2;; let () = Callback.register "x" x; Callback.register "f" f;;
  • 11.
    サンプル(コンパイル) $ ocamlopt -cexample.ml $ ocamlopt -output-obj -o example.so example.cmx
  • 12.
    サンプル(Python側) from otypes.bootstrap importmake make('example.so', 'example_module') import example_module x = example_module.caml_named_value('x') print example_module.int_val(x) f = example_module.caml_named_value('f') y = example_module.val_int(10) z = example_module.caml_callback(f, y) print example_module.int_val(z)
  • 13.
    まとめ n アプリケーション、UIはLL等で 実装したいという要求は多いはず n 他言語インターフェース(FFI)は 関数型言語「実用」の になる(かも)
  • 14.