zoukankan      html  css  js  c++  java
  • JVM之---Java源码编译机制

    Sun JDK中采用javac将Java源码编译为class文件,这个过程包含三个步骤:

    image

    1.分析和输入到符号表(Parse and Enter)

       Parse过程所做的工作有词法和语法分析。词法分析要完成将代码字符串转变为Token序列。语法分析则是根据语法将Token序列生成抽象语法树。

       Enter过程将符号输入到符号表,通常包括确定类的超类型和接口、根据需要添加默认构造器、将类中出现的符号输入类自身的符号表中等。

    2.注解处理(Annotation Processing)

       该步骤主要用于处理用户自定义的annotation,可能带来的好处是基于annotation来生成附加的代码或进行一些特殊的检查,从而节省一些共同的代码的编写。此功能基于JSR269,在Sun JDK6 中提供了支持,在注解处理完之后,再次进入上一步骤。

    3.语义分析和生成class文件(Analyse and Generate)

       该步骤基于抽象语法树进行一系列的语义分析,包括将语法树中的名字、表达式等元素与变量、方法、类型等联系在一起;检查变量使用前是否已声明;推导泛型方法的类型参数;检查类型匹配性;进行常量折叠;检查所有语句都可到达;检查所有checked exception 都被捕获或抛出;检查变量的确定性赋值(例如有返回值的方法必须确定有返回值);检查变量的确定性不重复赋值(例如声明为final的变量等);解除语法糖(消除if(false){…}形式的无用代码;将泛型Java转为普通Java;将含有语法糖的语法树改为含有简单语言结构的语法树,例如foreach循环、自动装箱/拆箱等)。

        在完成了语义分析后,开始生成class文件,生成的步骤为:首先将实例成员初始化器收集到构造器中,将静态成员初始化收集为<clinit>();接着将抽象语法树生成字节码,采用的方法为后序遍历语法树,并进行最后的少量代码转换(例如String相加转变为StringBuilder操作);最后从符号表生成class文件。

    4.class文件内容

       class文件中并不仅仅存放了字节码,还存放了很多辅助JVM来执行class的附加信息,一个class文件包含了以下信息:

        1)结构信息

         包括class文件格式版本号及各部分的数量与大小的信息

        2)元数据

         简单来说,可以认为元数据对应的就是Java源码中“声明”与“常量”的信息,主要有:类、继承的超类、实现的接口声明信息、域与方法声明信息和常量池。

        3)方法信息

          方法信息对应的就是Java源码中的“语句”与“表达式”对应的信息,主要有:字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试用符号信息。

  • 相关阅读:
    [pytorch][模型压缩] 通道裁剪后的模型设计——以MobileNet和ResNet为例
    [面试]DeeCamp2020面试记录
    [python][pytorch]多GPU下的模型保存与加载
    [目标检测][python][cpp]非极大值抑制(NMS)算法原理以及CPP实现
    [pytorch]动态调整学习率
    [pytorch][持续更新]pytorch踩坑汇总
    [CPP]push_back和emplace_back的区别
    [LeetCode in Python] 199 (M) binary tree right side view 二叉树的右视图
    [LeetCode in Python] 5390 (M) minimum number of frogs croaking 数青蛙
    [LeetCode in Python] 1345 (H) jump game iv 跳跃游戏 IV
  • 原文地址:https://www.cnblogs.com/sunzhenchao/p/3446268.html
Copyright © 2011-2022 走看看