Javac编译过程中的填充符号表是做了什么事情呢?

来源:3-4 怎样理解 Java 的方法分派?

_广志_

2019-02-25

回头看字节码的时候去复习了下《深入了解JVM》里的Javac的编译过程,对其中的填充符号表过程有点困惑
书中内容如下:
图片描述

因为我看到下一步的注解处理过程也是直接对语法树进行操作,所以上一阶段产生的语法树在填充符号表的时候应该没有发生大的变化

所以想象中填充符号表的过程应该是对语法树的内容做了一些改动,但是符号表是在语法树的什么位置呢?
后面讲这个过程的出口是一个 TODOLIST,包含每一个编译单元的抽象语法树的顶级节点和package-info.java(如果存在的话)的顶级节点,这句话是什么意思呢?
或者更加具体一点,一段代码生成的符号表长什么样?生成符号表的过程是什么样的呢?
同时它的用处是什么呢?语义分析和产生目标代码时是起了什么作用呢?为什么可以进行语义检查和地址分配呢?
它只是在编译过程中起作用,还是说会放进编译后的字节码中呢?它与字节码文件中的方法表和属性表有关系吗?与常量池中的符号引用有关系吗?

抱歉问题有点多,主要是看到这觉得这个过程可能挺重要,但书里写得有点简略,自己搜索也没搜到能解决疑惑的内容 T T

写回答

1回答

bennyhuo

2019-02-25

看了下源码。。。Javac 源码当中有一个 Symtab 的类当中存了编译过程中构建的符号表(这个符号表当中的符号当然也可以用于后面的注解处理器了),填充符号表的过程就是读取已经生成好的语法树来构建符号表的过程,这过程当中也包含了一些预加载的内容,比如运算符,字符串的连接等等。


btw 其他同学看到这个问题的时候不用太在意,面试的时候对于 Android 应用开发来讲,除非你自己主动讲,面试官应该是不会问题编译原理相关的东西的~~



0
0

大厂资深面试官 带你破解Android高级面试

改变视野和思维 深度与广度兼备的 Android 进阶面试指导课程

1636 学习 · 222 问题

查看课程