Alan Kay指出“与 Java 不同,[Squeak] 在每台机器上的运行方式都完全相同——这是我们 20 年前发明的”。维基百科页面也提到了这一点:
Squeak 可用于许多平台,并且在一个平台上生成的程序在所有其他平台上运行位相同。
由于具有不同指令集的机器显然不能在本地运行位相同的程序,当有人说 Squeak 在不同的机器上运行位相同的程序时,这是什么意思,而 Java 没有?
我的印象是编译后的 Java 类在任何 JVM 上的任何机器上运行相同,不是这样吗?
显而易见的解释是,在具有相同输入的不同机器上执行相同的图像将导致图像通过相同的位模式演变。这篇关于 Squeak 浮点数学的帖子暗示浮点在不同平台上具有相同的表示。Java 要求平台之间的语义相同,但允许非规范化表示。Squeak 用于确保跨平台的位相同浮点的库是 Sun 的库,Sun JVM 也使用该库,尽管他们提到通过编译器设置进一步限制它。
术语位相同不仅可以指没有本机代码,还可以指如何处理数据操作。从平台到平台存在细微差别,例如由于浮点单元的不同硬件实现,浮点数的最低有效位。
因此位相同也可能意味着消除了这种差异,并且每条指令在每个硬件上逐位返回相同的结果。Ad hoc 这禁止使用某些硬件并且需要仿真。我不确定这是否以可接受的成本可行,或者是否有一个很好的技巧来实现这一点。
位相同意味着 Squeak 映像本身可以在许多平台上运行,而不仅仅是 Squeak 源代码。
Smalltalk 图像是代码(字节码格式)和活动对象的存储。代码以中间字节码格式提供,然后 VM 将其即时编译为特定于平台的机器代码。
从java.lang.Math的文档:
与 StrictMath 类的一些数值方法不同,Math 类的等效函数的所有实现都未定义为返回逐位相同的结果。这种放松允许在不需要严格的再现性的情况下实现更好的性能。
它在虚拟机上运行,如 Wikipedia 上的下一句所述。:)
与 Java 相比,不确定“位相同”部分的含义。我的印象是相同的类文件可以在不同的机器上运行,因为 Java 也可以在虚拟机上运行。
这里希望艾伦能跳入主题并为我们解决这个问题!
我唯一能想到的是,他指的是 Java 经常(并且 C# 总是)在目标机器上“即时”编译为本机代码的事实,然后再运行。