早期(编译期)优化

  相当多新生的java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖虚拟机的底层改进来支持,java中即时编译器地运行期的优化过程对于程序运行来说更重要,而前端编译器在编译期的优化过程对于程序编码来说关系更加密切。

Javac编译器

编译过程大致可以分为3个过程,分别是解析与填充符号表过程,插入式注解处理器的注解处理过程,分析与字节码生成过程。其步骤之间的关系与交互顺序如图所示:

解析与填充符号表

解析步骤包括词法分析和语法分析两个过程。词法分析是将源代码的字符流转变为标记(Token)集合;语法分析是根据Token序列构造抽象语法树的过程。

符号表是由一组符号地址和符号信息构成的表格。

语义分析与字节码生成

语义分析的主要任务是对结构上正确的源程序进行上下文有关性质的审查。语义分析过程分为标注检查以及数据及控制流分析两个步骤。标注检查步骤检查的内容包括变量使用前是否已被声明、变量与赋值之间的数据类型是否能够匹配等。数据及控制流分析是对程序上下文逻辑更进一步的验证,可检查出诸如程序局部变量是使用前是否有赋值、方法的每条路径是否都有返回值、是否所有的受查异常都被正确处理了等。编译时期的数据及控制流分析与类加载时的数据及控制流分析的目的基本上是一致的,但检验范围有所区别,有一些校验项只有在编译期或运行期才能进行的。

字节码生成是java编译过程的最后一个阶段。字节码生成阶段不仅仅是把前面各个步骤所生成的信息转化成字节码写到磁盘中,编译器还进行了少量的代码添加和转换工作。

Java语法糖

语法糖虽然不会提供实质性的功能改进,但是它们或能提高效率,或能提升语法的严谨性,或能减少编码出错的机会。

泛型与类型擦除,自动装箱、拆箱与遍历循环,条件编译。

时间: 2024-10-08 18:22:18

早期(编译期)优化的相关文章

深入了解JVM虚拟机8:Java的编译期优化与运行期优化

java编译期优化 微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.

Java编译期优化与运行期优化技术浅析

Java语言的“编译期”是一段不确定的过程,因为它可能指的是前端编译器把java文件转变成class字节码文件的过程,也可能指的是虚拟机后端运行期间编译器(JIT)把字节码转变成机器码的过程. 下面讨论的编译期优化指的是javac编译器将java文件转化为字节码的过程,而运行期间优化指的是JIT编译器所做的优化. 编译期优化 虚拟机设计团队把对性能的优化集中到了后端的即时编译器(JIT)中,这样可以让那些不是由javac编译器产生的class文件也同样能享受到编译器优化所带来的好处.但是java

Javac早期(编译期)

从Sun Javac的代码来看,编译过程大致可以分为3个过程: 解析与填充符号表过程. 插入式注解处理器的注解处理过程. 分析与字节码生成过程. Javac编译动作的入口是com.sun.tools.javac.main.JavaCompiler类,上述3个过程的代码逻辑集中在这个类的compile()和compile2()方法中,整个编译最关键的处理就由图中标注的8个方法来完成,下面我们具体看一下这8个方法实现了什么功能. 解析与填充符号表 解析步骤由上图中的parseFiles()方法(过程

constexpr:编译期与运行期之间的神秘关键字

Scott Meyers在effective modern c++中提到"If there were an award for the most confusing new word in C++11, constexpr would probably win it." 由此可见,constexpr确实是比较难以让人理解.加之其在C++11和14中的标准略有不同,也加剧了这种难度. 参考几本经典教材(C++ primer, effective modern C++, a tour of

JVM-程序编译与代码早期(编译期)优化

早期(编译期)优化 一.Javac编译器 1.Javac的源代码与调试 Javac的源代码放在JDK_SRC_HOME/langtools/src/shares/classes/com/sun/tools/javac中,除了JDK自身的API之外,就只引用了JDK_SRC_HOME/langtools/src/shares/classes/com/sun/*里面的代码,调试环境建立起来简单方便,因为基本上不需要处理依赖关系. 编译过程大致可以分成3个过程: (1)解析与填充符号表过程 (2)插入

深入理解java虚拟机-第十章-早期(编译期)优化

第10章  早期(编译期)优化 javac编译过程: 1.解析与填充符号表过程 词法.语法分析 将源代码的字条流转变为标记(Token)集合.如“int a = b + 2”这名代码包含了6个标记,分别是int a = b + 2 填充符号表 2.注解处理器 3.语义分析与字节码生成 标注检查 包括诸如变量使用前是否已被声明.变量与赋值之 间的数据类型是否能够匹配,还有一个重要的动作称为常量折叠 数据及控制流分析  对程序上下文逻辑更进一步的验证,它可以检查出诸如程序局部变量在使用前是否有赋值.

JVM总结(六):早期(编译期)优化

这节我们来总结一下JVM编译器优化问题. JVM编译器优化 Javac编译器 Javac的源码和调试 解析与填充符号表 注解处理器 语法分析与字节码生成 Java语法糖 泛型和类型擦除 自动装箱.拆箱与遍历循环 条件编译 JVM编译器优化 JVM的编译器可以分为三个编译器: 1.前端编译器:把.java转变为.class的过程.如Sun的Javac.Eclipse JDT中的增量式编译器(ECJ). 2.JIT编译器:把字节码转变为机器码的过程,如HotSpot VM的C1.C2编译器. 3.A

程序编译与代码优化 -- 早期(编译期)优化

1. 概述 Java编译器可能是指一个前端编译器(其实叫“编译器的前端”更准备一些),把*.java文件转变成*.class文件的过程:也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转变成机器码的过程:还可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)直接把*.java文件编译成本地机器代码的过程.例如: 前端编译器:Sun的javac,Eclipse JDT中的增量式编译器(ECJ): JIT编译器

转载:C++编译期多态与运行期多态

前言 今日的C++不再是个单纯的“带类的C”语言,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出 彩的那部分.在面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态:在泛型编程中,多态基于template(模 板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态.在本文中,我们将了解: 什么是运行期多态 什么是编译期多态 它们的优缺点在哪 回到顶部 运行期多态 运行期多态的设计思想要归结到