建设部网站业绩补录,注册外贸公司需要多少钱,自己如何做棋牌网站,用pycharm做网站在《Java代码的编译与反编译》中#xff0c;有过关于Java语言的编译和反编译的介绍。我们可以通过javac命令将Java程序的源代码编译成Java字节码#xff0c;即我们常说的class文件。这是我们通常意义上理解的编译。但是#xff0c;字节码并不是机器语言#xff0c;要想让机…在《Java代码的编译与反编译》中有过关于Java语言的编译和反编译的介绍。我们可以通过javac命令将Java程序的源代码编译成Java字节码即我们常说的class文件。这是我们通常意义上理解的编译。但是字节码并不是机器语言要想让机器能够执行还需要把字节码翻译成机器指令。这个过程是Java虚拟机做的这个过程也叫编译。是更深层次的编译。在编译原理中把源代码翻译成机器指令一般要经过以下几个重要步骤根据完成任务不同可以将编译器的组成部分划分为前端(Front End)与后端(Back End)。前端编译主要指与源语言有关但与目标机无关的部分包括词法分析、语法分析、语义分析与中间代码生成。后端编译主要指与目标机有关的部分包括代码优化和目标代码生成等。我们可以把将.java文件编译成.class的编译过程称之为前端编译。把将.class文件翻译成机器指令的编译过程称之为后端编译。Java中的前端编译前端编译主要指与源语言有关但与目标机无关的部分包括词法分析、语法分析、语义分析与中间代码生成。我们所熟知的javac的编译就是前端编译。除了这种以外我们使用的很多IDE如eclipseidea等都内置了前端编译器。主要功能就是把.java代码转换成.class代码。词法分析词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序将字符序列转换为标记(token)序列的过程。这里的标记是一个字符串是构成源代码的最小单位。在这个过程中词法分析器还会对标记进行分类。词法分析器通常不会关心标记之间的关系(属于语法分析的范畴)举例来说词法分析器能够将括号识别为标记但并不保证括号是否匹配。语法分析语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语如“程序”“语句”“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述。语义分析语义分析是编译过程的一个逻辑阶段 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查进行类型审查。语义分析是审查源程序有无语义错误为代码生成阶段收集类型信息。语义分析的一个重要部分就是类型检查。比如很多语言要求数组下标必须为整数如果使用浮点数作为下标编译器就必须报错。再比如很多语言允许某些类型转换称为自动类型转换。中间代码生成在源程序的语法分析和语义分析完成之后很多编译器生成一个明确的低级的或类机器语言的中间表示。该中间表示有两个重要的性质 1.易于生成 2.能够轻松地翻译为目标机器上的语言。在Java中javac执行的结果就是得到一个字节码而这个字节码其实就是一种中间代码。PS著名的解语法糖操作也是在javac中完成的。Java中的后端编译首先我们大家都知道通常通过 javac 将程序源代码编译转换成 java 字节码JVM 通过解释字节码将其翻译成对应的机器指令逐条读入逐条解释翻译。很显然经过解释执行其执行速度必然会比可执行的二进制字节码程序慢很多。这就是传统的JVM的解释器(Interpreter)的功能。为了解决这种效率问题引入了 JIT 技术。JAVA程序还是通过解释器进行解释执行当JVM发现某个方法或代码块运行特别频繁的时候就会认为这是“热点代码”(Hot Spot Code)。然后JIT会把部分“热点代码”翻译成本地机器相关的机器码并进行优化然后再把翻译后的机器码缓存起来以备下次使用。HotSpot虚拟机中内置了两个JIT编译器Client Complier和Server Complier分别用在客户端和服务端目前主流的HotSpot虚拟机中默认是采用解释器与其中一个编译器直接配合的方式工作。当 JVM 执行代码时它并不立即开始编译代码。首先如果这段代码本身在将来只会被执行一次那么从本质上看编译就是在浪费精力。因为将代码翻译成 java 字节码相对于编译这段代码并执行代码来说要快很多。第二个原因是最优化当 JVM 执行某一方法或遍历循环的次数越多就会更加了解代码结构那么 JVM 在编译代码的时候就做出相应的优化。在机器上执行java -version命令就可以看到自己安装的JDK中JIT是哪种模式:上图是我的机器上安装的jdk1.8可以看到他是Server Compile但是需要说明的是无论是Client Complier还是Server Complier解释器与编译器的搭配使用方式都是混合模式即上图中的mixed mode。热点检测上面我们说过要想触发JIT首先需要识别出热点代码。目前主要的热点代码识别方式是热点探测(Hot Spot Detection)有以下两种1、基于采样的方式探测(Sample Based Hot Spot Detection) 周期性检测各个线程的栈顶发现某个方法经常出险在栈顶就认为是热点方法。好处就是简单缺点就是无法精确确认一个方法的热度。容易受线程阻塞或别的原因干扰热点探测。2、基于计数器的热点探测(Counter Based Hot Spot Detection)。采用这种方法的虚拟机会为每个方法甚至是代码块建立计数器统计方法的执行次数某个方法超过阀值就认为是热点方法触发JIT编译。在HotSpot虚拟机中使用的是第二种——基于计数器的热点探测方法因此它为每个方法准备了两个计数器方法调用计数器和回边计数器。方法计数器。顾名思义就是记录一个方法被调用次数的计数器。回边计数器。是记录方法中的for或者while的运行次数的计数器。编译优化前面提到过JIT除了具有缓存的功能外还会对代码做各种优化。说到这里不得不佩服HotSpot的开发者他们在JIT中对于代码优化真的算是面面俱到了。这里简答提及几个我觉得比较重要的优化技术并不准备直接展开读者感兴趣的话我后面再写文章单独介绍。逃逸分析、 锁消除、 锁膨胀、 方法内联、 空值检查消除、 类型检测消除、 公共子表达式消除