10

私は、 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 ファイルをリーダーで実行すると、同じメッセージが出力されます。

4

3 に答える 3

2

私はコメントしたでしょうが、何らかの理由で、それには評判が必要です。

このデバイスでは長い否定は機能しません。その正確な性質はわかりませんが、単項マイナスを 2 つ実行すると、開始した場所に戻ります。たとえば、x=10; -x==4294967286; -x==10。4294967286 は Integer.MAX_VALUE*2 (2147483647*2 = 4294967294) に非常に近い値です。Integer.MAX_VALUE*2-10 にさらに近づいています。

この 1 つの操作に分離されているようで、それ以上の基本的な方法でロングに影響を与えることはありません。独自のコードで操作を回避するのは簡単です。ブートクラスパスを巧妙に悪用すると、GNU クラスパス コードでの呼び出しを回避して、それらを *-1 に置き換えることができます。デバイス GUI からアプリケーションを起動する必要がある場合は、 -Xbootclasspath=... スイッチを args パラメータに含めて、JamVM に渡すことができます)。

バグは実際には後者 (最新リリースよりも) で既に修正されて ます

ただし、デバイスの修正バージョンでは役に立ちません。Rob Lougher は、JamVM の新しいバージョンをリリースする理由としてこの問題について言及していますが、それがいつになるか、または Motorola がファームウェアを更新するのに十分納得できるかどうかはわかりません。

FX9500 は、実際には再パッケージされた Sirit IN610 であり、両方のデバイスがこのバグを共有していることを意味します。Sirit は Motorola よりもはるかに友好的であり、ファームウェアのアップグレードを提供しており、近い将来利用できるようになります。Motorola にも修正が含まれることを願っていますが、2 つの当事者間の取り決めの詳細はわかりません。

いずれにせよ、FX9500 で実行されている非常に大きなアプリケーションがあり、長い否定操作が通過できない障壁であることが証明されていません。

がんばれ、ダン。

于 2013-09-04T14:33:39.063 に答える