gpt4 book ai didi

javac 代码消除功能

转载 作者:太空宇宙 更新时间:2023-11-04 12:22:46 25 4
gpt4 key购买 nike

我很难找到有关 javac 代码消除功能的信息:

我读到,如果您有类似以下内容,则 if 语句将被消除:

static final boolean DEBUG = false;

if (DEBUG) System.out.println("Hello World!"); // will be removed

但是这个怎么样,例如:

static final int VALUE = 3;

if (VALUE > 9) System.out.println("VALUE > 9 ???"); // will this be removed?

或者这个:

static final SomeEnum VALUE = SomeEnum.FOO;

if (VALUE==SomeEnum.BAR) System.out.println("Bar???"); // will this be removed?

由于分析程序以找到所有死代码非常困难/不可能(可能类似于停止问题),因此我认为只有少数定义良好的构造(如上面的第一个示例),javac 会可靠地识别和删除它们。有这些结构的完整列表吗?

最佳答案

assylias 似乎找到了答案(让我把它们放在一起):

Chapter "14.21. Unreachable Statements" of the JLS指定,一般来说,代码中任何无法访问的语句都被视为编译时错误,唯一的异常(exception)是对 if 语句的特殊处理,以专门允许条件编译。

因此,可能导致代码消除的唯一构造(如果编译器选择这样做!)是:

if (compileTimeConstantExpression) {
doThis(); // may be removed if compileTimeConstantExpression == false;
} else {
doThat(); // may be removed if compileTimeConstantExpression == true;
}

(当然,else部分是可选的)

所有其他允许消除代码的构造(例如 while (false) ...)都是不允许的,它们会导致编译时错误,而不是导致条件编译。

可接受的 compileTimeConstantExpression 的定义可以在 chapter "15.28. Constant Expressions" of the JLS 中找到。 。可以在这里找到另一个包含更多示例的精彩页面:Compile Time Constants in Java

注意:编译器不需要删除 if 语句中的“无法访问”部分。 javac 似乎可以可靠地执行此操作,但其他编译器可能不会。唯一确定的方法是通过反编译检查输出,例如按照 Jon Skeet 的建议使用 javap -c

关于javac 代码消除功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38662200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com