Javac源码解读-书目录
1、Javac编译器
(1)Javac编译器介绍(主要介绍如何从java源代码到class的一个转换过程)
(2)Javac的源码(说明其中哪个功能由哪个主要的类来完成)
(3)Javac支持的命令及实现
2、文件加载与输出
(1)概述
编译一个Java源代码到class时会涉及到依赖文件的查找加载,并且需要将最终生成的class文件进行写出。这就需要一个统一的文件模块来处理,其中涉及到的主要类如下:
1、Paths、Path
2、ZipArchive
3、BaseFileObject
4、JavacFileManager
(2)依赖路径查找 主要是平台路径,如Platform_class_path,class_path、source_path与annotation_processor_path。Paths类解读
(3)加载及处理依赖包
(4)使用依赖相关类
JavacFileManager
RelativeDirectory
Relativefile
(5)优化
3、词法分析
(1)编码
(1)词法元素(关键字、符号和自定义单词)
(2)Java的Name与QualifiedName
一个字符一个字符的读取源代码,形成规范化的Token流。规范化的Token包含:
- java关键词:package、import、public、class、int等
- 自定义单词:包名、类名、变量名、方法名
- 符号:=、;、+、-、*、/、%、{、}等
4、语法分析
(1)定义的分析(类的定义、包的定义、import定义、变量与方法的定义)
(2)语句的分析
(3)表达式的分析
5、抽象语法树的生成
(1)自顶向下分析
(2)自底向上分析
(3)表达式的抽象语法树
(4)语句的抽象语法树
(5)声明的抽象语法树
(6)访问抽象语法树
6、Java中的符号
(1)符号表管理相关类
(2)Java语言中符号的种类
(3)符号名字的管理
(4)符号的表示
(5)类型的表示
(6)可见性管理
7、填充符号表
(4)抽象语法树的遍历
8、语义分析之注解处理
(4)抽象语法树的遍历
9、标记语法分析树
(1)Javac相关类型
(2)类型相互转换
10、语义分析之标注语法树
(3)标注:检查语义合法性、进行逻辑判断
- 检查语法树中的变量类型是否匹配(eg.String s = 1 + 2;//这样"="两端的类型就不匹配)
- 检查变量、方法或者类的访问是否合法(eg.一个类无法访问另一个类的private方法)
- 变量在使用前是否已经声明、是否初始化
- 常量折叠(eg.代码中:String s = "hello" + "world",语义分析后String s = "helloworld")
- 推导泛型方法的参数类型
11、语义分析之数据流检查
(4)数据流分析
- 变量的确定性赋值(eg.有返回值的方法必须确定有返回值)
- final变量只能赋一次值,在编译的时候再赋值的话会报错
- 所有的检查型异常是否抛出或捕获
- 所有的语句都要被执行到(return后边的语句就不会被执行到,除了finally块儿)
12、语义分析之语法糖去除
(5)进一步语义分析
- 去掉永假代码(eg.if(false))
- 变量自动转换(eg.int和Integer)自动装箱拆箱
- 去掉语法糖(eg.foreach转化为for循环,assert转化为if,内部类解析成一个与外部类相关联的外部类)
13、class文件结构
(1)Class类文件的结构
(2)字节码指令简介
(2)读取class文件相关的信息
14、字节码生成
(1)指令的编码
(2)生成代码的管理
(3)指令的发射
(4)存储管理
(5)代码生成
1、为Java方法生成代码
2、为方法的调用生成代码
3、为循环结构生成代码
4、为条件语句生成代码
5、为异常捕获生成代码
15、辅助工具类
1、日志记录
2、名称管理
3、有序列表的实现
4、单例的实现
5、位实现
6、国际化实现
附录A:语法节点表
语句Statement
1、Java中的Statement
2、创建Statement
3、访问Statement
表达式Expression
1、Java中的Statement
2、创建Statement
3、访问Statement
附录B:JVM指令集
Javac源码解读-书目录的更多相关文章
- Hadoop源码解读系列目录
Hadoop源码解读系列 1.hadoop源码|common模块-configuration详解2.hadoop源码|core模块-序列化与压缩详解3.hadoop源码|core模块-远程调用与NIO ...
- Alamofire源码解读系列(六)之Task代理(TaskDelegate)
本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...
- Alamofire源码解读系列(十二)之请求(Request)
本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...
- KClient——kafka消息中间件源码解读
目录 kclient消息中间件 kclient-processor top.ninwoo.kclient.app.KClientApplication top.ninwoo.kclient.app.K ...
- 源码解读·RT-Thread操作系统从开机到关机
本篇内容比较简单,但却很繁琐,篇幅也很长,毕竟是囊括了整个操作系统的生命周期.这篇文章的目的是作为后续设计多任务开发的铺垫,后续会单独再抽出一篇分析任务的相关知识.另外本篇文章以单核MCU为背景,并且 ...
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- SDWebImage源码解读 之 UIImage+GIF
第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...
- SDWebImage源码解读 之 SDWebImageCompat
第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...
- SDWebImage源码解读_之SDWebImageDecoder
第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...
随机推荐
- 试题 G: 外卖店优先级 第十届蓝桥杯
试题 G: 外卖店优先级时间限制: 1.0s 内存限制: 512.0MB 本题总分: 20 分[问题描述]“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N.每家外卖店都有一个优先级,初始时 ...
- 试题 D: 数的分解 蓝桥杯
试题 D: 数的分解本题总分: 10 分[问题描述]把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?注意交换 3 个整数的顺序 ...
- 利用InfoPath实现SharePoint Server 2013列表的级联选择(Cascading Drop Down List)
最近在利用SharePoint Server 2013的列表组织和存储数据,发现SharePoint列表原始不支持级联选择的功能. 谷歌百度一通以后,发现了很多通过代码实现的方案,利用第三方的插件sp ...
- 提问的智慧——其实你真的不会提问!(转)
在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度,同样取决于你提问的方法.本指南旨在帮助你提高发问技巧,以获取你最想要的答案. 首先你必须明白,黑客们只偏爱艰 ...
- python, C++, C# 计算速度简单对比
有个简单的运算, ; ; ; i < n ; i ++) { ; j < n; j ++) { lResult += (ulong) ( i * j ); } } return lResu ...
- PostgreSQL 区域设置
安装PostgreSQL 10.3 windows版本时区域请选择"default locale",安装成功后输入命令: show lc_ctype; show lc_collat ...
- Mustache 使用说明
Mustache 使用说明 最近在升级SinGooCMS到MVC架构.管理前端使用了Mustache模板,把使用心得记录一下! 一.官网http://mustache.github.io/https: ...
- Cookie客户端缓存.Session.Application
Cookie客户端缓存. 1.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那么久不得不谈本地存储了. 本地存储的好处: 一是避免取回数据前页面一片空白,如果不需要 ...
- Android Studio设置字体
一,点"Settings"按钮,调出配置界面: 然后如图找到 Editor-colors&font-font ,默认的不让修改 所以先点击save as 随便起个名字 , ...
- 开发一个小的php扩展
今天试了一下在php添加扩展,看了挺多资料,细节上不一致,其他大体是差不多的. 我们来开发一个叫ccvita_string的函数,他的主要作用是返回一段字符,对应的php代码可能如此: functio ...