在某种意义上,Scala是一种与Java平行的语言.它的源代码被编译成Java的bytecode,运行于Java虚拟机之上.正因为在JVM级是兼容的,Scala里可以调用Java的库. 这是用Scala写的HelloWorld程序
object HelloWorld extends App { println("Hello, world!") }
那Scala和Java比有啥不一样的地方?
Scala这个语言的设计初衷是融合面向对象(OO)的设计思想(以C++,Java,Object C为代表)和函数式编程(functional programming)的思想(以Lisp,Haskell,ML为代表). Scala的设计优美的融合了这两种截然不同的风格.以quick sort为例,大家可以看一下Scala如何分别用普通的C风格和Haskell风格来实现:
def sort(xs: Array[Int]) { def swap(i: Int, j: Int) { val t = xs(i); xs(i) = xs(j); xs(j) = t } def sort1(l: Int, r: Int) { val pivot = xs((l + r) / 2) var i = l; var j = r while (i <= j) { while (xs(i) < pivot) i += 1 while (xs(j) > pivot) j -= 1 if (i <= j) { swap(i, j) i += 1 j -= 1 } } if (l < j) sort1(l, j) if (j < r) sort1(i, r) } sort1(0, xs.length - 1) }或者像Haskell那样写的:
def sort(xs: Array[Int]): Array[Int] = { if (xs.length <= 1) xs else { val pivot = xs(xs.length / 2) Array.concat( sort(xs filter (pivot >)), xs filter (pivot ==), sort(xs filter (pivot <))) } }
支持Functional Programming有啥好处呢?
Functional programming language有着简洁,强大的表达能力,容易帮你写出bug-free的代码.另外在并行性上也有着优势。 比如在传说中那间以青年导师李开复老师为校长的CS四大牛校之一的CMU,大一新生首先学习Functional programming而不是传统的面向对象
具体到Scala,它支持如下几个Functional Programming的特性:
- higher-order function(高阶函数)
- anonymous function(匿名函数)
- nested function()
- curry(柯里化)
啥是Higher-order function
其定义是说函数本身可以作为其他函数的参数,或者返回值,或者赋值给一个变量。总而言之.
如果一个函数的参数可以为其他函数,那么这个函数被成为Higher-order function(高阶函数). C和Python都支持Higher-order function,但是Java本身是不支持的.一个Python的例子:
def f(x): return x + 3 def g(function, x): return function(x) * function(x) print g(f, 7)分别用Java和Scala来完成Wordcount这个经典的MapReduce应用: http://www.scala-blogs.org/2008/09/scalable-language-and-scalable.html 我们可以看到Scala的代码比Java的代码简介许多.
参考
Scala的官方网站: http://www.scala-lang.org/
一个不错的scala学习网站: http://www.simplyscala.com/
Scala by examples
A Tour of Scala
2 comments:
第二个sort可能比第一个sort慢?因为扫描两次数组阿。
dude, tradeoff啊tradeoff。
执行效率一般还是imperative 会比functional高
Post a Comment