关于Javac编译器的那点事(一)
Javac是什么?
它是一种编译器,将Java对人非常友好的语言,编译转化对所有机器都非常友好的语言,即:JVM能够识别的语言,也就是Java字节码。而Java字节码,说白了就是一连串二进制数字。
Javac中有什么?
既然它是编译器, 这时候就要回想一下大学所学《编译原理》;什么词法分析,语法分析,语义分析,目标代码生成,目标代码优化……好吧,我承认这方面,已经被我扔进回收站,等我好好还原一下;
恢复成功,有图为证:

下面详细讲一下,Javac中词法分析器的内部原理:
先上图,看一下词法分析器的类结构及功能:(注意:这是简图,与实际还是有些出入的;I代表接口,C代表类)

词法分析过程在JavaParser的parseCompilationUnit()方法中进行;
词法分析的结果:就爱那个一个类所有关键词,匹配成Token类任意一项即可;
注:Token中除了,定义了Java语言的保留关键字外;还定义了一个特殊的词:Token.IDENTIFIER,用于表示用户自定义的名称哦!
提出问题:
如何分辨一个个Token?如:为什么就知道package是一个Token.PACKAGE,而不是用户自定义的Token.IDENTIFIER呢?
如何识别一个Token?如:为什么就知道package是一个Token,为什么不是pac或packa呢?
解答问题:
问题一: 因为JavacParser类会根据Java语言的规范控制什么顺序、地方应该出现什么Token; 即:JavacParser已经定义好了Token流的顺序规则;
问题二:判断一个Token是在Scanner.nextToken()中定义的, 其核心由Keywords类负责将Name对象同Token相对应;
过程:利用Java的语法规则,将字符集合转化为Name对象 ---> 构建Name.table这个内部类的Name对象数组 ---> 传出Name对象到Keywords的key()中找到对应的Token
Keyword类先将Token中所有元素转化成Name对象,然后建立Name对象和Token的对应关系,将关系保存在Keyword类的key数组中。当传入一个Name对象时,通过key数组就可以找到Token的类型了;
关于Javac编译器的那点事(一)的更多相关文章
- java-关于java_home配置,classpath配置和javac,java命令,javac编译器,和java虚拟机之间的关系
在每个人学习java的第一步,都是安装jdk ,jre,配置java_home,classpath,path. 为什么要做这些?在阅读java-core的时候,看到了原理,p141. 一 关于类的共享 ...
- 早期(编译器)优化--javac编译器
java语言的“编译期”其实是一段“不确定”的操作过程,可能是指一个前端编译器把.java变成.class的过程,也可能是指虚拟机的后端运行期编译器(JLT)把字节码转变成机器码的过程,也有可能是使用 ...
- 第一章-Javac编译器介绍
1.Javac概述 编译器可以将编程语言的代码转换为其他形式,如Javac,将Java语言转换为虚拟机能够识别的.class文件形式.而这种将java源代码(以.java做为文件存储格式)转换为cla ...
- 笔记:Javac编译器
Javac编译器是把 *.java 文件转换为 *.class 文件,是一个前端编译器:对应着有一种把字节码转变为机器码的编译器,称为JIT编译器(Just In Time Compiler),比如 ...
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
C#编译器优化那点事 使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...
- Javac编译器详解
学习<深入了解Java虚拟机>有一段时间了,大概理解了Java从源代码编译到执行出结果的过程,也能明确的知道Java是半解释性语言.在执行源代码时,先通过Javac编译器对源代码进行词法分 ...
- 早期javac编译器优化
学习<深入了解Java虚拟机>有一段时间了,大概理解了Java从源代码编译到执行出结果的过程,也能明确的知道Java是半解释性语言.在执行源代码时,先通过Javac编译器对源代码进行词法分 ...
- Javac 编译器
编译过程 Javac 编译过程大致可以分为1个准备过程和3个处理过程: 准备过程:初始化插入式注解处理器. 解析与填充符号表过程,包括: 词法.语法分析,将源代码的字符流转变为标记集合,构造出抽象语法 ...
- 对openjdk的javac编译器扩展了一个语法糖
我的扩展功能描述如下: 在java的现有语法中加入var来声明变量,并且可以根据初始化数据来自动类型推导. 举两个例子: 例一: 如下JAVA代码(注意这里的var是新语法): import java ...
随机推荐
- flume 整合 kafka
flume 整合 kafka: flume:高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统. kafka:分布式的流数据平台. flume 采集业务日志,发送到kafka 一. ...
- 统计hive库表在具体下所有分区大小
1 查询具体表分区大小,以字节展示 hadoop fs -du /user/hive/warehouse/treasury.db/dm_user_excercise > dm_user_exce ...
- TW实习日记:第22天
今天开发项目的还没完成的功能点,没什么难的,样式复制粘贴,JSON表单配一配,接口调一调,基本就完成了.不过中间在写后台的一些接口时,发现被自己之前写的一些方法给坑了.为什么这样说呢,因为在之前的几个 ...
- bson文件的切分
描述 最近遇到问题需要将较大的bson文件(MongoDB导出的二进制json文件)按文档(记录)进行切分,网上这方面的资料实在太少,弄了一天多终于达到了基本要求(还不知道有没有BUG) 代码 pac ...
- 利用maven进行项目管理
下面为maven项目管理的一个结构 首先pom是路径文件,我们在编译或是运行程序时调用到jdk或一些自己写的jar包时会需要指明物理路径,这里的pom是一样的道理,同时在maven的管理下多出来了一些 ...
- 解决jQuery不同版同时引用的冲突
今天研发的同事在开发一个新jQuery插件时,遇到一个揪心的问题.平台以前使用的 jQuery版本是1.2.6,偶,天啊!这是古代的版本啊! 由于很多功能基于老版本,不能删除啊,同志们都懂的! 于是我 ...
- git branch 分支与合并
在使用 git 进行分支开发与合并的时候需要用到这些命令.其他基本 git 命令参考 Git 简易食用指南 git branch 查看分支 git branch 查看当前分支情况 创建分支 git b ...
- Visual Stdio Code编辑Mark Down
Visual Studio Code可以一边写Markdown一边预览了,而且不需要任何插件. 方法如下: 新建一个文件,以 .md 为后缀: Visual Studio Code 原生就支持高亮Ma ...
- [ Continuously Update ] The Paper List of Image / Video Captioning
Papers Published in 2018 Convolutional Image Captioning - Jyoti Aneja et al., CVPR 2018 - [ Paper Re ...
- JQuery+ajax数据加载..........
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...