前端编译

前端编译的主要作用,是将 我们编写的 .java 文件 编译成 .class 文件,也就是我们常说的 字节码 文件。

字节码 文件,里面包含了我们编写的 .java 代码中的运行逻辑,参数 以及 这些参数在内存中的分配。

前端编译过程

  • 解析与填充符号表
  • 注解处理
  • 分析与字节码生成

总而言之,就是对 .java 文件进行语法分析,根据 .java 文件构建抽象语法树。

前端编译结果

package methodArea;

public class MethodTest {
    public static void main(String[] args) {
        String s = "Hello World";
        System.out.println(s);
    }
}

写一个 .java 文件,经过编译后生成了 .class 文件,对 .class 文件进行一个程度翻译,可以得到

Classfile /Users/xiaotudui/IdeaProjects/Java-JVM/src/main/java/methodArea/MethodTest.class
  Last modified 2020-6-24; size 442 bytes
  MD5 checksum 95076f11704cae80a07e6c5a22be321b
  Compiled from "MethodTest.java"
public class methodArea.MethodTest
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#15         // java/lang/Object."<init>":()V
   #2 = String             #16            // Hello World
   #3 = Fieldref           #17.#18        // java/lang/System.out:Ljava/io/PrintStream;
   #4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #21            // methodArea/MethodTest
   #6 = Class              #22            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               SourceFile
  #14 = Utf8               MethodTest.java
  #15 = NameAndType        #7:#8          // "<init>":()V
  #16 = Utf8               Hello World
  #17 = Class              #23            // java/lang/System
  #18 = NameAndType        #24:#25        // out:Ljava/io/PrintStream;
  #19 = Class              #26            // java/io/PrintStream
  #20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V
  #21 = Utf8               methodArea/MethodTest
  #22 = Utf8               java/lang/Object
  #23 = Utf8               java/lang/System
  #24 = Utf8               out
  #25 = Utf8               Ljava/io/PrintStream;
  #26 = Utf8               java/io/PrintStream
  #27 = Utf8               println
  #28 = Utf8               (Ljava/lang/String;)V
{
  public methodArea.MethodTest();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: ldc           #2                  // String Hello World
         2: astore_1
         3: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         6: aload_1
         7: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        10: return
      LineNumberTable:
        line 5: 0
        line 6: 3
        line 7: 10
}
SourceFile: "MethodTest.java"

从最后的结果,我们发现 编译结果包含了 程序运行逻辑,文件信息,一个变量属性等。

原文地址:https://www.cnblogs.com/zhouzhiyao/p/13187223.html