12

コードがその範囲外の配列をアドレス指定しないことをコンパイル時に証明できる、十分に強力な型システムをサポートする言語がいくつかあります。私の質問は、そのような言語を JVM にコンパイルする場合、パフォーマンスのためにそれを利用し、すべての配列アクセスで発生する配列境界チェックを削除する方法はありますか?

1) 最近の JDK がいくつかの配列境界チェックの除去をサポートしていることは知っていますが、コンパイル時に特定の呼び出しが安全であることを知っているので、より安全に削除することができます。

2) これはパフォーマンスにあまり影響しないと考える人もいるかもしれませんが、特に科学計算などの配列/計算の多いアプリケーションでは、最も確実に影響します。

キャストに関する同じ質問。何かが特定の型であることは知っていますが、Java は型システムが限られているためそうではありません。JVMに「私を信頼して」チェックをスキップするように指示する方法はありますか?

JVM は一般に配布されているため、おそらくこれを行う方法はないと思いますが、この機能を使用して JVM を変更することは合理的でしょうか? これは行われたことですか?

これは、より強力な型付き言語を JVM にコンパイルする際のフラストレーションの 1 つであり、Java の制限によって妨げられています。

4

2 に答える 2

3

原則として、これはプルーフ キャリング コード(PCC) インフラストラクチャなしでは安全な方法で行うことはできません。PCC を使用すると、ファイルに安全性の根拠を埋め込むことができclassます。埋め込まれたプルーフは、クラスのロード時にチェックされます。証明に欠陥がある場合、クラスはロードされません。

JVM が正式な証明を必要とせずに実行時チェックを削除することを許可した場合、SecurityMatt が言うように、安全なプラットフォームとしての Java の本来の哲学が無効になります。

JVM は、メソッド内のローカル変数の型チェックに特別な形式の PCC を使用します。すべてのローカル変数の型付け情報は、クラスローディング メカニズムによってその正確性をチェックするために使用されますが、その後破棄されます。しかし、これは JVM で使用される PCC の概念の唯一の例です。私の知る限り、JVM 用の一般的な PCC インフラストラクチャはありません。

Java の小さなサブセットをサポートする JavaCard プラットフォームが存在すると聞いたことがあります。それがあなたの問題に役立つかどうかはわかりません。

于 2012-11-27T19:37:06.180 に答える
2

Javaの重要な機能の1つは、境界チェックを行うために開発者を「信頼」する必要がないことです。これにより、攻撃者がアプリケーション内で任意のコードを実行できる可能性のある「バッファオーバーフロー」セキュリティの脆弱性が排除されます。

開発者が境界チェックをオフにできるようにすることで、Javaはその重要な機能の1つを失います。つまり、Java開発者がどれほど間違っていても、コード内に悪用可能なバッファオーバーフローは発生しません。

プログラマーが自分の境界チェックを管理することを信頼されている言語を使用したい場合は、C++をお勧めします。これにより、自動境界チェックなしで配列を割り当てることができ(new int [])、組み込みの境界チェックで配列を割り当てることができます(std :: vector)。

さらに、アプリケーションの速度低下をチェックする境界を非難する前に、ベンチマークを実行して、ボトルネックを引き起こしている可能性のあるコードの他の場所があるかどうかを判断することを強くお勧めします

コンパイラターゲットの場合、MSILなどのバイトコード言語がJavaバイトコードよりもニーズに適していることがわかります。MSILは強く型付けされており、Javaで見られるような多くの非効率性に悩まされることはありません。

于 2012-11-27T17:33:50.063 に答える