天天看点

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

一位Twitter工程师的Scala探秘之旅(1)

2009-07-29 15:55 阿菜 编译 51CTO.com 我要评论(0) 字号: T | T

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

本文内容来自一位Twitter工程师在介绍“为什么选择Scala”的演讲中使用的幻灯片。在这份幻灯中,演讲者详细的介绍了Twitter在做出使用Scala的选择时都参考了哪些因素。

AD:

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

【51CTO精选译文】本文的这个故事讲述一个对编程语言有种近乎于宗教狂热的Twitter工程师是如何投入Scala的怀抱的。一开始大量使用Ruby做为开发语言的Twitter曾遭遇过严重的性能问题,于是Twitter在寻找可扩展性强的替代语言的时候,找到了Scala。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

大家好,我是al3x,一位编程语言的瘾君子,哦不,是狂热份子。我在工作中使用过Java,JavaScript,C,PHP,Perl,Ruby以及Python。出于兴趣和爱,接触过x86 Assembly,Erlang,Lua,Objective-C,Lisp家族,Haskell,以及C++。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

我为Twitter工作。Twitter一直以来都大量使用Ruby。Ruby很好,但不是都好。Ruby VM低下的性能,monkeypatching(51CTO编者注:猴子补丁,也称鸭子击,指对动态语言运行时进行扩展或修改,而无须更改源代码的一个方法),以及文化上的问题,在大型项目中的使用还是充满疑问。我们要建造新的服务,感觉不想继续用Ruby开发了。

对于Ruby的不满,基本可以总结如下:

1)Ruby不太合适开发长时间运行(Long-Live)的服务器端程序,但JVM很合适,因为Java有10年的经验教训和优化,Scala是运行在JVM上的,所以天生就有了这个优点;

2)  Ruby没有很好的线程(Thread)支持,Ruby多线程会限制在一个CPU上(新的Ruby应该会改善这点吧)且Ruby VM的垃圾收集支持也没有Java先进,就造成每个Ruby进程长时间运行后使用的内存月来越大;

3)  为什么不是JRuby? JRuby缺乏使用广泛的Rem支持(很多优秀的Ruby包都需要C扩展,它们并没有移植到Java),而且性能也不太理想,比MRI(C实现的Ruby VM)要慢

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

我心目中的系统语言白马王子应该是:

◆快速

◆函数式

◆表达能力

◆静态类型

◆并发

◆优美

◆轻量

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

我们列出的名单:

C

C++

Python

Erlang

Java

JVM上的动态语言

结果没一个满意的。它们都有自己的问题。我们最终想要一个不是Java的JVM语言。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

后来,我们听说了Scala。在JVM上几乎没有哪个语言的执行速度赶得上它,而Scala lift-off看起来令人感到信心十足。

一位Twitter工程师的Scala探秘之旅(2)

2009-07-29 15:55 阿菜 编译 51CTO.com 我要评论(0) 字号: T | T

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

本文内容来自一位Twitter工程师在介绍“为什么选择Scala”的演讲中使用的幻灯片。在这份幻灯中,演讲者详细的介绍了Twitter在做出使用Scala的选择时都参考了哪些因素。

AD:

Scala的特性

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

不再糟糕的类型推断。静态类型一直是天使和恶魔的共存。在Scala中,在你真正使用它之前,你可以忽略对象的类型。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

不变性:你可以在最开始用面向对象的方法编程,然后当你需要它的好处时,就可以迁移到用不变状态(immutable state)。实现并发和异步就靠它了。这个功能需要在决策时更加深思熟虑,不过是值得的。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

第一类函数:我们是“类”的追随者。这是个有了就无法失去的功能:你不仅可以定义函数和调用它们,还可以把函数写成没有名字的文本:literal并把它们像值:value那样传递。一切都是表达式,一切都有值。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

特征:是个奇特的东西,因为继承的未必是你想要的。一个类可以按照需要整合许多特征,这与接口相似,但它们还可包含行为,这又与类相似。同样,与类和接口类似,特征可以引入新方法。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

模式匹配与case类:其实每个程序员天天都在进行模式匹配。Scala不过是令这个过程更简单了。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

XML的处理大大的简化了。再怎么说XML技术还在广泛的使用中,使用Scala来处理XML文件是相当不错的选择:有点那么些JavaScript+JSON的意思。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

Actors:处理并发的一个好方法。Scala提供的这个叫做Actor的并行模型通过它的收件箱来发送和接收非同步信息,而不是共享数据。这种方式被称为:shared nothing 模型。一旦你不再顾虑共享数据的问题,也就不必再为代码同步和死锁问题而头痛。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

还有上面这些其他的特性,这里就不细说了。51CTO的编辑在此推荐大家去Scala编程语言专题中进行进一步的学习。

范例

最后,给大家看看我们在Twitter中用Scala编写的代码。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

函数的使用:无论是array,类型系统,值还是Singleton的语法,都和Ruby一样简便。

一位Twitter工程师的Scala探秘之旅一位Twitter工程师的Scala探秘之旅(1)一位Twitter工程师的Scala探秘之旅(2)

Package,import,traits,currying,更多的类型系统。

当然了,Scala也有不好的地方,比如社区太小,而且也偏复杂。不过总的来说,Scala绝对是一门值得学习的语言。