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
此外,因为不免须要在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的相同目录中。
运行,成功。