为什么 Scala 的编译器会"-print" Option 显示 Scala 的特定功能?



Scala编译器(2.9.2)的帮助菜单显示

-print   Print program with Scala-specific features removed.

但是以下带有-print选项的调用显示了特定于 Scala 的功能:

C:UsersJohnTest Scala Projectsrcmainscala>type test.scala
trait A
C:UsersJohnTest Scala Projectsrcmainscala>scalac -print test.scala
[[syntax trees at end of cleanup]]// Scala source: test.scala
package <empty> {
  abstract trait A extends java.lang.Object
}

为什么仍然显示该特征?我本来期望纯Java代码。

这个描述确实是骗人的,但它从来没有说过它会打印Java代码。无论如何,它都无法做到这一点:Scala生成有效的字节码,但不能生成可以直接转换为Java的字节码。

它的作用是在cleanup阶段之后生成代码。现在,如果你在 Scala 2.9.2 上尝试-Xshow-phases,你会看到这个:

    phase name  id  description
    ----------  --  -----------
        parser   1  parse source into ASTs, perform simple desugaring
         namer   2  resolve names, attach symbols to named trees
packageobjects   3  load package objects
         typer   4  the meat and potatoes: type the trees
superaccessors   5  add super accessors in traits and nested classes
       pickler   6  serialize symbol tables
     refchecks   7  reference/override checking, translate nested objects
  selectiveanf   8
      liftcode   9  reify trees
  selectivecps  10
       uncurry  11  uncurry, translate function values to anonymous classes
     tailcalls  12  replace tail calls by jumps
    specialize  13  @specialized-driven class and method specialization
 explicitouter  14  this refs to outer pointers, translate patterns
       erasure  15  erase types, add interfaces for traits
      lazyvals  16  allocate bitmaps, translate lazy vals into lazified defs
    lambdalift  17  move nested functions to top level
  constructors  18  move field definitions into constructors
       flatten  19  eliminate inner classes
         mixin  20  mixin composition
       cleanup  21  platform-specific cleanups, generate reflective calls
         icode  22  generate portable intermediate code
       inliner  23  optimization: do inlining
      closelim  24  optimization: eliminate uncalled closures
           dce  25  optimization: eliminate dead code
           jvm  26  generate JVM bytecode
      terminal  27  The last phase in the compiler chain

请注意,cleanupicode之前的最后一个阶段,这才是重点。参数-print在更改抽象语法树的所有内容之后打印内容。当 AST 准备好生成代码时。

相关内容

  • 没有找到相关文章

最新更新