java 编译原理 字符串_Java编译原理(javac)

Java中的编译分为两个部分:

源码文件编译成字节码文件(前端编译)

字节码文件被虚拟机加载以后编译成机器码(后端编译)

对于开发来说接触的一般都是第一个步骤也就是源码编译成字节码文件(class文件),第二个步骤开发几乎不会接触,因为这是虚拟机在运行过程中自己做的一些编译流程,将字节码转换成可被虚拟机识别执行的机器码。

62c1b905a316fd95dfa95bd2736c3d2d.png

1. 前端编译

前端编译大致主要有以下流程:

对源文件进行词法分析产生字符流

对字符流进行语法分析产生抽象语法树

对语法树进行语义分析,确保语义正常

语义分析通过以后生成中间代码(字节码)

下面我们站在javac的角度上看,编译过程大致分为:

解析与填充符号表

插入式注解处理器的处理注解

语义分析与字节码的生成

490f347eedd356bc7c8353b8f80c09b7.png

上述3个过程会包含前段编译4个步骤的所有流程,下面我们看一下这个3个步骤需要做什么。

2. 解析与填充符号表

2.1 解析

2.1.1 词法分析

Java源文件是由一个个字符构成,但是编译器所能识别的是Token(标记)。我们需要通过词法分析来将源文件中的字符流转换成Token集合,这样才能用于后续的语法分析。

int a = b + c;

int是由3个字符构成,但是对于词法分析来说,这三个字符会被解析成一个Token(标记)。

词法分析主要由com.sun.tools.javac.parser.Scannaer类来实现。

2.1.2 语法分析

根据Token集合生成抽象语法树,语法树是一种用来表示程序代码语法结构的表现形式,语法树的每一个节点都代表着程序代码中的一个语法结构,例如包、类型、修饰符。

package jvm;

/**

* @author sh

*/

public class ClassTest{

public int add(int a, int b){

return a + b;

}

}

语法分析主要有com.sun.tools.javac.parser.Parser类来实现。

上述这段代码生成的抽象语法树如下(IDEA  JDT AstView插件可以查看抽象语法树):

a3e3a8e98b74de80df6753cfd152e2b3.png

上述抽象语法树在Java中使用com.sun.tools.javac.tree.JCTree类来表示,之后所有的操作均建立在抽象语法树之上。

2.2 填充符号表

结束了词法分析和语法分析以后,下一步就是填充符号表。符号表中信息可以用在语义分析过程中的检查和产生中间代码

3. 注解处理器

注解处理器在编译期间对注解进行处理,可以读取、修改、添加抽象语法树中的任意元素。如果注解处理器对语法树进行了修改,编译器将会回到解析和填充符号表的过程重新处理,直到注解处理器不再对语法树进行修改为止,每一次循环称为一个Round。

4. 语义分析和字节码生成

4.1 语义分析

语义分析主要是对程序上下文进行检查,如变量类型检查。

语义分析主要包含两个步骤:

标注检查

数据及控制流分析

4.1.1 标注检查

标注检查主要用来检查变量是否已被声明、变量与赋值之间的数据类型是否匹配。在标注检查的步骤中还会实施常量折叠。

int a = 1 + 2;

上述代码我们在语法树上可以看到字面量1、2以及操作符+,在经过常量折叠步骤以后,会生成一个新的字面量3,在程序运行时a的值就是3,不会再消耗CPU进行计算。

4.1.2 数据及控制流分析

数据及控制流分析是对程序上下文逻辑进行验证,检查局部变量是否在使用前已经赋值、方法的每条路径都有返回值、所有的受检查异常是否被正确处理。

局部变量final类型的变量的不变性只能依靠编译来保证,这是因为局部变量在常量池中没有CONSTANT_Fieldref_info的符号引用,没有访问标志的信息,在运行期虚拟机并不确定局部变量是否是final,因此需要编译期的保证。

4.2 字节码生成

字节码在生成之前,还需要进行最后一项工作解语法糖。

4.2.1 解语法糖

Java中的语法糖包括范型、变长参数、自动装箱/拆箱、Lambda。

语法糖可以增加程序的可读性、减少代码量。

4.2.2 字节码生成

字节码生成是javac编译的最后一个阶段。字节码生成阶段不仅仅是把各个步骤生成的信息转换成字节码写到磁盘,还进行了代码的添加和转换工作。

将static语句块、static变量收敛到

方法中

将实例变量初始化、调用父类构造器收敛到

方法

程序优化,比如将字符串的+操作替换成StringBuilder的append

完成了语法树的遍历和调整以后,就会填充了所有信息的符号表交给com.sun.tools.javac.jvm.ClassWriter类,最后由该类的writeClass()方法输出字节码。

本期的Java前端编译介绍到这,我们下期再见!!!

我是shysh95,希望可以和你专注技术的路上并肩作战,长按识别或者扫码关注微信公众号,更多精彩文章!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql2012一段时间无法连接报53错误

2019独角兽企业重金招聘Python工程师标准>>> 解决方案 在sqlserver网络配置下的msqlserver协议下改将ip3改成如下图所示 转载于:https://my.oschina.net/u/2511906/blog/840373

php生成图片验证码代码,PHP生成图片验证码以及点击切换的代码

这篇文章主要介绍了PHP生成图片验证码实例,同时介绍了点击切换(看不清&#xff1f;换一张)效果实现方法,需要的朋友可以参考下这里来看下效果:现在让我们来看下 PHP 代码<?php session_start();function random($len) {$srcstr "1a2s3d4f5g6hj8k9qwertyupzxcvbnm&quo…

php 字符型转变为数值,php怎么把字符串转换为数值?

php怎么把字符串转换为数值&#xff1f;下面本篇文章给大家介绍一下PHP把字符串转换为数值的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。PHP中的字符串可以很容易地转换成数值(float / int / double类型)。在大多数用例中&am…

解决rspec 生成报告时报utf-8错误的方法

找到gems\1.9.1\gems\rspec-core-2.14.3\lib\rspec\core\formatters\snippet_extractor.rb文件中的第27行&#xff1a; 在这边记录一下&#xff0c;防止以后再遇到。。。出现这个原因是因为ruby文件用utf-8格式的&#xff0c;但是源码都是GBK处理的&#xff0c;找到\lib\ruby\…

EFProf Entity Framework Profile 工具

SQL Server Profiler用来跟踪应用程序发送到SQL Server中的SQL语句&#xff0c;用于检测性能&#xff0c;查找问题。Entity Framework 也有它的跟踪工具EFProf&#xff0c;用于跟踪Entity Framework发送到SQL Server中的SQL语句。 首先在代码中添加对程序集HibernatingRhinos.P…

php面试中的问题,十个值得深思的PHP面试问题

十个值得深思的PHP面试问题过来人在以往的面试中总结的10个值得深思的 PHP 面试问题&#xff0c;希望对你现在的面试有用&#xff0c;少走弯路&#xff0c;更多内容请关注应届毕业生网!Q1第一个问题关于弱类型$str1 yabadabadoo;$str2 yaba;if (strpos($str1,$str2)) {echo &…

Android中ExpandableListView控件基本使用

本文採用一个Demo来展示Android中ExpandableListView控件的使用&#xff0c;如怎样在组/子ListView中绑定数据源。直接上代码例如以下&#xff1a; 程序结构图&#xff1a; layout文件夹下的 main.xml 文件源代码例如以下&#xff1a; <?xml version"1.0" encodi…

武林外史java游戏,武林外史_网络游戏专区_腾讯游戏频道

1 、武师用防御工具1) 武卫类> 用土布制作的防护工具。阶段图片名称说明1武威带所需功力值所需力量所需技艺所需体力所需智能所需敏捷性防御力防御成功率8013013021 %武威甲所需功力值所需力量所需技艺所需体力所需智能所需敏捷性防御力防御成功率4160150021 %武威长裤所需功…

简单实现KeyChain实例

目录结构如下&#xff1a; AppDelegate.m 1 //2 // AppDelegate.m3 // KeyChain4 //5 // Created by apple on 14-12-26.6 // Copyright (c) 2014年 ll. All rights reserved.7 //8 9 #import "AppDelegate.h" 10 11 interface AppDelegate () 12 13 end 14 1…

JAVA入门[6]-Mybatis简单示例

初次使用Mybatis,先手写一个hello world级别的例子&#xff0c;即根据id查询商品分类详情。 一、建表 create table Category ( Id INT not null, Name varchar(80) null, constraint pk_category primary key (Id) ); 插入测试数据 INSERT INTO category VALUES (1,Fish); INS…

ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用

ASP.NET MVC5 EF6 入门教程 (6) View中的Razor使用 原文:ASP.NET MVC5 EF6 入门教程 (6) View中的Razor使用文章来源&#xff1a; Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-ef-6-get-started-model.html 上一节&#xff1a;ASP.NET MVC5 EF6 入门教程 (5) M…

递归--基于回溯和递归的八皇后问题解法

八皇后问题是在8*8的棋盘上放置8枚皇后&#xff0c;使得棋盘中每个纵向、横向、左上至右下斜向、右上至左下斜向均只有一枚皇后。八皇后的一个可行解如图所示&#xff1a; 思路 对于八皇后的求解可采用回溯算法&#xff0c;从上至下依次在每一行放置皇后&#xff0c;进行搜索&a…

matlab emf 读取,20140219-Emf_Demo EMF 矢量图 可以读取和保存EMF 的封闭类 非常实用 matlab 238万源代码下载- www.pudn.com...

文件名称: 20140219-Emf_Demo下载收藏√ [5 4 3 2 1 ]开发工具: Visual C文件大小: 6312 KB上传时间: 2014-07-10下载次数: 2详细说明&#xff1a;EMF 矢量图 可以读取和保存EMF矢量图的封闭类非常实用-EMF EMF vector can read and save the class very useful vector cl…

JS中popup.js

为什么80%的码农都做不了架构师&#xff1f;>>> //popup class 显示弹出窗口&#xff0c;。/*以下为使用popup对象&#xff0c;传入相应的配置参数&#xff0c;弹出不同类型的窗口 function ShowIframe() //显示iframe { var popnew P…

二阶振荡衰减 matlab,基于Matlab/Simulink的二阶控制系统仿真研究

1 二阶控制系统模型本文引用地址&#xff1a;http://www.eepw.com.cn/article/201612/328597.htm能够用二阶微分方程描述的系统称为二阶控制系统。在控制工程实践中&#xff0c;二阶控制系统十分常见&#xff0c;例如&#xff0c;电枢控制的直流电动机&#xff0c;RLC网络和弹簧…

CCF201409-5 拼图(30分)

试题编号&#xff1a; 201409-5 试题名称&#xff1a; 拼图 时间限制&#xff1a; 3.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述给出一个nm的方格图&#xff0c;现在要用如下L型的积木拼到这个图中&#xff0c;使得方格图正好被拼满&#xff0c;请问总共有…

C++ 0x

转载于:https://www.cnblogs.com/iiiDragon/p/3230006.html

Github for Windows使用介绍

Git已经变得非常流行&#xff0c;连Codeplex现在也已经主推Git。Github上更是充斥着各种高质量的开源项目&#xff0c;比如ruby on rails&#xff0c;cocos2d等等。对于习惯Windows图形界面的程序员来讲&#xff0c;Github的使用是需要点时间和耐心的&#xff0c;然而最近Githu…

matlab中udt函数,《MATLAB信号处理超级学习手册》——2.5 离散时间信号中的运算...

本节书摘来自异步社区《MATLAB信号处理超级学习手册》一书中的第2章&#xff0c;第2.5节&#xff0c;作者&#xff1a;MATLAB技术联盟 , 史洁玉著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看2.5 离散时间信号中的运算MATLAB信号处理超级学习手册2.5.1 离散…

构建Docker镜像(三)

作者:李晓辉联系方式:Xiaohui_lifoxmail.comQQ:939958092一、建立Dockerfile1、准备文件新建一个目录和一个 Dockerfilemkdir /steventouch /steven/Dockerfile2、更新Dockerfile这个步骤是在设计镜像&#xff0c;如果你需要在镜像内包含什么软件&#xff0c;将来开放哪些端口&…