JVM-1.编译
1、添加默认的无参构造器(在没有指定任何有参构造器的情况下)【《JVM》中,在语法分析器和注解处理之前,有一步填充符号表,其中的操作包括添加默认的无参构造器】 2、处理注解:JDK1.6以后,开始提供插入式注解处理器的API,可以理解为编译器的插件;如果注解处理器修改了语法树,编译器将循环进行(解析+填充+注解处理);通过注解处理器,程序员可以干预编译过程。 3、标注:检查语义合法性、进行逻辑判断 •检查语法树中的变量类型是否匹配(eg.String s = 1 + 2;//这样"="两端的类型就不匹配) •检查变量、方法或者类的访问是否合法(eg.一个类无法访问另一个类的private方法) •变量在使用前是否已经声明、是否初始化 •常量折叠(eg.代码中:String s = "hello" + "world",语义分析后String s = "helloworld") •推导泛型方法的参数类型 4、数据及控制流分析【编译时分析与类加载时分析,目的类似,但校验范围有一些区别。如局部变量在内存中没有flag,对final的校验只能在编译阶段进行】 •局部变量使用前是否有赋值【《JavaWeb》认为属于上一步,《JVM》认为属于本步】 •变量的确定性赋值(eg.有返回值的方法必须确定有返回值) •final变量只能赋一次值,在编译的时候再赋值的话会报错 •所有的检查型异常是否抛出或捕获 •所有的语句都要被执行到(return后边的语句就不会被执行到,除了finally块儿) 5、进一步语义分析 •去掉永假代码(eg.if(false)) •变量自动转换(eg.int和Integer) •去掉语法糖(eg.foreach转化为for循环,assert转化为if,内部类解析成一个与外部类相关联的外部类) 6、最后,将经过上述处理的语法树转化为最后的注解语法树
package compile;
/**
* 词法
*/
public class Cifa {
int a;
int c = a + 1;
}

package compile;
public class Yufa {
int a;
private int c = a + 1;
public int getC() {
return c;
}
public void setC(int c) {
this.c = c;
}
}

public void method(List<Integer> list){}public void method(List<String> list){}public static void main(String[] args) {
if(true){
System.out.println("True");
}else{
System.out.println("False");
}
}
编译后:
public static void main(String args[])
{
System.out.println("True");
}
JVM-1.编译的更多相关文章
- [四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式
前言简介 前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明 想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是 ...
- 深入理解JVM(一)编译openJDK
此文总结的很不错:https://www.cnblogs.com/ACFLOOD/p/5528035.html 准备openJDK源码和环境 1.在linux和macOS上编译openJDK更加友好, ...
- JVM笔记——编译期的优化
一.编译过程 解析和填充符号表的过程 插入注解处理器的注解处理过程 语义分析与字节码生成过程 二.解析和填充符号表 解析包含两个过程:词法分析和语法分析 (一)词法分析 将源代码的字符流转变成标记(T ...
- JVM即时编译(JIT)
Java解释执行过程: 代码装入-代码校验-代码执行 Java字节码的执行方式分为两种:即使编译方式和解释执行方式.即时编译是值解释器先将字节码编译成机器码,然后执行该机器码.解释执行的方式是指解释器 ...
- JVM学习——编译OpenJDK
最近在学习<深入理解java虚拟机 第二版>这本书.书中第一部分建议大家自己编译OpenJDK.抱着学习态度也来编译个玩一玩.下面进入正题. 1.编译环境介绍 操作系统 CentOS Li ...
- jvm——分层编译
https://www.cnblogs.com/andy-zhou/p/5327288.html 分层编译根据编译器编译.优化的规模与耗时,划分出不同的编译层次: 第0层:程序解释执行,解释器不开启监 ...
- java 常量 jvm在编译期能确定常量的 所以相等 但不能确定变量的范围 所以变量相加会产生新的
- 走进JVM之一 自己编译openjdk源码
想要深入了解JVM,就必须了解其实现机制.了解JVM实现的最好方法便是自己动手编译JDK.好了,让我们开始吧! 1. 准备工作 获取OpenJDK源码 本次编译选择的是OpenJDK7u,官方源码包 ...
- 🏆【JVM技术专区】「编译技术专题」带你彻底认识Java的编译技术
前提概要 Java的class字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令.这个过程是Java虚拟机做的,这个过程也叫编译.是更深层次的编译. 在编译原理中,把源代码翻译成机 ...
- JVM 的 工作原理,层次结构 以及 GC工作原理
JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM实现了Java语言最重要的特征:即平台无关性.原理:编译后的 ...
随机推荐
- juery悬浮框
现在的淘宝啊,京东啊等很多平台都用到了一个技术,就是当页面下拉时,某个div会一直悬浮在页面顶端.具体代码如下<p>jQuery实现页面滚动时层智能浮动定位</p><!D ...
- nginx源码分析——http模块
源码:nginx 1.12.0 一.nginx http模块简介 由于nginx的性能优势,现在已经有越来越多的单位.个人采用nginx或者openresty. ...
- Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)
1 概念定义 1.1 定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2 类型 创建类模式 2 原理特征 2.1 类 ...
- Linux如何配置bond
Q:什么是BOND? A: 将多块网卡虚拟成为一块网卡的技术,通过bond技术让多块网卡看起来是一个单独的以太网接口设备并具有相同的ip地址. Q:为什么要配置bond? A: 在linux下配 ...
- Spring数据库访问
一般采用第三方具有连接缓冲池的数据源实现类:spring支持最常见的两个具有连接缓冲池的数据源为:DBCP和C3P0; DBCP(Database connection pool) 是Apache的一 ...
- bootstrap快速入门笔记(二)-栅格系统,响应式类
一,栅格系统大致有以下: 1,行row必须包含在 .container (固定宽度)或 .container-fluid (100% 宽度)中,一行有12列 2.“列(column)”在水平方向创建一 ...
- 直方图均衡化CImg实现
这篇博客是关于试用CImg库来实现灰度图和彩色图的直方图均衡化操作.感觉效果还不错,除了彩色图在均衡化时会有一定的色彩失真. C++代码实现: // // hEqualization.hpp // 直 ...
- 关于WordPress搬家方法步骤的整理
最近准备更换自己的博客服务器,所以需要将原来服务器上的所有东西都搬到新的服务器.为了数据的安全,在网上找了很多的资料.现在整理一下整个搬家过程的操作步骤.下面进入正题: 1.测试环境这次我使用的示例服 ...
- SQL SERVER大话存储结构(2)_非聚集索引如何查找到行记录
如果转载,请注明博文来源: www.cnblogs.com/xinysu/ ,版权归 博客园 苏家小萝卜 所有.望各位支持! 1 行记录如何存储 这里引入两个 ...
- redis单机主从搭建
tar zxvf redis-2.8.13.tar.gz cd redis-2.8.13 make 1.安装主库 mkdir /opt/redis/sbin -p mkdir /opt/redi ...