3

一旦Scala编译器完成了所有繁重的工作,我想开发一个工具来对Scala程序进行后处理。据我了解,Scala 编译器的不同阶段在语法糖和 lambda、闭包、模式匹配等高级功能方面逐步简化程序。但是,我注意到所谓的清理阶段产生的结果 -这是代码生成之前的最后一个阶段 - 看起来像 scala,但它不是真正的 scala。

有谁亲自认识或可以向我指出可以帮助我理解清理阶段产生的语言的资源?

举个例子,在清理阶段的输出中,我看到如下内容:

case <synthetic> val x1: Foo$Bar = l;
  case9(){
    if (...some condition...)
      matchEnd8(scala.Predef.Set().empty())
    else
      case10()
  };

我的假设是,这是翻译模式匹配的结果,但据我所知,它看起来不像有效的 scala 语法(我根本不是一个有经验的 Scala 开发人员!)。

我想这一切都归结为:是否可以将清理阶段的输出转换为一般的有效-可编译-scala代码?

4

1 回答 1

1

通常,在 scalac 编译器的任何阶段(甚至在解析之后),编译器使用的内部表示不再是有效的 Scala 代码。这本质上是因为您发现了标签goto的存在。

表格的结构

labelName(...params){
  ...
}

是一个标签定义,并且是一个形式的调用

labelName(...args)

是到该标签的跳转,将 分配...args...params.

scalac(和 dotc,但具有不同的表示形式)使用标签和 goto 来表示whiledo..while循环(在解析后立即)、matches 的翻译和尾递归优化函数。

一般来说,没有办法从内部表示返回到有效的 Scala 代码,尤其是在管道中直到cleanup.

于 2017-12-01T10:05:53.250 回答