Scala2 编译器阶段概要
一个阶段是一个大的流程
一般来说,id 大的在后面执行,但是还要考虑的并行的,有依赖关系的,依赖靠 runsAfter、runsRightAfter、runsRightAfter 指定。这里的编译阶段可以拓展,甚至可以外部拓展~!
可以增加参数-Xshow-phases
打印出下面这个表格。
id | 阶段 | 描述 |
---|---|---|
1 | parser | 语法分析,将源码解析为 AST(抽象语法树,下面简称树),进行简单的语法糖解析处理 |
2 | namer | 解析名称,将符号附加到已命名的树上 |
3 | packageobjects | 加载包对象 |
4 | typer | 分配树的类型 |
5 | superaccessors | 在特质和嵌套类中添加 super 访问器 |
6 | extmethods | 为内联类添加扩展方法 |
7 | pickler | 将符号表序列化 |
8 | parrefchecksser | 引用/覆盖(重写)的检查,翻译嵌套对象 |
9 | patmat | 翻译 match 表达式 |
10 | uncurry | 解码柯里化,将函数值转化为匿名类 |
11 | fields | 合成访问器和字段,为惰性 val 字段添加位图 |
12 | tailcalls | 用跳跃(指 matchEnd)取代尾部调用 |
13 | specialize | 处理特化(指@specialized)的类和方法 |
14 | explicitouter | 处理嵌套类和嵌套类的持有类 |
15 | erasure | 擦除类型,为特质增加接口 |
16 | posterasure | 清理被擦除的内联类 |
17 | lambdalift | 将嵌套函数移到顶层 |
18 | constructors | 将字段定义移到构造函数中 |
19 | flatten | 消除内部类 |
20 | mixin | 处理 with(特质) |
21 | cleanup | 特定平台的清理,生成反射性调用 |
22 | delambdafy | 移除 lambdas |
23 | jvm | 生成 JVM 字节码 |
24 | terminal | 编译过程中的最后阶段 |
子阶段
上面其实缺少详细的分析阶段,namer、packageobjects、typer 这几个阶段有子流程 Analyzer,或者换句话说,namer、packageobjects、typer 都是 Analyzer 的一部分。
不考虑 24,23 的话,一个语法的处理可能是需要所有阶段,也可能是只需要某几个阶段。
Scala2 编译器入口
- 编译器的入口同样是一个 main 方法,类:
scala.tools.nsc.Main
- 编译器的全部实现:
scala.tools.nsc.Global
- scalac 编译源文件时的流程:
普通文件名的序列
=>源文件的序列
=>编译单元的序列
=> 依次执行上面的编译阶段 => 输出编译后的字节码文件
文档信息
- 本文作者:梦境迷离
- 本文链接:https://blog.dreamylost.cn/scala/Scala-Scala2%E7%BC%96%E8%AF%91%E5%99%A8%E7%9A%84%E5%8E%9F%E7%90%86-1.html
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)