スライド 1

JNIを利用したSLIMと他のLMNtal
プロダクトとの連携の調査
2009/7/21 キックオフ
2009/8/6 加筆修正
B4 上野裕介
1
概要
• LMNtal言語では様々な派生プロダクトが誕生
• SLIM
– C言語で実装されたLMNtal実行時処理系
– 特徴的な機能
• モデル検査器や非決定実行モードなど
– Java言語で実装された他のプロダクトと深い連携
がなされていない
• SLIMと他のプロダクトを連携する手段として
JNIを取り上げ、その使用方法を調査
2
目次
• LMNtalのプロダクト
– LMNtalプロダクト間の連携
• 卒論に向けて
– SLIMの連携の利点の例
– JNI(java Native Interface)
– JNIに関する調査
• JNIのプログラムの実行
• OSによる違い
• まとめと今後の課題
– 今後やること
– 参考文献
3
LMNtalのプロダクト(1/3)
• LMNtalコンパイラ(java)
– LMNtalプログラムを解析して中間命令列に変換
• Java版実行時処理系(java)
– 中間命令列を解釈実行し、計算を行う
– 他言語インタフェース機能によって、インラインの
Javaプログラムを実行可能
• Javaクラスライブラリを利用可能
4
LMNtalのプロダクト(2/3)
• C版実行時処理系SLIM(C言語)
– 中間命令列を解釈実行し、計算を行う
– 他言語インタフェース機能
• C言語で実装した関数を実行可能
– LTLモデル検査器が実装済
– 非決定的実行
• 全実行結果の出力が可能
5
LMNtalのプロダクト(3/3)
• UNYO-UNYO 3G(java)
– LMNtalプログラムの実行過程を可視化
– プログラムのデバッグや直観的理解に役立つ
• LMNtalEditor(java)
– LMNtalのための統合開発環境
– ボタン1つでJava版実行時処理系、SLIM、UNYO-UNYO
3Gでプログラムを実行できる
– StateViewer
• SLIMが非決定的実行時に出力した全実行結果を可視化
6
LMNtalプロダクト間の連携(1/2)
• Java版実行時処理系とLMNtalコンパイラ
– Java版実行時処理系の実行中にデータをやり取りす
ることで、対話的実行(インタラクティブモード)を実現
している
• Java版実行時処理系とUNYO-UNYO 3G
– UNYO-UNYO 3Gの実行中にデータをやり取りすること
で、実行過程の可視化を実現している
• SLIMとLMNtalEditor
– SLIMの非決定的実行の実行結果をLMNtalEditorで
受け取ることで、StateViewerでの可視化を実現して
いる
7
LMNtalプロダクト間の連携(2/2)
• Java版実行時処理系は、実行中にほかのプ
ロダクトとデータのやり取りを行うような密な
連携がなされている。
• C版実行時処理系SLIMは、今のところ、実行
結果を他のプロダクトに引き渡すような単純
な連携しかなされていない。
– SLIM以外はJavaで実装されているため、実装言
語の違いが開発が避けられている一因と考えら
れる
8
目次
• LMNtalのプロダクト
– LMNtalプロダクト間の連携
• 卒論に向けて
– SLIMの連携の利点の例
– JNI(java Native Interface)
– JNIに関する調査
• JNIのプログラムの実行
• OSによる違い
• まとめと今後の課題
– 今後やること
– 参考文献
9
卒論に向けて
• これまでやってきたこと
– 先輩方の論文をいくつか読んだ。
– SLIMの他言語インタフェースを実際に記述した。
– SLIM、UNYO-UNYO 3G、LMNtalEditorどれも面白
そうだと思った。
• SLIMと他のプロダクトとの連携を図ることで、
LMNtal開発環境の向上が見込める。
– JavaとC言語という実装言語の違うプログラムを連
携させる方法を調査し、実装してみたい。
10
SLIMの連携の利点の例(1/3)
• SLIMとLMNtalコンパイラの連携
– SLIMでの対話的実行(インタラクティブモード)の
実現
• ユーザが入力したプログラムを逐次コンパイルして実
行するため、SLIMの実行中にLMNtalコンパイラとの連
携が必要
– SLIM独自の機能として、非決定的実行時の全実
行結果を対話的に出力することができそう
• LMNtalの理解、非決定的実行時の動作の理解が深ま
る。デバッグもはかどる。
11
SLIMの連携の利点の例(2/3)
• SLIMとUNYO-UNYO 3Gの連携
– SLIMでの実行過程の可視化
• SLIMの実行中にUNYO-UNYO 3Gとデータのやり取りを
行うことで可視化が実現できそう
• SLIMもJava実行時処理系も基本的には同じLMNtalプ
ログラムを処理するが、他言語インタフェースなど、処
理系に依存したプログラムも存在する。
• SLIMでしか実行できないLMNtalプログラムでも実行過
程が可視化できれば、デバッグやプログラムの理解が
はかどる。
12
SLIMの連携の利点の例(3/3)
• SLIMとLMNtalEditorの連携
– StateViewerの逐次実行の実現
• StateViewerはSLIMの実行結果を解析するため、状態
空間の大きなプログラムの場合、StateViewerでの表
示に非常に時間がかかったり、メモリが足りずにSLIM
で正常な出力ができず、StateViewerでは結果を表示
できない場合もある。
• SLIMの実行中に非決定的実行時の状態を逐次出力し、
LMNtalEditorとデータのやり取りが行えれば、
StateViewerで途中まで表示することができそう。
13
JNI(Java Native Interface)
• Javaから他言語のアプリケーションを呼び出し
たり、他言語からJavaクラスを呼び出したりす
るための標準仕様。
– C言語からJavaクラスを呼び出すためにはJDKに
付属の<jni.h>をインクルードする必要がある
– C言語からJavaクラスを呼び出すときには、基本的
にはJava側の修正は必要ない
• JNIを導入してC言語からJavaクラスを呼び出しても、
Java側の保守性を下げることが少ない
14
JNIに関する調査
• 以下の調査を行った
– 実際にC言語からJavaクラスを呼び出せるのか
– 複数のOSで動作するか
• SLIMの実行環境としてよく用いられている
Windows(cygwin)とLinux(Ubuntu)で調査
– コンパイル時にどんなオプションが必要か
– 実行時にどんな環境変数が必要か
15
JNIのプログラムの実行
• C言語からJavaVMを生成し、java.lang.Mathパッ
ケージのpow()メソッドで25を計算し、計算結果の
double型のデータをC言語で出力するプログラム
を作成した。
– Windows(cygwin)もLinux(Ubuntu)も同じCソースコード
をコンパイルして正しい実行結果が得られた。
C
Java
JavaVMの生成
Math.pow(2,5);
32.000
結果の出力
16
OSによる違い
Windows(cygwin)
Linux(Ubuntu 8.04)
環境変数
環境変数
JAVA_HOME
JDKのインストールパス
JAVA_HOME
JDKのインストールパス
PATH
%JAVA_HOME%\jre\bin
PATH
%JAVA_HOME%\jre\bin\
client
LD_LIBRARY_
PATH
${JAVA_HOME}/jre/lib/i3
86/client
コンパイルオプション
gcc -o main.exe -O2 main.c \
-D__int64='long long’ \
-I${JAVA_HOME}/include \
-I${JAVA_HOME}/include/win32 \
-L. -l jvm
コンパイルオプション
gcc -o main.exe -O2 main.c \
-D__int64='long long‘ \
-I${JAVA_HOME}/include \
-I${JAVA_HOME}/include/linux \
-L${JAVA_HOME}/jre/lib/i386/client \
-l jvm
その他
dlltoolを用いてjvm.dllのインポートライ
ブラリを生成する必要がある
17
目次
• LMNtalのプロダクト
– LMNtalプロダクト間の連携
• 卒論に向けて
– SLIMの連携の利点の例
– JNI(java Native Interface)
– JNIに関する調査
• JNIのプログラムの実行
• OSによる違い
• まとめと今後の課題
– 今後やること
– 参考文献
18
まとめと今後の課題
• JNIを用いると、C言語からJavaクラスを呼び出せ
ることが確認できた。
• 同一のプログラムが複数のプラットフォームで実
行できることが確認できた。
• 今後は実際にSLIMと他のプロダクトを連携する
ための具体的な実装方法を考える必要がある。
– 例:SLIMと他のプロダクトの双方にアトムやルールの
データを保持する必要があるのかどうか、そうであれ
ばどのように共有するか
– JNI以外にも実装方法は考えられるかもしれない
19
今後やること(1/2)
• まずはどれか1つでも連携機能を実装し、JNI
プログラミングのコツをつかみたい
– SLIMの特徴が活かせる機能連携を優先させたい
• インタラクティブnd実行
• StateViewerの逐次実行など
SLIM
StateViewerの逐次実行
LMNtal
Editor
プログラムの可視化
UNYOUNYO 3G
インタラクティブモード
LMNtal
コンパイラ
20
今後やること(2/2)
• SLIMへの多くの変更は避けられない
– JNI連携(C→Java)の場合、C言語側でほとんどのプログラムを書
く
– JNI 連携(Java→C)の場合、C言語側はライブラリ化する必要が
ある
• 連携部を中間アプリケーションのような形で独立させたい
– 他のプロダクトの保守性をねるべく下げないような実装が理想
Java
Java
JNI
SLIM
Application
LMNtal
Editor
UNYO-UNYO
3G
LMNtal
Java
コンパイラ
21
参考文献
• [1] 乾敦行,工藤晋太郎,原耕司,水野謙,加藤紀夫,上田和紀: “階層
グラフ書換えモデルに基づく統合プログラミング言語LMNtal”,コンピュー
タソフトウェア,Vol.25,No.1,pp.124-150,2008.
• [2] 石川力, 堀泰祐, 村山敬, 岡部亮, 上田和紀: “軽量なLMNtal 実行時処
理系SLIM の設計と実装”,情報処理学会第70 回全国大会,”5-153”-”5154”,2008.
• [3] 中野敦: “スケーラブルな可視化機能を備えたLMNtal開発環境の設計
と実装”, 早稲田大学大学院理工学研究科,修士論文,2008.
• [4] 齊藤和佳子: “LMNtal プログラムのカスタマイズ可能な可視化機能の
設計と実装”, 早稲田大学理工学部コンピュータ・ネットワーク工学科,卒
業論文,2008.
• [5] 綾野貴之: “システム検証機能を備えたLMNtal 統合開発環境の設計
と実装”, 早稲田大学理工学部コンピュータ・ネットワーク工学科,卒業論
文,2008.
• [6] 石川力: “LMNtal からC 言語への変換の設計と実装”,早稲田大学理
工学部コンピュータ・ネットワーク工学科,卒業論文,2008.
• [7] ロブ・ゴードン: “JNI JavaTM Native Interface プログラミングC/C++コード
を用いたJava アプリケーション開発”, ピアソン・エデュケーション,1998.
22