Question

The help menu of the Scala compiler (2.9.2) says

-print   Print program with Scala-specific features removed.

But the following call with the -print option shows Scala-specific features:

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
}

Why is the trait still shown ? I would have expected pure Java code.

Was it helpful?

Solution

The description is deceiving indeed, but it never said it would print Java code. It couldn't do that anyway: Scala generates valid bytecode, but not bytecode that can be directly translated into Java.

What it does is generate code after the cleanup phase. Now, if you try -Xshow-phases on Scala 2.9.2, you'll see this:

    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

Note that cleanup is the last phase before icode, and that's really the point. The parameter -print prints stuff after everything that changes the abstract syntax tree had a go at it. When the AST is about ready for code generation.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top