Java 编译器如何处理选择语句的变化
以下三种方法在功能上都是相同的,但我认为它们都有风格上的差异。编译这些文件时,编译器是否会对它们进行不同的处理?(我缺乏检查和理解反编译字节码的诀窍)Java 编译器如何处理选择语句的变化,java,compiler-construction,jvm,javac,bytecode,Java,Compiler Construction,Jvm,Javac,Bytecode,以下三种方法在功能上都是相同的,但我认为它们都有风格上的差异。编译这些文件时,编译器是否会对它们进行不同的处理?(我缺乏检查和理解反编译字节码的诀窍) //方法1 私有布尔值isAcceptableRange(final int a,final int b){ if((Math.abs(a-b))我也没有看过字节码。但根据我对编译器技术的一般知识:if(condition){then part}else{else part}生成的代码基本上类似于: if (!condition) branch
//方法1
私有布尔值isAcceptableRange(final int a,final int b){
if((Math.abs(a-b))我也没有看过字节码。但根据我对编译器技术的一般知识:if(condition){then part}else{else part}
生成的代码基本上类似于:
if (!condition) branch to Label_1;
perform then-part;
branch to Label_2;
Label_1:
perform else-part;
Label_2:
在您的示例#1中,“then part”是一个return
语句。而return
语句的代码可能是return
指令,或者是一个分支
到子程序代码末尾执行清理的某个点(包括任何最终生效的)然后返回。一个好的编译器不会在另一个无条件分支或return
指令之后生成分支(或任何其他代码),因为该代码永远无法执行。因此示例1最终看起来像
if (!condition) branch to Label_1;
set return value to "true";
return or branch to cleanup code;
Label_1:
set return value to "false";
return or branch to cleanup code;
这与示例2或示例3生成的代码完全相同
因此,您的问题的答案是:不,编译器不会以不同的方式处理您的任何示例,除非它是一个非常糟糕的编译器。我也没有看过字节码。但是根据我对编译器技术的一般知识:if(condition){then part}else{else part}
生成的代码基本上如下所示:
if (!condition) branch to Label_1;
perform then-part;
branch to Label_2;
Label_1:
perform else-part;
Label_2:
在您的示例#1中,“then part”是一个return
语句。而return
语句的代码可能是return
指令,或者是一个分支
到子程序代码末尾执行清理的某个点(包括任何最终生效的)然后返回。一个好的编译器不会在另一个无条件分支或return
指令之后生成分支(或任何其他代码),因为该代码永远无法执行。因此示例1最终看起来像
if (!condition) branch to Label_1;
set return value to "true";
return or branch to cleanup code;
Label_1:
set return value to "false";
return or branch to cleanup code;
这与示例2或示例3生成的代码完全相同
因此,您的问题的答案是:不,编译器不会以不同的方式处理任何示例,除非它是一个非常糟糕的编译器
或者编译器是否知道最终结果并将其“优化”掉
是的。让我们看看产生的字节码:
javap -c -private MyClass.class
javap
:是一种工具,它(除其他外)可以让您查看java类的字节码,它与JDK一起提供
-c
:将代码反汇编为字节码
-private
:显示类中的私有成员和方法
MyClass.class
:编译后的类
我调用了方法isAcceptableRange1
,isAcceptableRange2
,isAcceptableRange3
。正如您所看到的,所有方法都有完全相同的字节码
或者编译器是否知道最终结果并将其“优化”掉
是的。让我们看看产生的字节码:
javap -c -private MyClass.class
javap
:是一种工具,它(除其他外)可以让您查看java类的字节码,它与JDK一起提供
-c
:将代码反汇编为字节码
-private
:显示类中的私有成员和方法
MyClass.class
:编译后的类
我调用了方法isAcceptableRange1
,isAcceptableRange2
,isAcceptableRange3
。正如您所看到的,所有方法都有完全相同的字节码。您可以使用javap-c
查看字节码。我仍然建议使用return(Math.abs(a-b))您可以使用javap-c
查看字节码。我仍然建议使用return(Math.abs(a-b))