18
當我從命令行運行如下內容時,究竟發生了什麼?運行'.scala'程序時,Scala運行時/ REPL背後發生了什麼?
> scala hello.scala
是否有hello.class生成,執行,然後丟棄?或者Scala在這種情況下表現得像解釋器一樣?我只是想,當然,我不能這樣做Java:
> java hello.java
當我從命令行運行如下內容時,究竟發生了什麼?運行'.scala'程序時,Scala運行時/ REPL背後發生了什麼?
> scala hello.scala
是否有hello.class生成,執行,然後丟棄?或者Scala在這種情況下表現得像解釋器一樣?我只是想,當然,我不能這樣做Java:
> java hello.java
是的,有一個hello.class生成。 scala -Xprint:parser hello.scala foo bar
你會看到代碼如何被改寫:如果使用-Xprint:parser
選項運行編譯器將包裝你的代碼Main
對象的內部,編譯那麼執行Main.main
的
println(args.mkString)
println(argv.mkString)
給出hello.scala
package <empty> {
object Main extends scala.ScalaObject {
def <init>() = {
super.<init>();
()
};
def main(argv: Array[String]): scala.Unit = {
val args = argv;
{
final class $anon extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
println(args.mkString);
println(argv.mkString)
};
new $anon()
}
}
}
}
然後編譯這段代碼(我相信是一個內存文件系統 - 但我不確定)並執行。查看ScriptRunner
,我看到在默認的臨時文件夾下創建了一個臨時目錄。例如看我的系統,我看到一堆%TEMP%/scalascript*
文件夾。
請注意,即使在解釋器中,代碼也不會被解釋。有關更多信息,請參見Scala: Is there a default class if no class is defined?(它正在被重寫,編譯和評估)。
編譯器如何使'val args = argv'?如果有人輸入'println(arguments.mkString)'?會有'val arguments = argv'嗎? –
@PeterSchmitz,'args'和'argv'是硬編碼的,請參閱https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala #L358和388行。這些名稱只是C('argv')和Java編程('args')的約定。如果你輸入'println(arguments.mkString)',你會得到一個編譯器錯誤,因爲'arguments'沒有被定義。 – huynhjl
謝謝,不知道。雖然我有點驚訝!據我所知,「硬編碼」通常不是很好... –