一、编译过程

  1. 解析和填充符号表的过程
  2. 插入注解处理器的注解处理过程
  3. 语义分析与字节码生成过程

二、解析和填充符号表

解析包含两个过程:词法分析和语法分析

(一)词法分析

将源代码的字符流转变成标记(Token)集合,如 int aaa = bbb + 2,会被分解成6个标记,[int,aaa,=,bbb,+,2]

(二)语法分析

根据Token序列来构造抽象语法树的过程。完成解析之后,下一步是填充符号表

(三)符号表

由一组符号地址和符号信息构成的表格。
符号表登记的内容将用于语义检查和产生中间码
目标代码生成阶段,对符号名进行地址分配时,符号表是地址分配的根据
 

三、插入式注解处理器的注解处理过程

 
插入式注解处理器可以看作一组编译器的插件,在这些插件里面,可以读取、修改、添加抽象语法树中的任意元素。如果这些插件对语法树做了修改,编译器就会回到 “解析和填充符号表”过程,重新处理,直到所有插入式注解处理器都没有再对语法树进行修改为之。
 

四、语义分析和字节码生成过程

经过上述两个步骤之后,编译器获得了语法树,然而语法树能表示正确的源程序的抽象,但无法保证源程序是否符合逻辑,这里就需要语义分析来对 结构上正确的源程序进行上下文有关性质的检查。
 
        int a = 1;
        boolean b = false;
        char c = 2;
        //构成正确的语法树,语义上没问题
        int d = a + c;
        //构成正确的语法树,语义上不合逻辑,无法编译
        int  e = b + c;

(一)语义分析

分为三个部分:标注检查、数据及控制流分析、解语法糖
 
  • 标注检查:检查变量使用前是否已声明,变量与赋值之间的数据类型是否能够匹配,常量折叠(int a = 1 + 2;折叠之后字面量为3)
  • 数据及控制流分析:对程序上下文逻辑的检验,局部变量使用前是否赋值,方法的每条路径是否都有返回值,异常是否被正确处理等
  • 解语法糖:将语法糖还原成基础的数据结构

(二)字节码生成

javac编译的最后一个阶段,将之前各个步骤生成的信息(语法树、符号表)转化成字节码写到磁盘中
 
 
 
 

参考

[1] 《 深入理解JVM-->程序编译与代码优化部分》  http://blog.sina.com.cn/s/blog_6c9670bb0102v78a.html
[2] 《 Java编译期优化与运行期优化技术浅析》  http://blog.csdn.net/kobejayandy/article/details/39620221
[3] 《深入理解Java虚拟机 JVM高级特性与最佳实践》 周志明
 
 

JVM笔记——编译期的优化的更多相关文章

  1. 深入理解Java虚拟机读书笔记6----早期(编译期)优化

    六 早期(编译期)优化   1 “编译期”的含义     · 可能是指一个前端编译器把*.java文件转变成*.class文件的过程,前端编译器如:Sun的Javac.Eclipse JDT中的增量式 ...

  2. 深入理解JVM - 早期(编译期)优化

    Java“编译期”是一段“不确定”的操作过程:可能是指一个前端编译器(编译器的前端)把*.java文件转变为*.class文件的过程:可能是指虚拟机的后端运行期编译器(JIT编译器,Just In T ...

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

    早期(编译期)优化 一.Javac编译器 1.Javac的源代码与调试 Javac的源代码放在JDK_SRC_HOME/langtools/src/shares/classes/com/sun/too ...

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

    第10章  早期(编译期)优化 javac编译过程: 1.解析与填充符号表过程 词法.语法分析 将源代码的字条流转变为标记(Token)集合.如“int a = b + 2”这名代码包含了6个标记,分 ...

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

    这节我们来总结一下JVM编译器优化问题. JVM编译器优化 Javac编译器 Javac的源码和调试 解析与填充符号表 注解处理器 语法分析与字节码生成 Java语法糖 泛型和类型擦除 自动装箱.拆箱 ...

  6. 《深入理解 Java 虚拟机》读书笔记:早期(编译期)优化

    正文 Java 语言的 3 类编译器: 前端编译器:把 java 文件 转变成 class 文件.例如:Sun 的 Javac. JIT 编译器(即时编译器):后端运行期编译器,把字节码转变成机器码. ...

  7. java 常量 jvm在编译期能确定常量的 所以相等 但不能确定变量的范围 所以变量相加会产生新的

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

    java编译期优化 java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程:1.前端编译:把.java文件转变为.class文件2.后端编译:把字节码转变为机器码3.静态提前编译: ...

  9. 《深入理解Java虚拟机》-----第10章 程序编译与代码优化-早期(编译期)优化

    概述 Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是指虚拟机的后端运 ...

随机推荐

  1. [uboot] (番外篇)uboot之fdt介绍

    http://blog.csdn.net/ooonebook/article/details/53206623 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...

  2. LVS、Nginx 及 HAProxy 工作原理

    当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web 应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器 ...

  3. 配置微信jssdk自定义分享

    前段时间做这个功能的时候遇到这个问题,之前的话是微信自动抓取界面第一张图,现在微信更新api,必须自行配置,接入jssdk,才能实现该功能. 详细可以查看微信的jssdk文档 微信官方开发者文档    ...

  4. USART of STM32

    /*************************************************************************** * 文件名:USART.h * * 编写人:离 ...

  5. windows10环境下安装Tensorflow

    1.什么是tensorflow TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着 ...

  6. PMP:3.项目经理角色

    成员角色:整合指挥者 在团队中的职责:负终责 知识技能:综合技能&沟通   定义: 职能经理专注于对某个职能领域或业务部门的管理监督. 运营经理负责保证业务运营的高效性. 项目经理是由执行组织 ...

  7. .NET Core微服务之路:基于gRPC服务发现与服务治理的方案

    重温最少化集群搭建,我相信很多朋友都已经搭建出来,基于Watch机制也实现了出来,相信也有很多朋友有了自己的实现思路,但是,很多朋友有个疑问,我API和服务分离好了,怎么通过服务中心进行发现呢,这个过 ...

  8. MyBatis 源码分析 - 插件机制

    1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...

  9. 不需要 root 权限的 ping

    https://blog.lilydjwg.me/2013/10/29/non-privileged-icmp-ping.41390.html https://stackoverflow.com/qu ...

  10. Android 框架式编程 —— 起篇

    一般的,在开发的时候,写过的代码在需求变更后,发现需要改动非常多的地方,那么说明之前的代码的架构肯定是存在问题的. 下面我们结合面向对象的六大基本原则谈Android 框架式编程.首先先介绍一下面向对 ...