【问题标题】:How to compile output of a compiler phase?如何编译编译器阶段的输出?
【发布时间】:2019-10-16 20:39:10
【问题描述】:

scalac 中使用-Xprint 标志我们得到不同compiler phases 的输出,例如给定以下Foo.scala

object Foo {
  val x = 42
}

然后scalac -Xprint:jvm Foo.scala 输出

package <empty> {
  object Foo extends Object {
    <static> private[this] val x: Int = _;
    <stable> <accessor> def x(): Int = Foo.this.x;
    def <init>(): Foo.type = {
      Foo.super.<init>();
      Foo.this.x = 42;
      ()
    }
  }
}

如何编译阶段本身,也就是说我们有源文件jvmphase.scala这样

package <empty> { ...

包含相位源代码而不是原始的vanilla Scala源代码,那么如何实现类似于scalac jvmphase.scala的东西?

【问题讨论】:

  • 我猜你可以将输出重定向到一个文件,然后编译那个文件?
  • @LuisMiguelMejíaSuárez 我试过了,它似乎不起作用。例如,它无法识别&lt;empty&gt; 提供identifier expected but $XMLSTART$&lt; found
  • @MarioGalic 为什么需要这个?
  • @MarioGalic 如果您想在阶段之间进行更改,也许您应该创建编译器插件。
  • @MarioGalic“编译器阶段的编译输出”听起来很奇怪。从字面上看,编译器编译源文件。编译器阶段的输出不再是源。例如jvm 阶段在erasure 阶段之后。除了原始源代码的编译结果之外,还不清楚在“编译编译器阶段的输出”时您期望得到什么。

标签: scala scalac scala-compiler


【解决方案1】:

“编译阶段的编译输出”听起来很奇怪。从字面上看,编译器编译源文件。编译器阶段的输出不再是源(尽管scalac -Xprint:... 尝试类似地打印它)。例如jvm 阶段在erasure 阶段之后。除了原始源代码的编译结果之外,还不清楚在“编译编译器阶段的输出”时您期望得到什么。

如果您想在阶段之间进行更改,也许您应该创建编译器插件。

https://docs.scala-lang.org/overviews/plugins/index.html

https://dotty.epfl.ch/docs/reference/changed-features/compiler-plugins.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多