Why does Scala's Compiler show Scala specific features with “-print” Option?
質問
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.
解決
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.