Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java for循环在编译的类文件中转换为do while循环_Java_Class_Compiled - Fatal编程技术网

Java for循环在编译的类文件中转换为do while循环

Java for循环在编译的类文件中转换为do while循环,java,class,compiled,Java,Class,Compiled,在我的团队中,我们使用的是Java1.4.2,大多数机器for循环都是编译为only.ie。如果我反编译类文件,我只能看到for循环,但某些开发人员的某些机器会变成do-while循环。当我反编译某些类时,它就变成了dowhile 怎么会这样?任何可能的原因,java版本或配置,任何人都能想到,因此我可以重现此缺陷,并在所有开发人员的机器上修复它这可能是由编译器的优化设置引起的。检查不同机器上的优化设置。尝试禁用所有优化或等于优化级别。这可能是由编译器的优化设置引起的。检查不同机器上的优化设置。

在我的团队中,我们使用的是Java1.4.2,大多数机器for循环都是编译为only.ie。如果我反编译类文件,我只能看到for循环,但某些开发人员的某些机器会变成do-while循环。当我反编译某些类时,它就变成了dowhile


怎么会这样?任何可能的原因,java版本或配置,任何人都能想到,因此我可以重现此缺陷,并在所有开发人员的机器上修复它

这可能是由编译器的优化设置引起的。检查不同机器上的优化设置。尝试禁用所有优化或等于优化级别。

这可能是由编译器的优化设置引起的。检查不同机器上的优化设置。尝试禁用所有优化或与优化级别相同。

我不认为这是缺陷。当您将Java编译成字节码时,会丢失一些信息。当您随后对字节码进行反编译时,无法保证生成的Java源代码将与您开始使用的代码紧密匹配

特别是,字节码语言没有针对不同类型循环的特定指令。Java循环被编译成使用比较指令和跳转的字节码。在决定使用哪种类型的循环来生成给定的字节码时,反编译器必须做出有根据的猜测


不同机器之间的行为差异可能与这些机器上安装的编译器和反编译器的确切版本不同有关,也可能与这些工具的配置方式有关。

我不认为这是缺陷。当您将Java编译成字节码时,会丢失一些信息。当您随后对字节码进行反编译时,无法保证生成的Java源代码将与您开始使用的代码紧密匹配

特别是,字节码语言没有针对不同类型循环的特定指令。Java循环被编译成使用比较指令和跳转的字节码。在决定使用哪种类型的循环来生成给定的字节码时,反编译器必须做出有根据的猜测


不同机器之间的行为差异可能与这些机器上安装的编译器和反编译器的确切版本不同有关,或者可能与这些工具的配置方式有关。

在字节码中,没有循环,只有条件和无条件跳转,即GOTO。因此,反编译器尽最大努力重建基于跳跃结构的循环

在字节码中,没有循环,只有条件和无条件跳转,也就是gotos。因此,反编译器尽最大努力重建基于跳跃结构的循环

while和for的代码是可交换的,无法从字节码判断使用了哪一个。您可以推断出它。您无法从字节码复制注释,也无法可靠地分辨for和while循环之间的差异

e、 g

都是相同的。

while和for的代码是可交换的,无法从字节码中分辨出使用了哪一个。您可以推断,您无法从字节码中复制注释,也无法可靠地分辨for和while循环之间的差异

e、 g


编译器优化永远不会改变代码的实际功能

即使不同的编译器对您的代码进行了不同的优化,程序的语义也永远不会有任何差异:用户总是会得到相同的结果


这不是一个需要修复的bug。没有解决办法。没有bug。

编译器优化永远不会改变代码的实际功能

即使不同的编译器对您的代码进行了不同的优化,程序的语义也永远不会有任何差异:用户总是会得到相同的结果


这不是一个需要修复的bug。没有解决办法。没有错误。

编译器将执行优化。为什么这很重要?您当前的for循环代码是什么?正如Oli所说,它进行了优化。1.4.2?2为什么需要反编译自己的代码?也许这取决于一些编译器优化,但我应该首先考虑编译器版本,然后考虑我为什么需要反编译,第三是关于for->do while的事情……反编译器并不总是正确地猜测转换为条件前跳/无条件后跳的事情是什么。这一点都不重要。@user1228785:如果您提供了源代码,那么只需比较源代码即可。如果你想知道二进制文件是否不同,那么使用md5sum或其他什么。编译器将执行优化。为什么这很重要?您当前的for循环代码是什么?正如Oli所说,它进行了优化。1.4.2?2 w

你为什么需要反编译你自己的代码?也许这取决于一些编译器优化,但我应该首先考虑编译器版本,然后考虑我为什么需要反编译,第三是关于for->do while的事情……反编译器并不总是正确地猜测转换为条件前跳/无条件后跳的事情是什么。这一点都不重要。@user1228785:如果您提供了源代码,那么只需比较源代码即可。如果你想知道二进制是否不同,那么就使用md5sum之类的。既然javac什么时候提供任何类型的优化设置?那么-xx-UseLoopPredicate参数代表什么呢?这是一个热点选项,与将源文件编译成java字节码无关,但是JIT是如何处理字节码的呢?你能给我推荐一些url吗?这样我就可以了解编译器的优化了settings@user1228785:我想说清楚,这些是JVM选项,与将Java编译成字节码或将Java编译成字节码无关。既然javac什么时候提供任何类型的优化设置?那么-xx-UseLoopPredicate参数代表什么?这是一个热点选项,与将源文件编译成Java字节码无关,但是JIT是如何处理字节码的呢?你能给我推荐一些url吗?这样我就可以了解编译器的优化了settings@user1228785:需要明确的是,这些是JVM选项,与将Java编译为字节码或字节码无关。反编译器版本相同。这就是我想知道的,如果有人知道编译器的不同或编译器的配置会导致这样的情况,那么我可以修复它。因为我们有40多人的团队developers@user1228785:如果我站在你的立场,我会仔细看看你商店的版本控制实践。有一个依赖于查看反编译字节码的开发过程听起来相当不确定。这需要在旧版本中完成。该产品在最近10年以上运行的编译器版本是相同的。这就是我想知道的,如果有人知道编译器的不同或编译器的配置会导致这样的情况,那么我可以修复它。因为我们有40多人的团队developers@user1228785:如果我站在你的立场,我会仔细看看你商店的版本控制实践。有一个依赖于查看反编译字节码的开发过程听起来相当不确定。这需要为产品在过去10年以上运行的旧版本完成
while(condition)
for(;condition;)
while(true) {
   if(!condition) break;

}