scala解释器如何直接执行源文件而不创建类文件

时间:2016-12-07 08:54:09

标签: scala

我有这个scala代码

object S extends App{
    println("This is trait program")
}

执行scala S.scala时执行正常。 现在我想知道如何在不编译和创建类文件的情况下执行代码。

4 个答案:

答案 0 :(得分:3)

Scala是一种编译语言,需要编译代码,执行时需要.class文件。

也许您正在考虑使用REPL,您可以在其中交互式编码:https://www.scala-lang.org/documentation/getting-started.html#run-it-interactively

但是,在引擎盖下,REPL正在编译你的代码,并执行编译的.class

答案 1 :(得分:1)

您正在启动的命令scala用于启动Scala REPL,如果您提供文件作为参数,它将执行它将执行文件的内容,就好像它是批量粘贴的一样一个REPL。

Scala确实是一种编译语言,但这并不意味着需要.class文件。 Scala编译器需要做的就是生成相关的JVM字节代码并使用该字节代码调用JVM。这并不意味着它显然必须在您调用它的目录中创建一个.class文件。它可以使用内存和临时存储来完成所有操作,只需使用生成的字节代码调用JVM即可。

如果您希望使用Scala显式生成类文件,以后可以通过手动调用java来执行,则应使用Scala编译器CLI(命令:scalac)。

请注意,Scala编译器具有检查并可能动态编译Scala代码的接口,这对IDE非常有用(checkout IntelliJ和Ensime)。

答案 2 :(得分:0)

就Java代码转换的源代码而言,Scala是一种编译语言,但是可以采用一些技巧使其类似于解释语言。一个天真的实现是,当运行scala myscript.scala时,它遵循以下步骤:

  1. scalac Myscript.scala。它生成S.class(包含main方法的入口类)以及可能的其他类文件。
  2. scala -cp . S。这从类的主条目运行/解释 文件。 -cp .指定类路径; S是没有文件扩展名.class的条目类。请注意,运行 / 解释意味着解释(java)字节码(而不是Scala / Java源代码),这是由JVM运行时完成的。
  3. 删除所有临时生成的类文件。只要用户不知道临时文件(即透明给用户),此过程是可选的。
  4. 也就是说,scala充当驱动程序,可以处理0)初始化1)编译(scalac)2)执行/运行({{1} 3)清理。 实际过程可能不同(例如,由于性能问题,某些文件仅在内存中/缓存中,或未生成,或未被删除,使用scala驱动程序等的低级API)但是一般想法应该是相似的。 在Linux机器上,您可能会在scala文件夹中找到一些证据。对我来说,

    /tmp

    值得注意的是,这种运行Scstepsala的方式并不完整。例如,不支持$ tree /tmp /tmp ├── hsperfdata_hongxu │   └── 64143 └── scala-develhongxu ├── output-redirects │   ├── scala-compile-server-err.log │   └── scala-compile-server-out.log └── scalac-compile-server-port └── 34751 4 directories, 4 files 声明。

    package

    它发出错误:

    # MyScript.scala
    package hw
    object S extends App {
      println("Hello, world!")
    }
    

    其他人也提到了REPL(read-eval-print循环),它非常相似。基本上,几乎每种语言都可以拥有(交互式)解释器。以下是wikipedia的文字:

      

    可以创建REPL以支持任何语言。 REPL对编译语言的支持通常通过在虚拟机之上实现解释器来实现,该虚拟机为编译器提供接口。编译语言的REPL示例包括CINT(及其后继Cling),Ch和BeanShell

    然而,由于其动态特性和运行时VM /解释器,解释语言(Python,Ruby等)通常更优越。

    此外,$ scala Myscript.scala .../Myscript.scala:1: error: illegal start of definition package hw ^ one error found compiled之间的差距并不大。你可以看到Scala实际上有一些解释功能(至少它出现),因为它让你觉得你可以像脚本语言一样执行。

答案 3 :(得分:0)

只需在对象上调用main()(从App继承此方法):

S.main(Array())

main()需要Array[String],因此您只需提供一个空数组。