“Squeak runs”是什么意思;位相同;跨平台,在某种程度上Java不会';T

“Squeak runs”是什么意思;位相同;跨平台,在某种程度上Java不会';T,java,jvm,smalltalk,vm-implementation,Java,Jvm,Smalltalk,Vm Implementation,Alan Kay说,“与Java不同,[Squeak]在每台机器上运行的方式都有点相同——这是我们20年前发明的。”。报告还提到: Squeak适用于许多用户 平台和在上生成的程序 一个平台在所有平台上运行完全相同 其他平台 由于具有不同指令集的机器显然无法在本机上运行完全相同的程序,那么,如果说Squeak在不同的机器上运行完全相同的程序,而Java却不能,这意味着什么呢 我的印象是,编译后的Java类在任何JVM上的任何机器上运行都是相同的,不是吗?它在虚拟机上运行,如维基百科的下一句所述:

Alan Kay说,“与Java不同,[Squeak]在每台机器上运行的方式都有点相同——这是我们20年前发明的。”。报告还提到:

Squeak适用于许多用户 平台和在上生成的程序 一个平台在所有平台上运行完全相同 其他平台

由于具有不同指令集的机器显然无法在本机上运行完全相同的程序,那么,如果说Squeak在不同的机器上运行完全相同的程序,而Java却不能,这意味着什么呢


我的印象是,编译后的Java类在任何JVM上的任何机器上运行都是相同的,不是吗?

它在虚拟机上运行,如维基百科的下一句所述:)

与Java相比,不确定“完全相同”部分意味着什么。我的印象是,相同的类文件可以在不同的机器上运行,因为Java也可以在虚拟机上运行


希望阿兰能跳进这条线,帮我们解决这个问题

我能想到的唯一一件事是,他指的是,Java通常(而且C总是)“及时”在目标机器上编译为本机代码,然后再运行。

完全相同意味着Squeak映像本身可以在许多平台上运行,而不仅仅是Squeak源代码


Smalltalk图像即是代码(字节码格式)和活动对象的存储。代码以中间字节码格式提供,然后VM会动态编译为特定于平台的机器代码。

显而易见的解释是,在不同的机器上使用相同的输入执行相同的图像将导致图像通过相同的位模式演变。表示浮点在不同平台上具有相同的表示形式。Java要求平台之间的语义相同,但允许非规范化表示。Squeak用于确保跨平台位相同浮点的库是Sun的库,Sun JVM也使用该库,尽管他们提到用编译器设置进一步限制它。

术语位相同不仅指没有本机代码,还指如何处理数据操作。不同平台之间存在细微差异,例如,由于浮点单元的不同硬件实现,浮点数的最低有效位存在细微差异

因此,位相同也可能意味着这样的差异被消除,每个指令在每个硬件上逐位返回相同的结果。这将禁止某些硬件的使用,并且需要仿真。我不确定这在可接受的成本下是否可行,或者是否有实现这一点的好方法。

来自以下文件:

与StrictMath类的某些数值方法不同,Math类的等效函数的所有实现都没有定义为返回逐位相同的结果。这种放宽允许在不需要严格再现性的情况下更好地执行实施


请注意:在使用现代编译器时,编译器设置是必要的,因为Sun math库使用指针别名来访问浮点位。唯一的区别是Squeak确实在gcc的旧版本中坚持了很长时间,避免了这些限制的必要性,但现在这种情况已经不复存在了。。。