Scala是一门函数式编程语言,同时也是一门基于JVM虚拟机运行的语言。由于大数据框架Spark的兴起,Scala也逐渐被人们所熟知。在这篇博客,我们来了解一下一个Scala "Hello word"程序是如何执行的。
在此之前,我们先要知道Scala代码是这样编译并执行的:程序员编写Scala代码,代码可能同时包含Java和Scala的类库。代码被执行期间,它先被Scala编译器编译成.class文件(低级语言的代码),之后该.class文件被为Scala特制的JVM虚拟机(兼容Java类库)解释执行。其实,可以理解Scala特制的JVM虚拟机是Java虚拟机的超集,所以有时Java虚拟机可以编译Scala的.class字节码文件。
-
安装并设置Scala运行环境。步骤比较简单,所以这里先省略,有机会另外写一篇博客介绍。读者也可以根据Scala官网的提示来进行下载和安装:Scala 官网下载和安装
-
这里通过IDEA写一个Scala “Hello World” 程序:
object helloWorld{
def main(args: Array[String]): Unit = {
println("hello!")
}
}
- 使用IDEA编译并执行该代码之后,我们可以到out文件夹下查看被编译产生的.class文件,发现有两个.class文件:
- 使用反编译软件Luyten打开这两个文件:
- helloWorld$.class:
import scala.*;
public final class helloWorld$
{
public static final helloWorld$ MODULE$;
static {
MODULE$ = new helloWorld$();
}
public void main(final String[] args) {
Predef$.MODULE$.println((Object)"hello!");
}
private helloWorld$() {
}
}
- helloWorld.class:
import scala.reflect.*;
@ScalaSignature(bytes = "\u0006\u0005%:Q\u0001B\u0003\t\u0002!1QAC\u0003\t\u0002-AQAE\u0001\u0005\u0002MAQ\u0001F\u0001\u0005\u0002U\t!\u0002[3mY><vN\u001d7e\u0015\u00051\u0011a\u0002\u001ff[B$\u0018PP\u0002\u0001!\tI\u0011!D\u0001\u0006\u0005)AW\r\u001c7p/>\u0014H\u000eZ\n\u0003\u00031\u0001\"!\u0004\t\u000e\u00039Q\u0011aD\u0001\u0006g\u000e\fG.Y\u0005\u0003#9\u0011a!\u00118z%\u00164\u0017A\u0002\u001fj]&$h\bF\u0001\t\u0003\u0011i\u0017-\u001b8\u0015\u0005YI\u0002CA\u0007\u0018\u0013\tAbB\u0001\u0003V]&$\b\"\u0002\u000e\u0004\u0001\u0004Y\u0012\u0001B1sON\u00042!\u0004\u000f\u001f\u0013\tibBA\u0003BeJ\f\u0017\u0010\u0005\u0002 M9\u0011\u0001\u0005\n\t\u0003C9i\u0011A\t\u0006\u0003G\u001d\ta\u0001\u0010:p_Rt\u0014BA\u0013\u000f\u0003\u0019\u0001&/\u001a3fM&\u0011q\u0005\u000b\u0002\u0007'R\u0014\u0018N\\4\u000b\u0005\u0015r\u0001")
public final class helloWorld
{
public static void main(final String[] args) {
helloWorld$.MODULE$.main(args);
}
}
- 通过简单地分析两段代码,我们可以知道: Scala编译器会把Scala文件编译成两个Class文件。其中,helloWorld$.class文件包含一个Java单例模式的类。helloWorld.class文件包含一个Java程序启动类,在该启动类静态main方法中调用helloWorld类的单例去执行其方法。单例中的main方法是包含逻辑代码的主体。