【问题标题】:What really happens behind the Scala runtime/REPL when running a '.scala' program?运行“.scala”程序时,Scala 运行时/REPL 背后到底发生了什么?
【发布时间】:2011-12-01 02:15:49
【问题描述】:

当我从命令行运行类似以下内容时,到底会发生什么?

> scala hello.scala

是否有生成、执行、然后丢弃的 hello.class?或者在这种情况下,Scala 是否表现得像解释器?我只是在想,当然,我不能对 Java 做同样的事情:

> java hello.java

【问题讨论】:

    标签: scala read-eval-print-loop


    【解决方案1】:

    是的,生成了一个 hello.class。编译器会将您的代码包装在 Main 对象中,编译它然后执行 Main.main,给定 hello.scala

    println(args.mkString)
    println(argv.mkString)
    

    如果您使用-Xprint:parser 选项运行:scala -Xprint:parser hello.scala foo bar,您将看到代码是如何被重写的:

    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、argsargv 是硬编码的,请参阅 github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/… 和第 388 行附近。这些名称只是 C (argv) 和 Java 编程 (@987654338) 的约定@)。如果您键入 println(arguments.mkString),您将收到编译器错误,因为未定义 arguments
    • 谢谢,不知道。虽然有点意外!据我所知,“硬编码”一般来说并不好......
    • @Peter 只是一个标识符,比如入口方法叫main,打印东西的方法叫println。我看不出有什么问题,也看不出你为什么会想要它……毕竟它必须被称为某种东西
    • @LuigiPlinge Acknowledged,println 尤其是 main 也是“硬编码”的,但我很困惑,像 args 这样的方法参数名称当时是“硬编码”的(但是我对此很好,args 必须有一个名称,因为不能明确说明),当我自己填充类中的 main 方法而不是由 REPL 构造时,我可以选择它(或者可能扩展 @ 987654347@)。一切都很好:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多