jvm-1-源文件编译过程

hpzhu      2022-05-27     234

关键词:

前言

  简单的针对JAVA虚拟机(JVM)相关知识做一个总结,从此章开始这是一个系列文章,包括内容有;

    1 前端编译,AOT(静态编译),JIT即时编译

    2 字节码文件的结构,类加载机制以及运行时内存区域

    3 关于对象的创建,内存的分配,访问的定位,判断对象是否可用,内存的回收

    4 对象内存分配及垃圾回收策略以及垃圾回收算法

    5 JVM执行引擎

    6 JVM提供的性能监控与故障处理工作,常用的JVM参数配置

  

本章内容

  注意:编译过程分为两个部分,运行前编译,以及运行时编译,运行前编译是在JVM工作开始前的操作,本章即介绍此部分

  说明:编译过程包括(语法,词法,语义的具体分析),这里只是简单的介绍编译器的工作流程,没有深入的去分析

 

知识点

  1 前端编译

  2 AOT(静态代码)编译

 

前端编译 (将源代码编译成字节码 例如:javac)

  1 编译过程

    1.1 解析与填充符号表(词法分析和语法分析)

      词法分析将源代码转换成Token(标记),语法分析再根据token构造出抽象语法树,然后根据词法分析之后的结果填充符号表

    1.2 插入式注解处理

      可以实现在编译期间对注解进行处理,通过实现插入式注解器可以访问和修改抽象语法树中的任意元素.如果一个插入式注解处理器修改了抽象语法树,则在修改语法树之后回到解析与填充符号表的过程重新处理

    1.3 分析与生产字节码 (对生成的抽象语法树进行语义分析,然后生成字节码)

      1.3.1 标注检查

           变量使用前是否声明,变量类型是否匹配等.常量折叠

      1.3.2 数据与控制流分析

           检查程序的上下文逻辑是否正确 包括:方法是否每条执行路径都有返回值,异常是否被抛出或者被catch等

      1.3.3 解语法糖

           泛型,自动装箱拆箱,变长参数,for-each循环,断言语句等,这些语法糖在编译期都会被还原成简单的基础语法

  2 优点

    2.1 编译成的Class文件可以直接给JVM解释器解释执行,省去编译时间,加快启动速度

    2.2 许多java语法新特性(语法糖:泛型,内部类等等),是靠前端编译器实现的,而不是依赖虚拟机

  3 缺点

    3.1 对代码运行效率几乎没有任何优化措施

    3.2 解释执行效率较低 

  

AOT(静态代码)编译 (程序运行期,直接把源文件编译成本地机器码 例如:JAOTC,GCJ,ART等)

  1 优点

    1.1 程序运行前,直接把java源文件(.java)编译成本地机器码的过程 (JAOTC,GCJ,ART等)

    1.2 把编译的本地机器码保存磁盘,不占用内存,并可多次使用

  2 缺点

    因为java语言的动态性带来了额外的复杂性,影响了静态编译代码的指令

 



java核心知识点总结篇-jvm篇(代码片段)

...与硬件没有直接的交互。(2)运行过程:我们都知道Java源文件,通过编译器,能够生产相应的.Class文件,也就是 查看详情

Kotlin 编译器构建错误 使用 -jvm-target 1.8 重新编译

】Kotlin编译器构建错误使用-jvm-target1.8重新编译【英文标题】:KotlincompilerbuilderrorRecompilewith-jvm-target1.8【发布时间】:2020-04-1719:09:12【问题描述】:我正在处理以下问题中描述的相同错误,但提出的所有解决方案都没有解决我的... 查看详情

jvm实用参数jvm类型以及编译器模式(代码片段)

JVM实用参数(一)JVM类型以及编译器模式原文地址:https://blog.codecentric.de/en/2012/07/useful-jvm-flags-part-1-jvm-types-and-compiler-modes/译者:赵峰,iDestiny  校对:郭蕾现在的JVM运行Java程序(和其它的兼容性语言)时在高效性和稳定... 查看详情

class文件的编译过程

编译器主要分为3类:前端编译器、JIT编译器、AOT编译器前端编译器:把*.Java文件转变成*.class文件——Sun的JavacJIT编译器:就是即时编译器,将class文件转变成机器码的过程——HotSpotVM的C1、C2AOT编译器:直接把*.java文件编译成本... 查看详情

无法解析 org.jetbrains:kotlin-css-jvm:1.0.0-pre.31-kotlin-1.2.41

...问题描述】:我想构建一个基于ktor的文件,但我得到了编译错误,但我不知道出了什么问题。编译错误:无法解析org. 查看详情

编译过程

初识编译器我们通常所说的编译器是一个广义的概念,其实编译器是有几个模块组成的,具体如下:从上图可知编译器由4部分组成;每当我们在集成开发环境下写完代码,点击build的时候编译器的工作原理如下:可以看到,编译... 查看详情

c/c++程序编译过程详解

...法的分析,将高级语言指令转换为功能等效的汇编代码,源文件的编译过程包含两个主要阶段:1.1.1编译预处理读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。伪指令主要包括以下四个方面:宏定义指令... 查看详情

c/c++程序编译过程详解

...法的分析,将高级语言指令转换为功能等效的汇编代码,源文件的编译过程包含两个主要阶段:1.1.1编译预处理读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。伪指令主要包括以下四个方面:宏定义指令... 查看详情

gcc编译过程简述

 在linux系统上,从源文件到目标文件的转化是由编译器完成的。以hello.c程序的编译为例,如下:[email protected]:gcc-ohellohello.c在这里,gcc编译器读取源文件hello.c,并把它翻译成一个可执行文件hello。这个翻译过程可分为四个... 查看详情

编译过程学习

...gcc命令就可以了。但是这其中包含了以下几个过程。1.预编译(preprocess)预编译过程主要是处理源代码中以#开头的预编译指令。如宏的处理,头文件的包含,注释删除,加入行号和文件名标识以使在编译时,编译器产生编译错误和... 查看详情

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

...析和中间代码生成-->优化-->目标代码生成Java程序从源文件创建到程序运行要经过两大步骤:1、Java文件会由编译器编译成class文件(字节码文件),会经过编译原理简单过程的前三步;2、字节码由java虚拟机解释运行,解释... 查看详情

gcc编译过程

gcc编译过程从hello.c到hello(或a.out)文件,必须历经hello.i、hello.s、hello.o,最后才得到hello(或a.out)文件,分别对应着预处理、编译、汇编和链接4个步骤,整个过程如图10.5所示。这4步大致的工作内容如下:(1)预处理,C编译器对各... 查看详情

android8.0编译过程初步分析

Android8.0编译过程分析概述要想知道编译的过程,其实看编译的脚本,以及编译时产生的log是比较快的方法。编译相关的核心文件位于build/core下,而生成的文件在out/soong下,里面有编译过程中产生的编译相关文件... 查看详情

android的编译过程详解

Android的编译过程IDE中的资源打包工具(AndroidAssetPackagingTool,即图中的aapt)会将应用中的资源文件进行编译,这些资源文件包括 AndroidManifest.xml文件,为Activity定义的XML文件等等。在这个编译过程中也会产生一个 R.java ... 查看详情

java编译运行过程

    Java程序从源文件创建到程序运行要经过两大步骤:1、源文件由编译器编译成字节码(ByteCode) 2、字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言(&... 查看详情

了解-clang编译过程

参考技术A第1步:创建源码文件hello.c如下:第2步:对其进行预编译,得到.i输出文件,使用命令:从中可以看到预处理做的一些工作第3步:编译,得到.s文件,使用命令第4步:汇编,得到.o文件,使用命令 查看详情

编译过程的一点心得

最近在交叉编译一个程序,因为使用的交叉编译器的版本比较低,然后交叉编译环境中还缺少一些依赖库,所以整个过程出现了不少问题。体会如下:1.缺少头文件不一定意味着缺少.so库文件。由于编译环境有许多包没有安装,... 查看详情

嵌入式开发gcc学习笔记-编译c程序及编译过程

一.C程序编译过程编译过程简单介绍:C语言的源文件编译成可运行文件须要四个步骤,预处理(Preprocessing)扩展宏,编译(compilation)得到汇编语言,汇编(assembly)得到机器码,连接(linking)得到可运行文件;--查看每一个步骤的编译细节:"-E"相应... 查看详情