Hatena::ブログ(Diary)

maachangの日記 このページをアンテナに追加 RSSフィード

2013-06-30 気になる技術ねた

[]NashornをJava7で動かしてみるテスト 17:59 NashornをJava7で動かしてみるテストを含むブックマーク NashornをJava7で動かしてみるテストのブックマークコメント

Java8からNashornと言う、Oracleが作ったOpenSourceのJavascriptがサポートされるのですが、最近Java関連にご無沙汰な毎日だったこともあり、今日は日曜日と言うことでこの辺の動向を調べてみた。

Java8は開発が遅れているとのことで、まだアルファー版的な存在でOpenJDKとして提供されているが、これに対して、最近Nashornが利用できる状況のようで、またオープンソースとなったことで、これらのソースコードも以下のリポジトリから入手可能だと言うことで、実際にこれらをダウンロードしてみた。

hg clone http://hg.openjdk.java.net/nashorn/jdk8/nashorn nashorn

hgと言うのは、最近のITに疎くなったせいで、Google先生に聞いてみると「レイザーラモンHG」のキモイ画像が出てくるので、「HG リポジトリ」で検索すると「mercurial」と言う単語が出るので、「mercurial windows」で検索すると、「Download - Mercurial」とあるので、このURL「http://mercurial.selenic.com/wiki/Download」をクリックして、自分の環境に合ったものをダウンロードして、上記のhgコマンドをフォルダー作成(c:¥nashornとでもしとく)し、そこで実行する。

すると、色々とモリモリファイルをダウンロードしてくれるので、それが終わったら、今度はASMと言うものをGoogle先生に検索依頼すると「モナコ」とか出るので、改めて[asm java]と検索するとTOPの方に「ASM - Home Page」なるものが出てくるので、それをクリィィィィック「http://asm.ow2.org/」。

左側のあたりにある「ASM stable releases can be downloaded from the ObjectWeb Forge. 」のリンクをクリック(ObjectWeb Forge部分)し、「5.0-alpha 」の[asm-src]をダウンロードし、それを先ほど作成したフォルダー(c:¥nashorn以下)に対して以下のフォルダーを作成[\jdk\src\share\classes\jdk\internal]して、そこにソースコードのパッケージ(\org\objectweb\asm)内容を解凍する。

※仮にc:¥nashornにフォルダーを作った場合、C:\nashorn\jdk\src\share\classes\jdk\internal\org\objectweb\asm以下に、javaソースコードたちが存在する。

・・・・・・・・・・・・・・・・・・

ここで重要なことは、このダウンロードしてきたASMなるものの、パッケージ構成が[org.objectweb.asm]から[jdk.internal.org.objectweb.asm]に変わるので、パッケージ名とインポート条件をそれぞれ変更する必要がある。

そして、別に使わない[xml]とかのパッケージは削除する。

それぞれ変更した後に・・・・のその前にそもそもJavaはJDK7が入っているか、nashornをコンパイルするにはANTが必要なので、それが入っているのか?この辺は説明を省略するので、Google先生にでも聞いてくだされwww.

 

これで、あと1つの問題をクリアーすれば、JDK7でもNashornが動かせることになるわけで・・・・って言っても、これは比較的に楽な話。以下のようにすればOK

jdk.nashorn.internal.codegen.types.Range.java

のファイルにある

        @Override
        public int hashCode() {
            return Long.hashCode(min) ^ Long.hashCode(max);
        }

と言う部分(大体130行目ぐらい)を、以下のように修正する。

        @Override
        public int hashCode() {
            //return Long.hashCode(min) ^ Long.hashCode(max);
            return (int)(min^(min>>>32)) ^ (int)(max^(max>>>32)) ;
        }

どうも、Java8からNumber系のオブジェクトで、プリミティブ型に対してHash計算できる仕組みがサポートされたようだが、今回のターゲットは、Java7なので、上記のように修正しなければならない。

・・・・・・・・・・・・・・・・・

修正の後、このファイルを保存して、あとは[nashorn\make]フォルダーに移動して、ant実行をすればOKで[nashorn\dist]直下にnashorn.jarと言うファイルが作成される。

これを[java -jar nashorn.jar hoge.js]のようにすれば(※hoge.jsは任意のファイルで)nashornがJava7で実行できるようになる。

私の環境でためしに以下のtest.jsファイルを実行してみたところ

( function() {
    
    java.lang.System.out.println( "startTest" ) ;
    
    var len = 100000000 ;
    var a = 0 ;
    var time = java.lang.System.currentTimeMillis() ;
    for( var i = 0 ; i < len ; i ++ ) {
        a ++ ;
    }
    time = java.lang.System.currentTimeMillis() - time ;
    
    java.lang.System.out.println( time + "msec" ) ;
    
} )() ;

>startTest

>234msec

と実行できた。

しかしながら、速度が速い。実際これをrhinoで実行すれば、10倍以上はかかるのでは無いだろうか。

・・・・・・・・・・・・・・・・・・

あと、補足を少々すれば、Java8では標準的な環境[rt.jar]に対して[org.objectweb.asm]の環境が同封されているので、Java8からは、この内容は必要なくなるわけだが、当然Java7にはこの環境は入っていないので、面倒なのだが、このようなことが必要だったわけである。

トラックバック - http://d.hatena.ne.jp/maachang/20130630/1372582787
リンク元