他言語ライブラリの利用 立石 孝彰 本資料はなるべく偽りがないように努めていますが、内容の正確さ・実現性については十分な推敲ができておりません。2次利用の際には各自の責任で行ってください。

Slides:



Advertisements
Similar presentations
1 プリミティブ Web サービスの 入出力データに関する一考察 2005 年 3 月 21 日 松江工業高等専門学校 情報工学科 奈良先端科学技術大学院大学 情報科学研究科 越田高志 電子情報通信学会 2005年総合 大会.
Advertisements

1 なんとなく Ajax ~新しくて古い XMLHttp 川合孝典 (Kansai.pm) 2005/5/22.
プログラミング第5回 1 while ループ 文字列の操作
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
Generic programming と STL
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
スレッドの同期と、スレッドの使用例 スレッドの同期 Lockオブジェクト: lockオブジェクトの生成
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
WebサービスII (第10回) 2007年11月28日 植田龍男.
Javaのための暗黙的に型定義される構造体
Iアプリプログラミング その1  鳥居秀徳.
アルゴリズムとプログラミング (Algorithms and Programming)
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
Lightweight Language Weekend ls-lRシェル
Ruby Extended Library Howto
Ruby Extended Library Howto
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
Ruby勉強会(第1回) 2006/06/29 竹内豪.
アルゴリズムとデータ構造 2011年6月13日
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
第20章 Flyweight ~同じものを共有して無駄をなくす~
C#とC++とオブジェクト指向 上甲 健史.
RMI ソフトウェア特論 第6回 /
アスペクト指向プログラミングを用いたIDSオフロード
入出力データ型に透過な Webサービス動的実行システム 松江工業高等専門学校 情報工学科 越田高志 情報処理学会第68回全国大会
プログラミング演習3 第2回 GUIの復習.
コンパイラの解析 (2) GCJのデータ構造 - 1.
型付きアセンブリ言語を用いた安全なカーネル拡張
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング言語入門 手続き型言語としてのJava
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
図書館職員のための アプリケーション開発講習会
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
第3回 2007年4月27日 応用Java (Java/XML).
WebサービスII (第7回) 2007年11月7日 植田龍男.
関数の定義.
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
プログラミング言語入門.
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2010年6月21日
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
B演習(言語処理系演習)第2回 田浦.
C言語 はじめに 2016年 吉田研究室.
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
アルゴリズムとプログラミング (Algorithms and Programming)
マイグレーションを支援する分散集合オブジェクト
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
アルゴリズムとデータ構造 2012年6月11日
オープンソースソフトウェアに対する コーディングパターン分析の適用
アルゴリズムとデータ構造1 2009年6月15日
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
統合開発環境のための プログラミング言語拡張 フレームワーク
モジュール分割.
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 2010年6月17日
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

他言語ライブラリの利用 立石 孝彰 本資料はなるべく偽りがないように努めていますが、内容の正確さ・実現性については十分な推敲ができておりません。2次利用の際には各自の責任で行ってください。

他言語ライブラリとは? Ruby以外のプログラム言語のライブラリ Javaのクラスファイル、jarファイル WindowsのDLL Linux, *BSD などの共有ライブラリ (.soファイル) Perl, Python などのライブラリ (.pl, .pyファイル)

Rubyにおける外部ライブラリの利用方法 拡張ライブラリを作成 (RubyInline含む) ビルド環境が必要 基本的にはC/C++ライブラリが対象 他言語のライブラリへアクセスするライブラリを利用 ビルド環境が必要ない データ構造が変更されるとRubyのスクリプトも変更 しなければいけないことがある。 コンパイラが行っている一部をプログラマが行わな ければならないかもしれない。 C/C++以外のライブラリへもアクセスできる XML-RPCやSOAPを利用 今回の対象外…

FFIとブリッジ・ライブラリ FFI (Foreign Function Interface) 他言語の関数を呼び出す & 他言語から呼び出されるための 機構 スタブの生成を伴う。 スタブ: 関数呼び出しの対応 + データ変換 ブリッジ・ライブラリ 他言語のライブラリへアクセスするためのライブラリ スタブの生成をなるべく動的に行う。 他言語へアクセスするためにビルド環境が必要ない。 ブリッジ・ライブラリ .class, .so, .dll, .py など Rubyで利用できる ライブラリ Rubyで書かれた プログラム ○○で利用できる ライブラリ Rubyの処理系 ○○の処理系 Java, C/C++, Pythonなど

Rubyにおける他言語へのブリッジ・ライブラリ Ruby/DL C/C++ http://rubyforge.net/projects/ruby-dl Rjb Java http://rjb.rubyforge.org/ Ruby/JS JavaScript http://www.rubyist.net/~tamura/ruby/ruby-js/ Ruby/Python Python http://www.goto.info.waseda.ac.jp/~fukusima/ruby/pytho n-e.html Ruby/Tk Tcl/Tk

Ruby/DL (Ruby/DL2) 対象言語: C/C++ 交換可能なデータ: 基本データ(整数、文字列、配列など)を扱えます。 構造体やコールバックも可能です。 イテレータを使ってコールバックを指定できます。 その他: 最近開発が滞り気味です。 呼び出す関数の型(シグネチャ)を明示的に指定する必 要があります。

Ruby/DL2: サンプル require 'dl/import' module LIBC extend DL::Importer # ブリッジのためのメソッドを用意 dlload LIBC_SO # libc.so をロード extern "int qsort(void*, int, int, void*)" # qsort用のメソッドを定義 # qsort用のコールバック QsortCallback = bind("void *qsort_callback(void*, void*)", :temp) end buff = "9341" LIBC.qsort(buff, buff.size, 1, LIBC::QsortCallback){|ptr1,ptr2| ptr1[0] <=> ptr2[0]} # qsortを実行 p buff # “1349” を出力

Rjb: Ruby-Java Bridge 対象言語: Java 交換可能なデータ: 基本データやJavaオブジェクトを扱えます。 コールバックも可能です。 インターフェイスを実装したオブジェクトをRuby側 で作れます。 その他: オーバーロードされたメソッドではシグネチャの指定が 明示的に必要な場合があります。

Rjb: サンプル require 'rjb' Rjb::load() # JVMのロード class MyComparator def compare(o1, o2) o2.toString() <=> o1.toString() end ArrayList = Rjb::import("java.util.ArrayList") # ArrayListの定義 l = ArrayList.new() l.add("b"); l.add("a"); l.add("c") p l.toString() # [b, a, c] を出力 Collections = Rjb::import("java.util.Collections") Collections.sort(l, Rjb::bind(MyComparator.new(), "java.util.Comparator")) # インターフェイスの利用 it = l.iterator() while (it.hasNext()) obj = it.next() p obj.toString() # “c”,”b”,”a” を順に出力

Ruby/JS 対象言語: JavaScript (ECMAScript) 交換可能なデータ: 基本データだけです。 その他: JavaScriptをRubyの中で動かすことができるライブラ リです。 サンプル: require 'js' a = JS::evaluate("1") p [a.class, a] # [Fixnum, 1] a = JS::evaluate("'a'") p [a.class, a] # [String, "a"] a = JS::evaluate("new Object()") # エラー p [a.class, a]

Ruby以外の言語では? Perl C::DynaLib モジュール Perl DynaLoader モジュール Python dl モジュール Gauche c-wrapper Perl Win32::API Perl FFI

Perl C::DynaLib 対象言語: C/C++ 交換可能なデータ: 基本データ、コールバック、構造体を扱えます。 サンプル: use C::DynaLib; $libc = new C::DynaLib("cygwin1.dll"); sub compare_lengths { length(unpack("p", $_[0])) <=> length(unpack("p", $_[1])); } $callback = new C::DynaLib::Callback("compare_lengths", "i", "p$ptr_len", "p$ptr_len"); $qsort = $libc->DeclareSub("qsort", "", "P", "I", "I", PTR_TYPE); @list = qw(A bunch of elements with unique lengths); $array = pack("p*", @list); &$qsort($array, scalar(@list), length($array) / @list, $callback->Ptr()); @result = unpack("p*", $array); print join(",", @result), "\n"; 参考: http://search.cpan.org/dist/C-DynaLib/DynaLib.pm

Python dlモジュール 対象言語: C/C++ 交換可能なデータ: 整数と文字列のみ扱えます。 それ以外はpackを使います。 関数の返り値はlongでなければならない。 その他: (私が)良いサンプルを見つけることができなかった。 サンプル: import dl, time h = dl.open('/usr/bin/cygwin1.dll') if h.sym('time'): print(h.call('time')) print(time.time()) 出力: 1181289585 1181289585.77 参考: http://www.python.jp/doc/2.4/lib/module-dl.html

Gauche FFI 対象言語: C/C++, ObjectiveC 交換可能なデータ: 基本データ、コールバック、構造体を扱えます。 その他: Cヘッダファイルをパースして自動的にシグネチャを判断 します。 libffiを利用しています。 現状では最も進んだCへのブリッジ・ライブラリではない だろうか? サンプル: (use c-wrapper) (c-load "stdio.h" :libs "-lc") (printf "Hello, world\n") 参考: http://homepage.mac.com/naoki.koguro/prog/c-wrapper/index-j.html

共通機能 ライブラリ/ファイルのロード 必ず必要です。 クラス、モジュールの定義 対象言語に依存します。 シグネチャの指定 Rjbでもメソッド・オーバーロードへの対応に必要です 。 シグネチャを全く指定できないことは逆に不自由です。 シグネチャは、関数呼び出しやデータの変換の方法 の指定方法として利用されます。 ブリッジ・ライブラリ毎で期待とは異なる変換を行 うかもしれない。 コールバックのためのスタブ 対象言語上に、Rubyへアクセスするためのオブジェク トやスケルトンコードを静的/動的に用意する必要があ ります。

共通機能の実現方法 ライブラリ/ファイルのロード Rjb::load(); import “org.example.foo.Foo” dlload “foo.dll” クラス、モジュールの定義 (対象言語に依存) Foo = import(“org.example.foo.Foo”) # 定数を利用 module Foo # モジュールを 利用 end シグネチャの指定 extern “void foo(void*, char*)”, :foo_str コールバック # DL内に用意されたRubyへアクセスする関数と関連付 ける bind “void my_cb(void*, void*)” # JVMに用意されたプロキシを介してobjのメソッドが 呼ばれる Rjb::bind(obj, “java.util.Comparator”)

こんなことができると嬉しい? (その1) Javaの場合: require 'java.util.HashMap' of Java m = HashMap.new() C/++の場合: require 'libc' of C # Javaの場合とほぼ同様 import void qsort(:void*, :size_t, :size_t, :void*) # シグネチャの指定 buff = “9341” qsort(buff, buff.size(), 1, proc{|ptr1,ptr2| ptr1[0] <=> ptr2[0]}) C/C++の場合(その2): module Libc require 'libc' of C # 配列用と文字列用に別々の名前で宣言 + デフォルト値/イテレータも指定 import void qsort(:char*, :size_t=$1.size(), :size_t=1, :_) as qsort_str import void qsort(:char*[], :size_t=$1.size(), :size_t=4, :_) as qsort_ary end buff = “9341” Libc.qsort(buff){|ptr1, ptr2| ptr1[0] <=> ptr2[0] }

こんなことができると嬉しい? (その2) Javaのメソッドをコールバック関数としてCの関数を呼び出 す。 現状でも技術的には可能 サンプルコード: module MixedLib import 'libc' of C # Cライブラリをインポート import 'org.example.MyComparator' of Java # Javaのクラスをインポート end # Javaの Comparator を使って C の qsort を実行 MixedLib.qsort([“a”,”b”,”c”], method(MixedLib::MyComparator.compare))

今後の期待 ブリッジ・ライブラリのための共通フレームワーク/ライブ ラリ 複数の他言語のデータの取り扱いを統一します。 利用者はほとんど同じマナーで他言語ライブラリを利用 できます。 ブリッジ・ライブラリ用の文法 or DSL スタブ生成用の言語内DSL

まとめ ブリッジ・ライブラリ: 他言語ライブラリのためのライブ ラリです。 拡張ライブラリとは補完的な関係です。 面倒なデータ変換を考えるくらいなら拡張ライブラリを 作る。 他言語ライブラリのためのRubyライブラリをブリッ ジ・ライブラリを使って作るというのは現実的では ない(と思う)。 限定された簡単なことを行うならブリッジ・ライブラリ を使う。 ブリッジ・ライブラリ共通の仕組みがあると良いかもしれ ない。 ユーザにとっては、ブリッジ・ライブラリ毎に新しいマ ナーを覚える必要はない。 開発者にとっては、Rubyらしく扱えるように実装する 部分が面倒だと思うので、共通化できないだろうか?