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方法是包含邏輯代碼的主體。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章