Java规范-什么是“Java规范”的规则;“有效”;优化

Java规范-什么是“Java规范”的规则;“有效”;优化,java,optimization,specifications,Java,Optimization,Specifications,我的理解是,如果优化没有与JLS相矛盾的可观察效果,则优化是有效的。例如,JIT编译器可以优化内部循环中的“不做任何事情”代码 但我不记得有这样一个明确的说法 是否有人知道Java优化(如由本机代码编译器执行)何时有效的明确声明(即JLS或类似文件中的声明)?只要编译器优化不会使代码的行为与标准不同,它就是有效的。这适用于所有语言 我认为没有必要特别说明这一事实,因为符合标准的编译器的唯一要求是其行为符合标准的描述。不改变其外观行为的优化显然不会改变其是否符合标准。JLS和JVM规范都指定了任何

我的理解是,如果优化没有与JLS相矛盾的可观察效果,则优化是有效的。例如,JIT编译器可以优化内部循环中的“不做任何事情”代码

但我不记得有这样一个明确的说法


是否有人知道Java优化(如由本机代码编译器执行)何时有效的明确声明(即JLS或类似文件中的声明)?

只要编译器优化不会使代码的行为与标准不同,它就是有效的。这适用于所有语言


我认为没有必要特别说明这一事实,因为符合标准的编译器的唯一要求是其行为符合标准的描述。不改变其外观行为的优化显然不会改变其是否符合标准。

JLS和JVM规范都指定了任何Java语句的行为(或JVM规范中字节码的工作方式等),但它们没有说明该行为是如何发生的。在这两个文档中,任何正确实现指定抽象行为的实现都被认为是兼容的Java实现。拥有一个抽象标准背后的主要思想是指定哪些可观察的行为必须在所有实现中共享,而不必详细说明是什么导致了这些行为的发生。因此,只要不偏离指定的语义,实现和它们的优化器就可以执行它们认为使代码运行所必需和适当的任何操作

希望这有帮助

例如,这里提到的示例是一种优化形式。类似的概念也存在于小的整数值和长数值


也许您可以在这里找到更多信息和解释。

通常,单线程场景很简单。多线程是恼人的,因为可以观察到一些优化,特别是内存读/写的重新排序。允许哪些重新排序取决于内存模型,但我不知道java标准指定了哪个内存模型“有效”优化@CodeInChaos-实际上,读/写的重新排序是一个明确指定规则的领域。@CodeInChaos:允许优化器进行不会改变程序单线程执行的所有优化,因此我们可以做很多。@Voo有趣。因此,Java的内存比.net中的内存要弱得多。是的。。。但是你能指出规范中的某个地方,它谈到了可观察的行为,并说什么是可观察的,什么是不可观察的吗?(我的直觉是,这就是所采取的方法……但我想得到一些明确的确认。)也许有。例如,对于编写幼稚基准测试的人来说,积极优化循环(甚至完全删除循环)是“可以观察到的”。如果您可以指出规范中明确表示此类优化“有效”的地方,那就太好了。(我认为它们应该是…)@Stephen C:优化可以很好地观察到(如果它们什么也不做的话,它们将毫无意义),但我很确定规范并没有说太多关于执行时间的事情。只要优化不改变规范指定的任何内容(执行速度是我希望不会改变的),它们就不会影响标准的遵从性。@Stephen C:规范对速度绝对不感兴趣,只要观察到的行为(即程序的结果)是正确的,一切都很好。此外,优化器可以执行任何不会改变单线程程序执行的操作,例如,观察循环变量只读不写,因此用while(true)替换循环,这将导致在另一个线程中设置变量的程序出现问题(显然,只有在变量不易失的情况下)