Hello World
Spiga

在.NET平台上使用Scala语言(上):初尝

2009-12-18 12:47 by 老赵, 7371 visits

Scala是Java平台上的一门新兴起的语言,我也不止一次在博客上提到它。我非常希望它可以取代Java这种劣质语言,让Java平台的生产力上一个台阶。事实上,Scala从一开始——或者说“很早”就对生成.NET程序集提供了支持。只可惜,毕竟还是Java平台的东西,.NET方面的资源少之又少,不过我们还是可以进行一番尝试的。

有人经常把F#和Scala进行比较——可能都是新语言吧,毕竟C#和Java之争也有很长的历史沉淀了。不过,我倒不认为两者有什么可比性。F#是一门“拥有面向对象特性的函数式编程语言”,而Scala是一门“拥有函数式编程特性的面向对象编程语言”。事实上,从设计思路来说,Scala与C#或Java是同根的,与C#在函数式编程方便更有可比性——虽然它在追求语言灵活性的道路上走得有些极端。因此,我认为Scala可以定位作Java语言的替代品,而F#却不是C#的替代品。因为一旦F#替代了C#,便几乎代表函数式编程范式替代了面向对象编程范式。

Scala语言的名字取做“Scalable”,暗指这是一门“伸缩性”强的语言。为什么说它伸缩性强呢?我的理解是它希望可以做几乎“任何形式/风格”的程序设计。这点并非玩笑,Scala的确在走这条路。Scala的语言非常灵活,语法的“变化”非常复杂。我一直说,这门语言实在是太甜了——到处是糖,而且可谓“无所不用其极”。Scala似乎希望在一切可以节省的地方,如括号,标识符,进行节省。还例如,Scala的import支持引入整个包,包的一部分,整个包但排除某个类,甚至在方法内部引入成员。再例如成员的访问级别,除了典型的public,protected,private之外,它还引入了“当前对象”这种访问级别(private是相同“类”)。

但是,要知道Scala最终还是编译为Java平台上的二进制格式,也就是说Scala的功能事实上是受平台限制的。因此,使用Scala一些高级功能编译出的结果,其实是无法被Java语言体现出来的——这也是我为什么会说Scala的定位像是“取代”Java,而不是与Java共存。

至于我尝试Scala.NET的原因在于:

  • 熟悉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文件,内容是:

import System.Console

object 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的相同目录中。

运行,成功。

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

43 条回复

  1. 老赵
    admin
    链接

    老赵 2009-12-18 12:48:00

    下次再简单分析一下……

  2. xiao_p
    *.*.*.*
    链接

    xiao_p 2009-12-18 12:52:00

    占个板凳先。

    老赵,F#看什么书比较好,入门的话,<Foundation F#>怎么样?

  3. 箜
    *.*.*.*
    链接

    2009-12-18 12:55:00

    语言是越来越多了。。

  4. CoolCode
    *.*.*.*
    链接

    CoolCode 2009-12-18 12:56:00

    你引用的那篇文章打不开啊~

  5. xiao_p
    *.*.*.*
    链接

    xiao_p 2009-12-18 12:57:00

    总感觉做了好多年编程了,学个新语言应该没有什么问题,但是对于非类C的语言看起来还是别扭,是功力不到?老赵有没有这样的问题?

  6. 鹤冲天
    *.*.*.*
    链接

    鹤冲天 2009-12-18 13:00:00

    Scala、F#又是两门语言,有点吃不消了...

  7. Icebird
    *.*.*.*
    链接

    Icebird 2009-12-18 13:01:00

    因为一代F#替代了C#

  8. Gsanidt
    *.*.*.*
    链接

    Gsanidt 2009-12-18 13:04:00

    @CoolCode
    翻墙才可以~

  9. 未注册[未注册用户]
    *.*.*.*
    链接

    未注册[未注册用户] 2009-12-18 13:07:00

    看来 Jeffrey Zhao 对Scala很感兴趣哈,,我学习快2个月,感觉还不错,思维方式需要做很大的转换,以后有问题可以多咨询Jeffrey Zhao 了.

  10. Chui-Wen Chiu[未注册用户]
    *.*.*.*
    链接

    Chui-Wen Chiu[未注册用户] 2009-12-18 13:38:00

    為何不用 IronPython ?

  11. 老赵
    admin
    链接

    老赵 2009-12-18 13:57:00

    xiao_p:
    占个板凳先。

    老赵,F#看什么书比较好,入门的话,<Foundation F#>怎么样?


    不知道啊……已有的书全都过期了,F#还是颇有些改变的……

  12. 老赵
    admin
    链接

    老赵 2009-12-18 13:57:00

    Chui-Wen Chiu:為何不用 IronPython ?


    都会搞的,不冲突的。

  13. 老赵
    admin
    链接

    老赵 2009-12-18 13:58:00

    @xiao_p:总感觉做了好多年编程了,学个新语言应该没有什么问题,但是对于非类C的语言看起来还是别扭,是功力不到?老赵有没有这样的问题?


    写写程序就顺手了,我现在写F#很顺手阿,2个月前还要拼命看编译器提示的。

  14. 木野狐(Neil Chen)
    *.*.*.*
    链接

    木野狐(Neil Chen) 2009-12-18 13:59:00

    二楼的“板凳”,“老赵”,猛一看看成了
    赵老板 -_-!!

  15. 老赵
    admin
    链接

    老赵 2009-12-18 13:59:00

    未注册:看来 Jeffrey Zhao 对Scala很感兴趣哈,,我学习快2个月,感觉还不错,思维方式需要做很大的转换,以后有问题可以多咨询Jeffrey Zhao 了.


    哪些方面要转化亚?

  16. RednaxelaFX
    *.*.*.*
    链接

    RednaxelaFX 2009-12-18 14:06:00

    xiao_p:
    占个板凳先。

    老赵,F#看什么书比较好,入门的话,<Foundation F#>怎么样?


    强力插入广告:《Programming F#》不知道怎样,还没读到。不过好歹是比较新的,比《Expert F#》之类的几本都要更符合现状些。

  17. 老赵
    admin
    链接

    老赵 2009-12-18 14:07:00

    @RednaxelaFX
    RFX老大可好?

  18. OOLi
    *.*.*.*
    链接

    OOLi 2009-12-18 14:13:00

    我非常希望它可以取代Java这种劣质语言

  19. 老赵
    admin
    链接

    老赵 2009-12-18 14:17:00

    @OOLi
    说滴好

  20. CoolCode
    *.*.*.*
    链接

    CoolCode 2009-12-18 14:29:00

    Gsanidt:
    @CoolCode
    翻墙才可以~


    墙外风景还真好

  21. Gsanidt
    *.*.*.*
    链接

    Gsanidt 2009-12-18 14:36:00

    老赵的MSN是好多哇?

  22. 老赵
    admin
    链接

    老赵 2009-12-18 14:43:00

    @Gsanidt
    满了。

  23. 麦子|君子兰
    *.*.*.*
    链接

    麦子|君子兰 2009-12-18 15:01:00

    关注一下斯卡拉~

  24. RednaxelaFX
    *.*.*.*
    链接

    RednaxelaFX 2009-12-18 15:16:00

    Jeffrey Zhao:
    @RednaxelaFX
    RFX老大可好?


    近两周比较杯具。诶总是就是修bug补测试。诶。

  25. Ivony...
    *.*.*.*
    链接

    Ivony... 2009-12-18 15:28:00

    如此说来。。。。Scala也是.NET平台的语言了,所缺的无非是一个IDE了。貌似从VS2008开始就支持创造定制语言的IDE了。

  26. 老赵
    admin
    链接

    老赵 2009-12-18 15:31:00

    @Ivony...
    也不是……下篇文章我想说的是,其实Scala支持的是mono的那个mscorlib.dll,版本1.0.0.0,想要利用.net 3.5还很难。
    具体我还在分析。我想,经过一些修改可能还是可以支持.net 3.5的,但是需要调整。

  27. sssssssssssssssssssssss[未注册用户…
    *.*.*.*
    链接

    sssssssssssssssssssssss[未注册用户] 2009-12-18 17:00:00

    @Jeffrey Zhao
    比如说 我上次看到的一段代码就比较难理解
    type of[m[_],t]=m[t]
    这段代码就是讲的of的中缀表达式的使用.

  28. toEverybody
    *.*.*.*
    链接

    toEverybody 2009-12-18 17:07:00

    完了,完了,离计算机越来越远了,回归底层的程序员商机无限.....计算机是什么?再地10年有许多人根本不知道了,10年,新生的程序员如果你再问他什么是计算机的话,他一定会说: 计算机就是F#,计算机就是C#,计算机就是Scale,..........哈哈..

  29. 老赵
    admin
    链接

    老赵 2009-12-18 17:15:00

    @toEverybody
    底层和高层就是个围城

  30. ︶ㄣ木べ头
    *.*.*.*
    链接

    ︶ㄣ木べ头 2009-12-18 17:39:00

    F#是一门“拥有面向对象特性的函数式编程语言”,而Scala是一门“拥有函数式编程特性的面向对象编程语言”。


    一句话,让我明白了他们的区别,呵呵

  31. 幸存者
    *.*.*.*
    链接

    幸存者 2009-12-18 21:31:00

    RednaxelaFX:

    xiao_p:
    占个板凳先。

    老赵,F#看什么书比较好,入门的话,<Foundation F#>怎么样?


    强力插入广告:《Programming F#》不知道怎样,还没读到。不过好歹是比较新的,比《Expert F#》之类的几本都要更符合现状些。


    《Programming F#》似乎有两本,一本是Animal Guide,另一本是Definitive Guide,后者的作者是F#的主要设计者之一Don Syme,看上去应该不错。

  32. Hunts.C
    *.*.*.*
    链接

    Hunts.C 2009-12-18 21:47:00

    @CoolCode
    Google Cache可以找到这篇

  33. 无常
    *.*.*.*
    链接

    无常 2009-12-18 22:22:00

    代码看起来比c#罗嗦

  34. 老赵
    admin
    链接

    老赵 2009-12-18 22:50:00

    @无常
    不是吧,为什么这么说?

  35. coordinator
    *.*.*.*
    链接

    coordinator 2009-12-19 03:07:00

    不如python,遑论scheme。

  36. Old
    *.*.*.*
    链接

    Old 2009-12-19 09:13:00

    /******************************************/
    ** 我还在看C呢?都没100%掌握...
    /******************************************/

  37. 老赵
    admin
    链接

    老赵 2009-12-19 11:49:00

    coordinator:不如python,遑论scheme。


    谈谈scheme的优势?

  38. winter-cn
    *.*.*.*
    链接

    winter-cn 2009-12-19 21:18:00

    Jeffrey Zhao:

    @xiao_p:总感觉做了好多年编程了,学个新语言应该没有什么问题,但是对于非类C的语言看起来还是别扭,是功力不到?老赵有没有这样的问题?


    写写程序就顺手了,我现在写F#很顺手阿,2个月前还要拼命看编译器提示的。


    可我还是不喜欢学新语言

    F#是函数式的 所以可能稍微有点诡异

  39. winter-cn
    *.*.*.*
    链接

    winter-cn 2009-12-19 21:27:00

    coordinator:不如python,遑论scheme。


    谈论语言居然如此轻率 各种语言都有擅长和不擅长 何来如与不如?

    你的语气 就好像scheme比python强是世人皆知的事情 真是受不了这些无知的言论。

  40. winter-cn
    *.*.*.*
    链接

    winter-cn 2009-12-19 21:31:00

    toEverybody:完了,完了,离计算机越来越远了,回归底层的程序员商机无限.....计算机是什么?再地10年有许多人根本不知道了,10年,新生的程序员如果你再问他什么是计算机的话,他一定会说: 计算机就是F#,计算机就是C#,计算机就是Scale,..........哈哈..


    那又有什么不好 现在的程序员还不是不大了解高电平与低电平

  41. canbeing
    *.*.*.*
    链接

    canbeing 2009-12-20 23:06:00

    语言真多,劣质。。。

  42. 飞笑
    *.*.*.*
    链接

    飞笑 2009-12-21 13:57:00

    正想研究一下呢,被绑在微软的战车上太久了……

  43. Pvistely
    *.*.*.*
    链接

    Pvistely 2009-12-22 17:02:00

    今天刚看到这玩意,不知道是不是意味着以后的JAVA可以与.NET进行"混编"?

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我