私は、 jamvmバージョン 1.5.0 でLinux を実行するMotorola FX9500 RFID リーダーを使用しています (アプリケーションをデプロイすることしかできません - Java VM などを変更することはできないため、オプションは限られています)。バージョンを確認します:
[cliuser@FX9500D96335 ~]$ /usr/bin/jamvm -version
java version "1.5.0"
JamVM version 1.5.4
Copyright (C) 2003-2010 Robert Lougher <rob@jamvm.org.uk>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2,
or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Build information:
Execution Engine: inline-threaded interpreter with stack-caching
Compiled with: gcc 4.2.2
Boot Library Path: /usr/lib/classpath
Boot Class Path: /usr/local/jamvm/share/jamvm/classes.zip:/usr/share/classpath/glibj.zip
アプリケーションを作成する必要があるため、Oracle Java SDK 1.5.0 を入手して Windows 7 PC にインストールしたので、次のバージョンになりました。
C:\>javac -version
javac 1.5.0
そのコンパイラでコンパイルしたアプリケーションが前述の JamVM で正しく動作すると考えるのは、理想主義的すぎますか? とにかく、私はこの小さなアプリケーションを書きます:
public final class TestApp {
public static void main(final String[] args) {
long p = Long.MIN_VALUE;
int o = (int)(-(p + 10) % 10);
System.out.println(o);
}
}
前述の javac コンパイラでコンパイルし、PC 上で次のように実行します。
C:\>javac TestApp.java
C:\>java TestApp
8
大丈夫です。人生は良いので、その.class
ファイルを取得してFX9500に配置し、次のように実行します。
[cliuser@FX9500D96335 ~]$ /usr/bin/jamvm TestApp
-2
ええと、なんと...ご覧のとおり、別の結果が返されます。
では、なぜ、誰が間違っているのでしょうか、それとも、この計算の処理方法について仕様が明確でないようなものなのでしょうか (そうではないはずです)。別のコンパイラでコンパイルする必要があるのでしょうか?
なぜ私はこれを気にするのですか?
私がこの状況になった理由は、そのような計算が内部で発生java.lang.Long.toString
し、実際のアプリケーションにバグがあり、ログアウトしてjava.lang.ArrayIndexOutOfBoundsException
. ログに記録したい値は、Long
.
Long.MIN_VALUE と Long.MAX_VALUE をチェックして、「エラー、番号はわかりませんが、実際には Long.XXX です。信じてください。嘘をつきますか?」とログに記録することで回避できると思います。しかし、これを見つけたとき、私のアプリケーションは砂の土台の上に構築されており、非常に堅牢である必要があると感じています. 私は、JamVM はその仕事に向いていないと言って、Python でアプリケーションを作成することを真剣に考えています (読者は Python ランタイムも持っているため)。
私は誰かが私が鈍いので、Windows PCでコンパイルする必要があったと言ってくれることを望んでいます....そして、それはうまくいくので、それを教えてください(もちろん、それが本当なら) !
アップデート
Noofiz のおかげで (ありがとう)、次の追加のテスト アプリケーションを作成しました。
public final class TestApp2 {
public static void main(final String[] args) {
long p = Long.MIN_VALUE + 10;
if (p != -9223372036854775798L) {
System.out.println("O....M.....G");
return;
}
p = -p;
if (p != 9223372036854775798L) {
System.out.println("W....T.....F");
return;
}
int o = (int)(p % 10);
if (o != 8) {
System.out.println("EEEEEK");
return;
}
System.out.println("Phew, that was a close one");
}
}
ここでも、Windows マシンでコンパイルして実行します。
印刷しますPhew, that was a close one
.class
問題の仕掛けにファイルをコピーして実行します。
それは印刷します...
...それを待つ...
W....T.....F
まあ。ちょっとめまいがするので、お茶が必要だと思います...
更新 2
私が試したもう1つのことは、何の違いもありませんでしたが、classes.zipおよびglibj.zipファイルをFX9500からPCにコピーしてから、そのようにクロスコンパイルを行うことでした(コンパイルされたファイルは問題ないはずです)右?):
javac -source 1.4 -target 1.4 -bootclasspath classes.zip;glibj.zip -extdirs "" TestApp2.java
しかし、結果の .class ファイルをリーダーで実行すると、同じメッセージが出力されます。