为什么Scala的Compiler使用“-print”选项显示Scala特定功能?

时间:2012-06-27 22:30:50

标签: scala scalac

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

-print   Print program with Scala-specific features removed.

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

C:\Users\John\Test Scala Project\src\main\scala>type test.scala
trait A

C:\Users\John\Test Scala Project\src\main\scala>scalac -print test.scala
[[syntax trees at end of cleanup]]// Scala source: test.scala
package <empty> {
  abstract trait A extends java.lang.Object
}

为什么特质仍然显示?我原本期望纯Java代码。

1 个答案:

答案 0 :(得分:10)

描述确实是欺骗性的,但它从未说过会打印 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准备好代码生成时。