接触过许多编程语言后,对Scala也就不那么热心了。一句话,Scala有的,有什么是在其它编程语言中没有的么?像函数式编程语言、面向对象编程,找了一打,也找不到以Scala为代表。在具体特性上,Python的字典,比Scala的映射表其实更为好用。在叠代上,Python至少更方便,而且C#的LINQ查询似乎比Scala走得更远。Scala是静态类型的,而现在,有很多脚本语言已经成为了“高级动态语言”,这也是Scala望尘莫及的。
个人觉得,对Scala语言的正确定位是,它是一种新的开发应用的方式,按照Scala的这种方式,并不需要激进的革命,传统的程序员就可以完成转型。因此,软件工程与编程语言的结合得到了保留,一个语言同时也就是为一个软件工程而生。
甚至C#,因为所使用的CLR技术,比Scala更强调机器的技术。Java和Scala一系的基础结构其实很简单,就是脱离机器的JVM虚拟机。得益于对这个虚拟机的优化,它们得以演变成独立的生态环境。而像Python与Ruby这样的,对于怎样编译其实并不关心,因为有CLR帮助它们,所以Python与Ruby可以更强调编程的灵活。
Scala的安装、配置和基本使用
Scala与Java有许多相通之处,因此用Java的观点看Scala往往可以减少学习曲线的坡度。有人说,一周学一打语言都不算是值得称道的计算机科学家,此话对于Scala也是适应用的。
可参见Donald E. Knuth的大作《The Art of Computer Programming》。
在Ubuntu下面,安装scala程序之简单,就不必说了。安装好之后,将会得到scala、scalac、scalap、scaladoc、fsc几个命令。由于Scala的语法糖中有一个是既可作为命令式语言中的脚本,也可作为所有方法都在对象中的类(Java),所以scala既可以作为Scala语言的解释器,也可以作为运行所谓Scala字节码的运行时环境。该技术的实现另有细节,现在只需记住这两种方式即可。
直接运行scala命令,可以进入脚本式执行环境。里面可以逐个写Scala语句,而不用担心非得使用面向对象的编程,像Java那样,把程序写在类里面。scala命令也可以直接运行一个标准的Scala程序,不过由于每次都要加载大量的类库,即使运行一个HelloWorld这样的程序,需要的时间也相当长。因此把Scala当成一个脚本语言,显得非常别扭。
scalac命令是把scala代码编译成字节码格式,以便以后脱离开发环境也能执行。编译生成的 .class 文件,可以交由scala命令直接处理,运行的速度还可以。不过,Scala的scalac编译器编译HelloWorld这样的程序的时候,也是相当慢,为此有了一个人性化的方案,即使用fsc编译,fsc的作用就是开启一个守护进程,将本次编译之前加载的库文件都缓存下来,下次调用fsc的时候,直接从里面取,因此就加快了编译的速度。
说到底,Scala的scala、scalac、scaladoc工具,与Java的java、javac、javadoc可以分别对应,在Java里怎样使用后者,就可以在Scala里怎样使用前者。scalap可以看成是一个逆向工程工具,用于解码Scala类文件。
平常学习的话,使用scala程序直接写脚本,并使用scala运行即可。此外,Martin Odersky等蓍的《Scala Programming》一书的“附录A:Unix和Windows下的Scala脚本”介绍了把scala脚本当成系统的可执行文件的方法。看起来有用,但是那样用的时候,Scala在各种脚本语言与高级动态语言中显得特别笨重、缓慢,使用它太破坏体验了。这种方法,便就不再介绍了。
Scala概述
定位Scala的正确思路,或许是把Scala看成是Java的自然延伸。这里的自然延伸是从编程语言大家族的发展来看的。Java本身与C和C++相比,其进步并不是很大,但是其业务确实很成功。近些年来,函数式编程、动态类型等开始变得流行,使得传统指令式语言受到一定的冲击。应用型编程语言尤其应当得到改进。因为人们看到了它们存在很多能力上的限制。对于单片机程序的开发语言来说,C语言的短处是它们不必看到的,相反,因为基础,还有更多的长处;对于函数式语言编程者来说,LISP等语言现在已发展得很成熟。不仅有严密的理论,也实现了许多的库,甚至以LISP语言实现了操作系统。所以,Java与Scala好像是正夹在中间,其缺点正好为广大的应用开发者所在意。那么,Java的改进就十分现实了。
在设计软件产品上,很多时候,一开始的思想固定下来后,再对它修修补补,还不如来一场更彻底的革命。Java虽然做了很多的改进,然而这些改进似乎不仅不能转化成优势,而且使语言本身变得更为复杂,不得不全部推倒,重新实现。其结果,大概就是现在的Scala了。
Scala本身仍是面向对象的、静态类型的语言。这可能是出于符合现在应用程序员的习惯,也可能是不得不这么做。这使得函数式编程还不能成为该语言的核心卖点。这么说吧。把Scala看成是改进的Java。
即使在Java当中,语法特性也并不值得单独去讲。因此在Scala中,对于经典的数据类型、函数、运算符、控制语句,都略写;对于Scala在业务应用上的特点给以重点的介绍。如线程与消息处理机制。另外,不变类型、 \(\lambda\)-演算,笔者在其它语言中也接触过许多,也作简略处理。
一句话,Scala不适合作算法级(结构级)的编程语言,它主要是一个工程级(应用级)的编程语言。
单独运行的Scala程序
要使Scala程序能单独运行(在Scala中,指的是可以编译成字节码在Scala虚拟机中执行,并非操作系统直接可认知),程序就要有一个main方法。该方法仅有一个 Array[String] 作为参数,并以 Unit作为返回类型。任何拥有这样签名的main方法的单例对象都可以作为程序的入口。
单独运行的Scala程序示例
object Hello {
def main(args: Array[String]) {
for (arg <- args) println("Hello, World!")
}
}Scala应用程序源文件一般以 .scala 作为后缀。