【发布时间】:2012-02-04 12:10:57
【问题描述】:
所以,我了解 scalac 编译器与 javac 的不同之处 - 查看生成的字节码,它们看起来与 javac 生成的完全不同 - 例如没有构造函数的类。
但是运行时与在类路径中使用 scala jar 启动 java 有什么不同吗?我很确定,但有人可以确认 scala 命令只是 java 的一个薄包装器 - 毕竟他们只是启动了一个 JRE / JDK。
【问题讨论】:
所以,我了解 scalac 编译器与 javac 的不同之处 - 查看生成的字节码,它们看起来与 javac 生成的完全不同 - 例如没有构造函数的类。
但是运行时与在类路径中使用 scala jar 启动 java 有什么不同吗?我很确定,但有人可以确认 scala 命令只是 java 的一个薄包装器 - 毕竟他们只是启动了一个 JRE / JDK。
【问题讨论】:
Scala(无论如何在 linux 上)是一个脚本。输入more`which scala`可以看到内容
你是对的,它基本上是建立一个环境,然后运行 java。
【讨论】:
java 应该正确地称为jvm,因为它会运行任何编译为 java 字节码的代码,无论是什么语言。反之亦然:如果java 命令不会运行代码,那么其他程序也不会运行(除了它包含 JVM 的自定义实现)。
scala 命令基本上是一个脚本,它设置类路径,然后在 Java 运行时环境中运行您的代码。
scala 脚本中的相关行出现在末尾:
exec "${JAVACMD:=java}" $JAVA_OPTS -cp "$TOOL_CLASSPATH" -Dscala.home="$SCALA_HOME" -Denv.emacs="$EMACS" scala.tools.nsc.MainGenericRunner "$@"
基本上,这从java 开始运行MainGenericRunner。 MainGenericRunner 然后检查您是否告诉 scala 运行您的 Scala 类之一。如果是这样,它将开始运行。否则,它会启动交互式解释器。
【讨论】:
是的;您可以通过直接从java 运行您的scala 应用程序来简单地确认这一点,但在类路径上使用scala-library.jar。它有效 - scala 可执行文件中确实没有没有魔法。这就是我运行所有 scala 应用程序的方式。
【讨论】: