8

Alan Kayは、「Java とは異なり、[Squeak] はすべてのマシンで少し同じように動作します。これは 20 年前に発明されたものです」と指摘しています。ウィキペディアのページには、これについても言及されています。

Squeak は多くのプラットフォームで利用でき、1 つのプラットフォームで作成されたプログラムは、他のすべてのプラットフォームで少し同じように実行されます。

異なる命令セットを持つマシンは明らかにビット同一プログラムをネイティブに実行できないので、Squeak が異なるマシン上でビット同一プログラムを実行するのに、Java が実行しないと言うとき、それは何を意味するのでしょうか?

コンパイルされた Java クラスは、どの JVM 上のどのマシンでも同じように実行されるという印象を受けましたが、そうではありませんか?

4

6 に答える 6

7

明らかな解釈は、同じ入力を使用して異なるマシンで同じイメージを実行すると、イメージは同じビット パターンで進化するということです。Squeak の浮動小数点演算に関するこの投稿は、浮動小数点が異なるプラットフォームで同じ表現を持つことを意味します。Java では、セマンティクスがプラットフォーム間で同じである必要がありますが、非正規化された表現が許可されています。プラットフォーム全体でビットが同一の浮動小数点数であることを保証するために Squeak が使用するライブラリは、Sun JVM も使用する Sun のものですが、コンパイラ設定でさらに制限することについて言及しています。

于 2009-03-19T16:10:27.080 に答える
3

ビット同一という用語は、ネイティブ コードがないことを指すだけでなく、データ操作がどのように処理されるかを指すこともあります。プラットフォームごとに微妙な違いがあります。たとえば、浮動小数点ユニットのハードウェア実装が異なるため、浮動小数点数の最下位桁が異なります。

したがって、ビットが同一であることは、そのような違いが取り除かれ、すべての命令がすべてのハードウェアでビットごとに同じ結果を返すことを意味する可能性もあります。その場しのぎで、一部のハードウェアの使用が禁止され、エミュレーションが必要になります。これが許容できるコストで実行可能かどうか、またはこれを達成するための優れたトリックがあるかどうかはわかりません。

于 2009-03-19T16:20:18.180 に答える
2

java.lang.Mathのドキュメントから:

クラス StrictMath の一部の数値メソッドとは異なり、クラス Math の同等の関数のすべての実装は、ビット単位で同じ結果を返すように定義されていません。この緩和により、厳密な再現性が要求されない場合に、よりパフォーマンスの高い実装が可能になります。

于 2009-03-19T17:02:51.837 に答える