清理阶段后的Scala编译器输出



我想开发一个工具,一旦Scala编译器完成了所有繁重的工作,该工具就会进行后处理。据我了解,Scala编译器的不同阶段从句法糖和高级功能(如lambdas,lastures,lotatures,taters-satching等)逐步简化了程序。但是,我注意到,所谓的出现的内容清理阶段 - 这是代码生成之前的最后阶段 - 看起来像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

标签和gotos由Scalac(和dotc,但具有不同的表示形式)使用,以表示whiledo..while环路(分析后立即),match ES的翻译和尾部复位优化的功能。

> >> >

通常,没有办法从内部表示形式回到有效的Scala代码,尤其是在管道中,如cleanup

相关内容

  • 没有找到相关文章

最新更新