编译期:是指把源码交给编译器编译成计算机可以执行的文件的过程。在Java中也就是把Java代码编成class文件的过程.编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作,比如检查错误。
运行期:是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来,在Java中把磁盘中的代码放到内存中就是类加载过程,类加载是运行期的开始部分。
编译期分配内存并不是说在编译期就把程序所需要的空间在内存中分配好,而是说在编译期生成的代码中产生一些指令,在运行代码时通过这些指令把程序所需的内存分配好。只不过在编译期的时候就知道分配的大小,并且知道这些内存的位置。而运行期分配内存是指只有在运行期才确定内存的大小、存放的位置。
Java中的绑定:绑定指的是把一个方法的调用与方法所在的类(方法主体)关联起来(这个方法被哪个类调用)。对Java来说,分为静态绑定和动态绑定。
(1) 静态调用:在程序执行前方法已经被绑定,也就是在编译期方法明确知道被哪个类调用。java当中的方法只有final,static,private和构造方法是前期绑定的。
(2) 动态调用:在运行时根据具体对象的类型进行绑定(只有运行时才知道方法被哪个类调用)。在java中,几乎所有的方法都是后期绑定的。
一、编译期
举个例子,当我们作为开发人员,在电脑上拼死拼活写了一个版本的代码,然后将代码提交到git上去,当我们用jekins或其他工具将代码从git上clone下来,使用mvn package,或者mvn intall打包的过程就叫编译期。是指将java代码编译为机器识别的字节码文件的过程。
在编译期,将java代码翻译为字节码文件的过程经过了四个步骤,词法分析,语法分析,语义分析,代码生成四个步骤。
1. 词法分析
词法分析是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符,将它们组成词素,生成并输出一个词法单元序列,这个词法单元序列被输出到语法分析器进行语法分析。
2. 语法分析
语法分析程序从扫描程序中获取记号形式的源代码,并完成定义程序结构的语法分析 (syntax analysis ),这与自然语言中句子的语法分析类似。语法分析定义了程序的结构元素及其关系。通常将语法分析的结果表示为语法树。
3. 语义分析
程序的语义就是它的“意思”,它与语法或结构不同。程序的语义确定程序的运行,但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示和由分析程序分析的特征。这些特征被称作静态语义(static semantic),而语义分析程序的任务就是分析这样的语义,语义具有只有在程序执行时才能确定的特性,由于编译器不能执行程序,所以它不能由编译器来确定)。一般的程序设计语言的典型静态语义包括声明和类型检查。由语义分析程序计算的额外信息,它们通常是作为注释或“装 饰”增加到树中(还可将属性添加到符号表中)。
4. 代码生成
代码生成器得到中间代码,并生成目标代码。
二、运行期
从jvm加载字节码文件,到使用到最后的卸载过程,都是属于运行期的范畴。
1. 加载
将类的.class文件中的二进制数据读到内存中,将其放在运时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
加载.class文件的方式:
从本地系统上直接加载。
通过网络下载.class文件。
从zip,jar等归档文件中加载.class文件。
将java源文件动态编译为.class文件
2. 验证
类文件的结构检查 确保类文件总符合ava类文件的固定格式
语义检查 确保类本身符合java语言的语法规定
字节码验证 确保字节码流可以被java虚拟机安全的执行。(静态方法,实例对象)
二进制兼容性的验证 引用类之间协调一致。
3. 准备
java虚拟机对类的静态变量分配内存,并设置初始值。如static int此时为0.
4. 初始化
java虚拟机执行类的初始化语句,为类的静态变量赋予初始值。
两种初始化方法:
在静态变量的声明处进行初始化。
在静态代码块中进行初始化。
5. 使用
程序运行过程。
6. 卸载
垃圾回收机制相关。对无引用的对象进行回收。
深入分析Java的编译期与运行期
不知大家有没有思考过,当我们使用IDE写了一个Demo类,并执行main函数打印 hello world时都经历了哪些流程么? 想通过这篇文章来分析分析Java的执行流程,或者换句话说想聊聊Java的 ...
c++ 编译期与运行期
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 转自:http://h ...
constexpr:编译期与运行期之间的神秘关键字
Scott Meyers在effective modern c++中提到“If there were an award for the most confusing new word in C++11 ...
c++ 之 编译期多态&;运行期多态
编译时多态:程序运行前发生的事件 —— 函数重载.运算符重载 .模板 ——静态绑定 运行时多态:程序运行时发生的事件 —— 虚函数机制——动态绑定 template
深入理解Java虚拟机读书笔记7----晚期(运行期)优化
七 晚期(运行期)优化 1 即时编译器(JIT编译器) ---当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”,包括被多次调用的方法和被多次执行的循环体. ...
java编译期优化
java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程: 1.前端编译:把.java文件转变为.class文件 2.后端编译:把字节码转变为机器码 3.静态提前编译:直接把*.ja ...
深入理解JAVA虚拟机 晚期(运行期)优化(转载)