【问题标题】:Scala compiler output after cleanup phase清理阶段后的 Scala 编译器输出
【发布时间】:2018-05-14 23:36:42
【问题描述】:

我想开发一个工具,在 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 代码?

【问题讨论】:

    标签: scala compiler-construction code-translation intermediate-language scala-compiler


    【解决方案1】:

    一般来说,在 scalac 编译器的任何阶段(甚至在解析之后),编译器使用的内部表示不再是有效的 Scala 代码。这基本上是因为您发现了 labelsgotos 的存在。

    表单的结构

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

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

    labelName(...args)
    

    是到那个标签的跳转,将...args分配给...params

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

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

    【讨论】:

    • 非常感谢,这非常有帮助!一般来说,是否有资源或论坛/社区可以让我获得有关此类问题的答案(即有关 scala 编译器内部的问题)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多