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