現在までPOSIXコールのサポートはJRubyだとかなり困難であった。同等のJava APIの使用も一つの方法であるが、もし機能性がJava同等のものが存在しても、意味がないかもしれない。そしてもしJavaのプラットフォームが機能性 に欠けていると、タスクを実行するためのコマンドラインプログラムに乗り出す等の次善策しか見つからないのだ。
JRubyのCharles Nutter氏はブログ上でネイティブコードとPOSIXに関して述べている。
分かっている、分かっていますよ。それは中にネイティブコードがある。そしてそれは良くないんことなんです。JNIも使っていますがそれも良くないです ね。しかしながら私の人生の中でJava Native Acccessの素晴らしい利点を脅かすほどの汚点はなかったのです。例えば私が使い始めた新しいPOSIXのインターフェースです。
import com.sun.jna.Library;
public interface POSIX extends Library {
public int chmod(String filename, int mode);
public int chown(String filename, int owner, int group);
}
ここにある秘密の(それほどでもないが)中身はJavaのJNIではなくJava Native Access(JNA)ライブラリである。JNIがネイティブCコードへのアクセスを提供する一方、それはアクセスするのに余分な努力とグルーコード、コン パイルされる必要のあるJNIヘッダー定義を要する。
挙げられた例では、JNAを使用しているこのコードは全てライブラリにアクセスし、取り込むために必要な素材なのです。
import com.sun.jna.Native
POSIX posix = (POSIX)Native.loadLibrary("c", POSIX.class);
これはスタンダードCライブラリを取り入れ、chmodとchown機能へのアクセス権を提供する。もちろんこのアプローチはこの二つの機能に制限されたものではない。コードサンプルからPOSIXインターフェースにもっと機能を追加すると、もっとたくさんのC strib機能へのアクセスが可能になる。最終的にNativeロードLibraryは、単純にJavaインターフェースメソッドからの名前をライブラリの中のC機能へとマップし、アクセス可能にする。
JNAは素晴らしい性質を持ったlibffiにアクセスするために、未だにJNIを内密に使用している。JNIの使用は問題を引き起こす。例えばそれを許さないセキュリティマネージャーとの衝突や、JEEコンテナとの問題を引き起こす可能性がある。明らかにネイティブライブラリが利用されるといつでもプラットフォームに適合させなければならない。現在入手可能なJNAリリースにはWin32、Linux 32と64ビットx86バージョン、Solaris SPARCとx86、FreeBSDとPPC用のDarwin(MacOS X)、x86用にコンパイルされたライブラリがついてくる。これはかなり広範囲に対応している。
JRubyからのネイティブライブラリへの簡単なアクセスは実用的だがJNAは新たな可能性を生み出す。Ruby ネイティブエクステンションへのサポートである。これはRubyプロセス内で取り入れられた共有ライブラリで、Rubyインタプリタの内部にアクセスできる。ネイティブエクステンションは幅広く使われている。たとえばコードのテスト範囲を定めるために使われている人気なrcovツールは、どのコードが実際 にテスト試用で実行されるのかを定めるためにRuby APIを利用する。
上記の例が示しているように、このサポートは簡単ではない。なぜならRubyランタイムと相互作用する仕様を拡張するRuby C Language APIのフルインプリメンテーションを要するからだ。これには2つの方向性がある。ネイティブコードはこのAPIを呼ぶことができるがRubyランタイムは、ある特定のイベントのコールバックも呼び出すことができる。ネイティブエクステンションに関する更なる詳細はProgramming RubyのオンラインバージョンのExtending Rubyのチャプタを参照して欲しい。
JRubyでのPOSIX機能の欠如はあなたにとって問題だろうか?JRubyではどんな種類のネイティブエクステンションが欲しくなるだろうか?