zoukankan      html  css  js  c++  java
  • 前端编译

    前端编译的主要作用,是将 我们编写的 .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"
    

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

  • 相关阅读:
    mysql 触发器
    Yii 1.0 基础
    python解释执行原理(转载)
    python中使用selenium调用Firefox缺少geckodriver解决方法
    Python中os和shutil模块实用方法集锦
    pytesseract使用
    anaconda安装第三方库
    anaconda spyder异常如何重新启动
    windows下python3.6 32bit 安装django
    设置SO_RECVBUF和SO_SENDBUF套接字选项
  • 原文地址:https://www.cnblogs.com/zhouzhiyao/p/13187223.html
Copyright © 2011-2022 走看看