我有这个scala代码
object S extends App{
println("This is trait program")
}
执行scala S.scala
时执行正常。
现在我想知道如何在不编译和创建类文件的情况下执行代码。
答案 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
时,它遵循以下步骤:
scalac Myscript.scala
。它生成S.class
(包含main
方法的入口类)以及可能的其他类文件。scala -cp . S
。这从类的主条目运行/解释
文件。 -cp .
指定类路径; S
是没有文件扩展名.class
的条目类。请注意,运行 / 解释意味着解释(java)字节码(而不是Scala / Java源代码),这是由JVM运行时完成的。也就是说,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]
,因此您只需提供一个空数组。