組み込みPython/マクロとしてのPython
現在、C++で作っているサーバーソフトをpure Javaな環境で動かす必要が出てきた。
できればJNIなどは使わないほうがよいとのこと。
そっくり移植するという手もあるが、似たようなコードを2重メンテするのは手間。
ということで、外部とのインターフェースはネイティブコードで書いて、ロジックの複雑なコア部分を他の言語で書くことにした。
処理速度の都合上、末端の処理はやはりネイティブ言語で書く必要があったため、
外部インターフェース → コア(複雑なロジック) → 末端の重いけど単純な処理
C++ 組み込み言語(共通) C++
Java 組み込み言語(共通) Java
というマクロ言語的な使い方となる。
当初はLuaを考えていたが LuaJavaが外部ライブラリを使う仕様となっていたため断念。
他に、上記のようにネイティブ→組み込み、組み込み→ネイティブの呼び出しができるのは、Pythonぐらいしかみつからなかった。Pythonは今まで使ったことがなかったが、ちょうどいい機会なので覚えてしまうことにする。
Pythonから末端のC++の呼び出しのためにラッパーが必要となるが、今回は SWIG を使用。
(boost::pythonやCythonなども検討したが、いろいろあって見送り。)
組み込みの方法は
http://lahosken.san-francisco.ca.us/frivolity/prog/embswig/doc.html
が参考になった。
しかし、上記の方法ではPythonのプロキシクラスを毎回ディスクから直接ロードすることになる。
これが嫌だったので、
http://fchiba.blog114.fc2.com/blog-entry-23.html
により、ソース中にプロキシクラスを埋め込むことにした。
また、Python→Javaの呼び出し時にはパッケージ名を指定してimportするが、
Pythonソースを共通化するためには、C++も同じパッケージにする必要がある。
そこで、
http://fchiba.blog114.fc2.com/blog-entry-24.html
で、SWIGで生成したコードにパッケージ名をつけた。
とりあえず簡単なコードで上記の実証実験が行えたので、これから実際のソースに適用してみることにする。