程式扎記: [Scala 小學堂] Scala Gossic : 起步走 - 基本環境與指令 (scalac 與 fsc)

標籤

2016年4月6日 星期三

[Scala 小學堂] Scala Gossic : 起步走 - 基本環境與指令 (scalac 與 fsc)

轉載自 這裡 
前言 : 
Scala 是一個可直譯、可編譯、靜態、可運行於 JVM 之上、可與 Java 互操作、融合物件導向編程特性與函式編程風格的程式語言. 從一些簡單的語法開始,了解 Scala 的許多特性,所以就算是起步走,東西也夠多了. 簡單的小程式可以使用 scala 指令,編譯的事就交給 scalac,編譯想快點就用 fsc. (Scala 官網

scalac 與 fsc : 
你可以在一個純文字檔案中撰寫程式碼,然後使用 scala 指令 直譯為位元組(byte code)後運行於JVM之上。你也可以撰寫程式碼,使用 scalac 指令將程式碼編譯為.class檔案,而後使用 scala 指令來執行。如果你要這麼作,則要定義 object,並撰寫程式進入點,例如 
- Hello2.scala 代碼 :
  1. object Hello2 {  
  2.     def main(args: Array[String]) {  
  3.         println("Hello!" + args(0) + "!")  
  4.     }  
  5. }  

object 在 Scala 中用來定義單例物件(Singleton object),技術上來說,在程式運行時,Hello2 名稱實際是參考至 Hello2$ 類別的物件,不過就現階段而言,你還不用深入了解,你只要先記得,Scala 程式要編譯為位元碼後,若要提供 JVM 執行程式的程式進入點,必須使用以上的形式。def 定義了一個main方法,函式中 args 是個參考名稱,型態是字串陣列(Array[String]),用來收集執行程式時所提供的命令列引數. 
要注意的是,表面上看來,雖然上面這個程式有點像是在 Java 中定義主類別以及一個 static 的 main 程式進入點,不過這並不正確,Scala 並沒有 static 定義的語法
程式的檔案名稱可以命名為 Hello2.scala,不過也可以取其它的名稱,慣例上會使用與 object 名稱或 class 名稱相同的檔案名稱,如此別人可以很方便地找到原始碼進行檢視, 要編譯這個程式碼,可以使用以下的指令 : 
# scalac Hello2.scala
# ls Hello2*
Hello2$.class Hello2.class Hello2.scala


這會在你的指令執行路徑下產生編譯好的.class檔案,若要執行,則可以使用 scala 指令,例如 : 
# scala Hello2 Mary
Hello!Mary!


Scala 程式碼是編譯為 .class,也是運行於JVM之上,所以實際上,你也可以使用JDK的java指令來運行,不過必須在 Classpath中包括Scala的程式碼 scala-library.jar,這是位於 Scala 安裝目錄 lib 目錄中,一個執行簵例如下 : 
# ls /usr/share/java/scala-library-2.9.2.jar // Check the location of scala-library-x.x.x.jar
/usr/share/java/scala-library-2.9.2.jar 
# java -cp .:/usr/share/java/scala-library-2.9.2.jar Hello2 Ken
Hello!Ken!


Ps. 想要知道scalac有哪些選項可以使用,可以使用 -help 引數,大多數的引數與 javac 的引數作用是相同的. 

每次啟動 scalac 指令,都必須掃描所有使用到的 JAR 檔案內容,並作一些初始化的動作,接著才是真正編譯程式碼。Scala 提供了一個 fsc 指令,第一次啟動 fsc 指令時,會啟動一個本地端編譯伺服器(Compile server)來進行一些掃描 JAR 檔案及初始化動作,然後編譯程式碼 : 
# fsc Hello2.scala


再次啟動 fsc 指令時,由於編譯伺服器先前已啟動過了,因此只要將程式碼送到伺服器上編譯就可以了,因此可以較快的速度完成編譯的動作。如果想要關閉編譯伺服器,則可以使用 -shutdown 引數 : 
# fsc -shutdown
[Compile server exited]

在撰寫具程式進入點的 object 定義時,可以如上的範例定義 main() 方法,或者你可以使用 Application 特徵(Trait),例如 : 
- 範例代碼 :
  1. object Hello extends Application {  
  2.     println("Hello!Scala!")  
  3. }  

要使用 Application 特徵,你使用 extends 關鍵字,特徵在Scala中可用來定義方法及域(field)成員,以用來混入(mix into)其它類別或物件時擴充其行為,現階段你還不需要深入了解。目前只需要知道,Application 特徵宣告了main() 方法,你的 Hello2 繼承了這個方法定義(或說是,你的類別繼承了 Application 的特徵),而你在大括號之間所撰寫的程式碼,其實會是object 的主要建構式Primary constructor),會在物件實例化時執行,結果就是你只要在 extends Application 之後,在大括號之間撰寫你的程式就可以了,不過這個方法的限制就是,你無法取得命令列引數,而在一些JVM實作中,沒有最佳化物件的初始化程式碼,因此建議只用在相對簡單的應用程式

補充說明 : 
指令互動環境 
scala 指令 
scalac 與 fsc

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!