Scala编译器的原理-1

2022/09/26 Scala 共 1041 字,约 3 分钟
梦境迷离

Scala2 编译器阶段概要

一个阶段是一个大的流程

一般来说,id 大的在后面执行,但是还要考虑的并行的,有依赖关系的,依赖靠 runsAfter、runsRightAfter、runsRightAfter 指定。这里的编译阶段可以拓展,甚至可以外部拓展~!

可以增加参数-Xshow-phases打印出下面这个表格。

id阶段描述
1parser语法分析,将源码解析为 AST(抽象语法树,下面简称树),进行简单的语法糖解析处理
2namer解析名称,将符号附加到已命名的树上
3packageobjects加载包对象
4typer分配树的类型
5superaccessors在特质和嵌套类中添加 super 访问器
6extmethods为内联类添加扩展方法
7pickler将符号表序列化
8parrefchecksser引用/覆盖(重写)的检查,翻译嵌套对象
9patmat翻译 match 表达式
10uncurry解码柯里化,将函数值转化为匿名类
11fields合成访问器和字段,为惰性 val 字段添加位图
12tailcalls用跳跃(指 matchEnd)取代尾部调用
13specialize处理特化(指@specialized)的类和方法
14explicitouter处理嵌套类和嵌套类的持有类
15erasure擦除类型,为特质增加接口
16posterasure清理被擦除的内联类
17lambdalift将嵌套函数移到顶层
18constructors将字段定义移到构造函数中
19flatten消除内部类
20mixin处理 with(特质)
21cleanup特定平台的清理,生成反射性调用
22delambdafy移除 lambdas
23jvm生成 JVM 字节码
24terminal编译过程中的最后阶段

子阶段

上面其实缺少详细的分析阶段,namer、packageobjects、typer 这几个阶段有子流程 Analyzer,或者换句话说,namer、packageobjects、typer 都是 Analyzer 的一部分。

不考虑 24,23 的话,一个语法的处理可能是需要所有阶段,也可能是只需要某几个阶段。

Scala2 编译器入口

  1. 编译器的入口同样是一个 main 方法,类:scala.tools.nsc.Main
  2. 编译器的全部实现:scala.tools.nsc.Global
  3. scalac 编译源文件时的流程:普通文件名的序列 => 源文件的序列 => 编译单元的序列 => 依次执行上面的编译阶段 => 输出编译后的字节码文件

文档信息

Search

    Table of Contents