清理阶段后的 Scala 编译器输出
Scala compiler output after cleanup phase
我想开发一个工具 post - 在 Scala 编译器完成所有繁重工作后处理 Scala 程序。据我了解,Scala 编译器的不同阶段在语法糖和高级功能(如 lambda、闭包、模式匹配等)方面逐渐简化了程序。但是,我注意到所谓的 cleanup 阶段 - 这是代码生成之前的最后一个阶段 - 看起来像 scala 但它不是真正的 scala。
有没有人知道或可以指出可以帮助我理解 cleanup 阶段的语言的资源?
举个例子,在 cleanup 阶段的输出中,我看到如下内容:
case <synthetic> val x1: Foo$Bar = l;
case9(){
if (...some condition...)
matchEnd8(scala.Predef.Set().empty())
else
case10()
};
我的假设是,这是翻译模式匹配的结果,但据我所知,它看起来不像有效的 Scala 语法(我根本不是经验丰富的 Scala 开发人员!)。
我想这一切都归结为:是否可以将 cleanup 阶段的输出转换为有效的 - 可编译 - 一般的 scala 代码?
一般来说,在 scalac 编译器的任何阶段(甚至在解析之后),编译器使用的内部表示不再是有效的 Scala 代码。这主要是因为 labels 和 gotos 的存在,这是您发现的。
表格的结构
labelName(...params){
...
}
是一个标签定义,并且是
形式的调用
labelName(...args)
是跳转到该标签,将 ...args
分配给 ...params
。
labels 和 gotos 被 scalac(和 dotc,但具有不同的表示)用来表示 while
和 do..while
循环(在解析后立即),match
的翻译es 和尾递归优化函数。
一般来说,没有办法从内部表示返回到有效的 Scala 代码,尤其是在 cleanup
.
之后的管道中。
我想开发一个工具 post - 在 Scala 编译器完成所有繁重工作后处理 Scala 程序。据我了解,Scala 编译器的不同阶段在语法糖和高级功能(如 lambda、闭包、模式匹配等)方面逐渐简化了程序。但是,我注意到所谓的 cleanup 阶段 - 这是代码生成之前的最后一个阶段 - 看起来像 scala 但它不是真正的 scala。
有没有人知道或可以指出可以帮助我理解 cleanup 阶段的语言的资源?
举个例子,在 cleanup 阶段的输出中,我看到如下内容:
case <synthetic> val x1: Foo$Bar = l;
case9(){
if (...some condition...)
matchEnd8(scala.Predef.Set().empty())
else
case10()
};
我的假设是,这是翻译模式匹配的结果,但据我所知,它看起来不像有效的 Scala 语法(我根本不是经验丰富的 Scala 开发人员!)。
我想这一切都归结为:是否可以将 cleanup 阶段的输出转换为有效的 - 可编译 - 一般的 scala 代码?
一般来说,在 scalac 编译器的任何阶段(甚至在解析之后),编译器使用的内部表示不再是有效的 Scala 代码。这主要是因为 labels 和 gotos 的存在,这是您发现的。
表格的结构
labelName(...params){
...
}
是一个标签定义,并且是
形式的调用labelName(...args)
是跳转到该标签,将 ...args
分配给 ...params
。
labels 和 gotos 被 scalac(和 dotc,但具有不同的表示)用来表示 while
和 do..while
循环(在解析后立即),match
的翻译es 和尾递归优化函数。
一般来说,没有办法从内部表示返回到有效的 Scala 代码,尤其是在 cleanup
.