java 程序编译和运行过程详解

Java程序从源文件创建到程序运行要经过两大步骤:

  1. 源文件由编译器编译成字节码(ByteCode); 
  2. 字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言( "semi-interpreted" language)

java 程序编译和运行过程详解

1. 编译

创建完源文件之后,程序先要被JVM中的java编译器进行编译为.class文件。java编译一个类时,如果这个类所依赖的类还没有被编译,编译器会自动的先编译这个所依赖的类,然后引用。如果java编译器在指定的目录下找不到该类所依赖的类的 .class文件或者 .java源文件,就会报"Cant found sysbol"的异常错误。

编译后的字节码文件格式主要分为两部分:常量池和方法字节码。常量池记录的是代码出现过的(常量、类名、成员变量等)以及符号引用(类引用、方法引用,成员变量引用等);方法字节码中放的是各个方法的字节码。

在编译期,将java代码翻译为字节码文件的过程经过了四个步骤,词法分析语法分析语义分析代码生成四个步骤。

java 程序编译和运行过程详解

  • 词法分析

    • 词法分析是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符,将它们组成词素,生成并输出一个词法单元序列,这个词法单元序列被输出到语法分析器进行语法分析。
  • 语法分析

    • 语法分析程序从扫描程序中获取记号形式的源代码,并完成定义程序结构的语法分析 (syntax analysis ),这与自然语言中句子的语法分析类似。语法分析定义了程序的结构元素及其关系。通常将语法分析的结果表示为语法树。
  • 语义分析

    • 程序的语义就是它的“意思”,它与语法或结构不同。程序的语义确定程序的运行,但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示和由分析程序分析的特征。这些特征被称作静态语义(static semantic),而语义分析程序的任务就是分析这样的语义,语义具有只有在程序执行时才能确定的特性,由于编译器不能执行程序,所以它不能由编译器来确定)。一般的程序设计语言的典型静态语义包括声明和类型检查。由语义分析程序计算的额外信息,它们通常是作为注释或“装 饰”增加到树中(还可将属性添加到符号表中)。
  • 代码生成

    • 代码生成器得到中间代码,并生成目标代码。

这就是整个编译期要做的事情。

2. 运行

java类运行的过程大概分为两个步骤:(1)类的加载 (2)类的执行。

需要说明的一点的是:JVM主要在程序第一次运行时主动使用类的时候,才会立即去加载。换言之,JVM并不是在运行时就会把所有使用到的类都加载到内存中,而是用到,不得不加载的时候,才加载进来,而且只加载一次!

https://blog.csdn.net/super_YC/article/details/71439786

程序的运行过程就是运行期。

java 程序编译和运行过程详解