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源码解读-书目录的更多相关文章

  1. Hadoop源码解读系列目录

    Hadoop源码解读系列 1.hadoop源码|common模块-configuration详解2.hadoop源码|core模块-序列化与压缩详解3.hadoop源码|core模块-远程调用与NIO ...

  2. Alamofire源码解读系列(六)之Task代理(TaskDelegate)

    本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...

  3. Alamofire源码解读系列(十二)之请求(Request)

    本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...

  4. KClient——kafka消息中间件源码解读

    目录 kclient消息中间件 kclient-processor top.ninwoo.kclient.app.KClientApplication top.ninwoo.kclient.app.K ...

  5. 源码解读·RT-Thread操作系统从开机到关机

    本篇内容比较简单,但却很繁琐,篇幅也很长,毕竟是囊括了整个操作系统的生命周期.这篇文章的目的是作为后续设计多任务开发的铺垫,后续会单独再抽出一篇分析任务的相关知识.另外本篇文章以单核MCU为背景,并且 ...

  6. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  7. SDWebImage源码解读 之 UIImage+GIF

    第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...

  8. SDWebImage源码解读 之 SDWebImageCompat

    第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...

  9. SDWebImage源码解读_之SDWebImageDecoder

    第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...

随机推荐

  1. Quartus II 软件生成FFT、NCO、FIR等IP核时卡住不动的解决办法

    据网友表示,遇到这个问题时,在任务管理器中手动关闭quartus_map进程就可以了,由于我的电脑最近一直没有出问题,因此也无法验证.欢迎大家针对这个问题讨论,提出肯定.否定的说法. 另外,很多人表示 ...

  2. centos下安装pip2

    # 背景 新机器,安装完python2后发现竟然不自带pip,按照我的理解现在新版本的python,不管是2还是3都会自带pip的.没办法,需要自己去安装pip的 # 步骤 1. 最开始查到的是通过y ...

  3. linux 添加用户到sudo中

    步骤 1. 先切到root用户 2. 执行visudo,其实就是修改/etc/sudoers 3. 添加用户,规则如下: youuser ALL=(ALL) ALL %youuser ALL=(ALL ...

  4. java的一些命名规范吧

    注意事项: 1.由于Java是面向对象编程的,所以在命名的时候尽量选择名词. 2.(Camel-Case)驼峰命名法:当变量名或函式名是由一个或多个单字连结在一起,而构成的唯一识别字时,首字母以小写开 ...

  5. C++ windows进程间通信

    最近一直在找共享内存同步的操作,恰好这篇文章有讲解.本文转载:https://blog.csdn.net/bing_bing_bing_/article/details/82875302 方便记录,c ...

  6. indows 2008 r2/做了SPS2007---2013后,发现添加原来域中的域组添加不上

    根据上次的网络包的分析, 我们在AD中找到了wtc-beijing-it的组, 不过在SharePoint日志中我们没有发现搜索成功的记录. - SearchResultEntry: CN=WTC-B ...

  7. 如何无人值守安装linux系统(上)

    如何开始 Linux 的无人值守安装 一.预备知识: I.什么是PXE PXE并不是一种安装方式,而是一种引导方式.进行PXE安装的必要条件是要安装的计算机中包含一个PXE支持的网卡(NIC),即网卡 ...

  8. Security-OAuth2.0 密码模式之客户端实现

    我的OAuth2.0 客户端项目目录 pom 的配置 <?xml version="1.0" encoding="UTF-8"?> <proj ...

  9. multiprocessor(下)

    一.数据共享 展望未来,基于消息传递的并发编程是大势所趋即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分 ...

  10. SHELL脚本扩展

    使用SED命令 sed称为流编辑器,命令格式如下: sed option script file -e script #指定多个命令 -f script_file #指定命令文件 -n #不需要为每个 ...