`
ravenex
  • 浏览: 11337 次
  • 性别: Icon_minigender_1
  • 来自: 体育仓库
社区版块
存档分类
最新评论

Java表达式的常量折叠

阅读更多
Java语言规范15.28规定了Java的常量表达式可以表示原始类型或者字符串;它们不但可以由纯粹的字面量构成,还可以包含能在编译时确定结果的运算,包括+、-、~、!、*、/、%、<<、>>、>>>、<、>、<=、>=、==、!=、&、|、^、&&、||、? :,还有指向上述类型的常量(final变量)的表达式。

所以下面的abc不会在运行时创建多个String,而是编译时就已经合并为一个String了。
public class JavaConstantExpression {
    public static void main(String[] args) {
        final long maxLong = Long.MAX_VALUE;
        // results in a single String constant
        String abc = "the integer " + (true ? maxLong : 0) + " is big";
    }
}

编译的.class文件:
Compiled from "JavaConstantExpression.java"
public class JavaConstantExpression extends java.lang.Object
  SourceFile: "JavaConstantExpression.java"
  minor version: 0
  major version: 50
  Constant pool:
const #1 = Method       #4.#13; //  java/lang/Object."<init>":()V
const #2 = String       #14;    //  the integer 9223372036854775807 is big
const #3 = class        #15;    //  JavaConstantExpression
const #4 = class        #16;    //  java/lang/Object
const #5 = Asciz        <init>;
const #6 = Asciz        ()V;
const #7 = Asciz        Code;
const #8 = Asciz        LineNumberTable;
const #9 = Asciz        main;
const #10 = Asciz       ([Ljava/lang/String;)V;
const #11 = Asciz       SourceFile;
const #12 = Asciz       JavaConstantExpression.java;
const #13 = NameAndType #5:#6;//  "<init>":()V
const #14 = Asciz       the integer 9223372036854775807 is big;
const #15 = Asciz       JavaConstantExpression;
const #16 = Asciz       java/lang/Object;

{
public JavaConstantExpression();
  Code:
   Stack=1, Locals=1, Args_size=1
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return
  LineNumberTable:
   line 1: 0


public static void main(java.lang.String[]);
  Code:
   Stack=1, Locals=4, Args_size=1
   0:   ldc     #2; //String the integer 9223372036854775807 is big
   2:   astore_3
   3:   return
  LineNumberTable:
   line 5: 0
   line 6: 3


}


而下面代码的比较也会相等:
public class StringConstant {
    public static void main(String[] args) {
        String a = "123" + "456";
        String b = "12" + 3456;
        System.out.println(a == b); // true
    }
}

即便混搭了字符串与数字的运算也没关系。
分享到:
评论

相关推荐

    java学习教程之常量折叠详解

    常量折叠的概念是指在编译期间,编译器会将一些表达式计算好,不需要在运行时进行计算。 常量折叠的发生条件是编译期常量之间进行运算。编译期常量是指编译的时候就可以确定其值的常量,包括字面量、编译期常量进行...

    新建文本文档.txt

    常量折叠(Constant Folding)是Java编译器优化的一种技术,主要用于在编译阶段计算表达式的值,如果该表达式的所有操作数都是已知的常量,则可以在编译时计算出结果,并将该结果替换到程序中,从而避免运行时进行...

    Java算术表达式计算类库 ExpressionJ.7z

    此外,ExpressionJ还提供了优化功能,例如常量折叠(constant folding)和表达式简化,这可以在一定程度上提高计算效率。但是,对于非常复杂的表达式,可能需要考虑其他的优化策略,比如预编译表达式或者使用更专业...

    山寨版的简易表达式解析器

    5. **优化**:在某些情况下,解析器可能包含对表达式的优化,例如常量折叠(预先计算已知结果的表达式)和死代码消除。 6. **性能**:解析速度和内存使用是衡量解析器性能的重要指标,尤其是当解析大量或复杂表达式...

    基于表达式的计算器ExprEvar

    - **优化**:可能需要对表达式进行优化,例如常量折叠、消去冗余计算等。 - **测试**:编写丰富的测试用例以验证计算器的正确性,包括边界条件和异常情况。 在实验文档中,你需要包含以下内容: - **需求分析**:...

    表达式解析器源代码(可以计算各种函数).zip

    3. **语义分析**:在语法树上执行类型检查,确保所有操作符与操作数匹配,同时进行常量折叠、求值优化等处理。 4. **代码生成**:对于解释器,这一步是直接执行;对于编译器,则会生成目标代码。在这个案例中,我们...

    java语言编写词法、语法、语义分析器

    这包括类型检查、作用域解析、常量折叠以及对上下文的其他理解。例如,Java的语义分析器会检查变量是否在使用前已被正确声明,操作数类型是否匹配运算符,以及方法调用的参数数量和类型是否正确。在Java中,类加载器...

    PL/0编译器(java实现)

    5. **代码优化**:在这个步骤,编译器可能会对中间代码进行各种优化,如删除冗余操作、常量折叠、死代码消除、循环展开等,以提高程序的运行效率。 6. **目标代码生成**:最后,中间代码被转换为目标机器语言,通常...

    java实现tiger语言编译器

    3. **语义分析**:这个阶段对AST进行检查,确保程序的正确性,如类型检查、作用域解析和常量折叠。此外,编译器还需要在此阶段生成中间代码,如三地址码,便于后续优化。 4. **代码生成**:最后,编译器将中间代码...

    15Java语法糖与Java编译器1

    常量折叠是指在编译阶段就计算出表达式的值,如常量的加减运算,这样在运行时就无需再次计算。死代码消除则是指删除那些在程序运行中不会被执行的代码,提高运行效率。 总的来说,Java语法糖如自动装箱和自动拆箱,...

    基于java实现的C语言编译器【100012136】

    - 在Java中,可以使用正则表达式或自定义的扫描器类来实现词法分析器。例如,可以创建一个`Token`类来存储每个记号的类型和值,然后通过遍历源代码字符串匹配不同的模式。 2. **语法分析**: - 语法分析器根据...

    JAVA编译器原代码

    5. **优化**:在生成字节码的过程中,编译器可能会进行一些优化,如删除无用的代码、常量折叠、局部变量合并等,以提高程序的运行效率。 6. **生成类文件**:最后,编译器将字节码写入到相应的.class文件中,每个类...

    java编译器

    4. **优化**:为了提高程序的运行效率,编译器可能还会进行一些优化,比如删除无用代码、常量折叠、方法内联等。 5. **错误和警告报告**:如果源代码存在错误或潜在问题,编译器会向开发者报告错误信息和警告,帮助...

    编译原理课程设计 java实现编译器

    这包括类型检查、常量折叠、作用域管理等。在这个阶段,编译器会检查变量是否已声明,类型是否匹配,并进行必要的类型转换。Java中的类和接口可以用来表示语言的类型系统,帮助实现语义分析。 四、目标代码生成 ...

    设计实现一个编译器(java)

    优化阶段旨在提高生成代码的效率,可能包括删除冗余计算、常量折叠、循环展开等。Java的编译器Javac就包含了一些基本的优化。 6. **目标代码生成**: 最后,编译器将中间代码转换为特定机器架构的目标代码,通常...

    多项式表达式编译器下载

    高级编译器可能会包含优化步骤,比如常量折叠(提前计算常数表达式的结果)、消元(简化冗余计算)和代码布局改进,以提高计算效率。 8. **用户界面**: 对于用户友好性,"ExpressionCalculate"可能提供了图形...

    编译原理编译器Java实现设计报告

    这一阶段还需要考虑优化,如死代码消除、循环展开和常量折叠等,以提升程序的运行效率。 在实际项目中,为了调试和测试编译器,会创建一系列测试用例,包括各种正常情况和边界情况。这些测试用例可以帮助验证编译器...

    现代编译原理java版

    优化阶段旨在改进代码的效率,如删除冗余计算、进行常量折叠等。最后,代码生成将优化后的抽象语法树转换为目标机器的指令。 在Java环境下,编译原理的应用尤为重要,因为Java是一种跨平台的编译型语言。JVM(Java...

    语义分析实验(java版)

    这包括类型检查、常量折叠、作用域解析等任务。在Java中,这通常涉及到类、对象、方法的调用,以及数据类型的匹配。 实验中提到的“递归下降语法制导翻译法”是一种常用的语义分析方法。递归下降分析基于语法的递归...

    编译原理java版

    这包括类型检查、常量折叠和作用域分析等。在Java中,类型系统严格,语义分析尤为重要。 4. **中间代码生成**:编译器通常会生成一种高级的中间表示(如三地址码或抽象语法树),以便进行优化和目标代码生成。这种...

Global site tag (gtag.js) - Google Analytics