rudy - ¿Qué sucede realmente detrás del tiempo de ejecución/REPL de Scala cuando se ejecuta un programa ''.scala''?
musica de guillermo davila (1)
Cuando ejecuto algo como lo siguiente desde la línea de comandos, ¿qué sucede realmente?
> scala hello.scala
¿Hay un hello.class generado, ejecutado y luego descartado? ¿O Scala se comporta de alguna manera como un intérprete en este caso? Solo estoy pensando que, por supuesto, no puedo hacer lo mismo para Java:
> java hello.java
Sí, hay un hello.class generado. El compilador ajustará su código dentro de un objeto Main
, lo compilará y luego ejecutará Main.main
, dado hello.scala de
println(args.mkString)
println(argv.mkString)
Si ejecuta con la opción -Xprint:parser
: scala -Xprint:parser hello.scala foo bar
verá cómo se reescribe el código:
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()
}
}
}
}
Este código luego se compila (creo que en un sistema de archivos de memoria, pero no estoy seguro) y se ejecuta. En cuanto a ScriptRunner
, veo que se crea un directorio temporal en la carpeta temporal predeterminada. Por ejemplo, mirando mi sistema, veo un montón de carpetas %TEMP%/scalascript*
.
Tenga en cuenta que incluso en el intérprete, el código no se interpreta. Ver Scala: ¿Existe una clase predeterminada si no se define ninguna clase? Para obtener más información (en realidad se está reescribiendo, compilando y evaluando).