Scala Scala程序的执行过程原理简述

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打开这两个文件:
  1. 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$() {
    }
}
  1. 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方法是包含逻辑代码的主体。
发布了70 篇原创文章 · 获赞 4 · 访问量 3017

猜你喜欢

转载自blog.csdn.net/qq_34515959/article/details/105152756