在.NET平臺上使用Scala語言(上):初嘗

Scala是Java平臺上的一門新興起的語言,我也不止一次在博客上提到它。我很是但願它能夠取代Java這種劣質語言,讓Java平臺的生產力上一個臺階。事實上,Scala從一開始——或者說「很早」就對生成.NET程序集提供了支持。只惋惜,畢竟仍是Java平臺的東西,.NET方面的資源少之又少,不過咱們仍是能夠進行一番嘗試的。html

有人常常把F#和Scala進行比較——可能都是新語言吧,畢竟C#和Java之爭也有很長的歷史沉澱了。不過,我倒不認爲二者有什麼可比性。F#是一門「擁有面向對象特性的函數式編程語言」,而Scala是一門「擁有函數式編程特性的面向對象編程語言」。事實上,從設計思路來講,Scala與C#或Java是同根的,與C#在函數式編程方便更有可比性——雖然它在追求語言靈活性的道路上走得有些極端。所以,我認爲Scala能夠定位做Java語言的替代品,而F#卻不是C#的替代品。由於一旦F#替代了C#,便幾乎表明函數式編程範式替代了面向對象編程範式。node

Scala語言的名字取作「Scalable」,暗指這是一門「伸縮性」強的語言。爲何說它伸縮性強呢?個人理解是它但願能夠作幾乎「任何形式/風格」的程序設計。這點並不是玩笑,Scala的確在走這條路。Scala的語言很是靈活,語法的「變化」很是複雜。我一直說,這門語言實在是太甜了——處處是糖,並且可謂「無所不用其極」。Scala彷佛但願在一切能夠節省的地方,如括號,標識符,進行節省。還例如,Scala的import支持引入整個包,包的一部分,整個包但排除某個類,甚至在方法內部引入成員。再例如成員的訪問級別,除了典型的public,protected,private以外,它還引入了「當前對象」這種訪問級別(private是相同「類」)。編程

可是,要知道Scala最終仍是編譯爲Java平臺上的二進制格式,也就是說Scala的功能事實上是受平臺限制的。所以,使用Scala一些高級功能編譯出的結果,實際上是沒法被Java語言體現出來的——這也是我爲何會說Scala的定位像是「取代」Java,而不是與Java共存。編程語言

至於我嘗試Scala.NET的緣由在於:ide

  • 熟悉Scala語言。目前有一些有趣的,有用的類庫是用Scala實現的,相信之後也會愈來愈多。
  • 借Scala語言及.NET平臺與Java平臺的差別。
  • 觀察Scala一些語言特性在IL上的表現——畢竟.NET領域對於IL的追求,比Java領域追求Byte Code有羣衆基礎得多,且我更熟悉.NET平臺。

此外,因爲不免須要在Java平臺上編寫程序,若是能夠用Scala的話,我真的不想再使用Java語言了。函數式編程

對於Scala@.NET來講,Scala官方文檔上的指導是基於Scala 1.4(最新的Scala是2.7.7)的,已經徹底不可用。若是在互聯網上查找內容,也寥寥無幾。最終我藉助這篇文章起步。函數

首先,你須要先去下載Scala的SDK,並將其解壓縮。例如,我如今將它存放在D:\scala-2.7.7.final中,其中包含幾個目錄,比較重要的有:工具

bin      <- 各工具及腳本
lib      <- 工具或類庫的jar包
src      <- 源文件
code     <- 我建立的文件夾,用於存放測試代碼

首先,Scala SDK中並不直接包含「好用」的輔助腳本,咱們須要使用sbaz.bat獲取.NET的支持腳本。sbaz.bat會調用sbaz.jar包裏的程序,它至關於Scala的包或腳本管理器。因而:測試

D:\scala-2.7.7.final> bin\sbaz.bat install scala-msil

執行後,bin目錄下會多出scalac-net.bat及其餘一些文件,在lib目錄下則多出三個文件,分別是mscorlib.dll,predef.dll和scalaruntime.dll。而後咱們在code目錄下放置一個test.scala文件,內容是:spa

import System.Consoleobject test extends Application {
    override def main(args: Array[String]) = {
        Console.WriteLine("Hello .NET World!")
    }
}

而後使用scalac-net.bat將它編譯成IL文件:

D:\scala-2.7.7.final\code> ..\bin\scalac-net.bat test.scala

這樣在code目錄下便生成了test.msil,再使用ilasm即可以將其轉化爲.NET程序集了:

D:\scala-2.7.7.final\code> ilasm test.msil /exe

最後,還須要將在lib目錄裏的3個dll文件複製到與test.exe的相同目錄中。

運行,成功。

相關文章
相關標籤/搜索