《scala学习笔记0 -了解scala》

本文引用地址:

原地址,原地址2

为什么选择scala

火热的网上公开课网站Coursera采用了Scala来作为他们的首选编程语言。最初这个网站是由几个Stanford的学生用PHP写的,后来随着业务扩展,团队开始寻找合适的语言来搭建平台。在尝试过了包括Python和Go在内的许多种框架后,Coursera决定采用Scala以及使用Scala编写的web框架Play Framework,原因有以下几条:

类型安全

Coursera一直承诺在教学上的创新,并且也身体力行为用户创造卓越的体验。所以平台代码一般都是快速迭代开发,在迭代过程中代码被写成、重写、重写再重写。大家都有经验,重构静态语言工程的难度要远远小于重构动态类型语言。重构PHP或者Python是很让攻城狮们头疼的一件事情,因为在这个过程中会引入更多新的bug。Scala在重构问题上做的就很好,这使得我们可以定期、并且健康的重构代码

强大的并发特征

尽管Python和PHP支持进程创建,但是他们都没有轻量级的并发特性,比如“真正的”多线程编程。Coursera的框架具有多样性和复杂性的特点,要求能够具备和多种数据库和不同服务交互的能力。Play的reactive core和异步编程库能够和一些强大的并发库进行无缝连接(比如说Akka中的actor模型)。这些特性的融合能够使得异步编程像是同步编程代码那样容易理解。程序猿可以使用这些框架编写可读、可维护、高效的代码,而不是难以理解的无穷无尽的回调。

成熟的生态系统

JVM生态系统是现在最成熟的生态系统,而Scala就是在JVM和Java生态系统上构建的,因此可以从Java的工具库中获益。当前很多大数据的组件比如Hadoop、Spark以及Cassandra都是在JVM生态系统内,这使得使用Scala编程的框架可以直接调用他们的库。并且,相对PHP或者Python,Scala和Play只需要在节点上安装JVM,这省去了很多繁琐的部署和维护步骤。JVM还是一个特性完整的虚拟机,堆容器、GC机制、实时编译等都十分成熟,加速了开发过程。

Scala的不足

但是没有一种框架、语言是完美的,在使用Scala之前,我们还有许多担忧,以下就是Scala的不足:

编译时间

Scala的编译器是非常复杂的,而且其编译过程包含了25个阶段—这使得编译变得非常慢。幸运的是,SBT的增量编译可以有效的解决这个问题。尽管Scala的代码要比PHP、Python多得多,但是编译耗时很短(在秒级)。SBT的增量编译技术和Play的热重载能让开发者保持快速迭代节奏。尽管随着代码库规模增大这种问题会变得更凸显,但是目前我们不需要太多担心。

晦涩的语法

Scala中随处可以见到看起来像是“噪声”的代码段,也经常会因为可读性的原因被诟病随意使用符号操作符。虽然Scala的语法比较随意,但是很少会在使用期间碰到搞不定的情况。当你熟悉了它的语法规则后,发现基本不会在阅读代码时遭遇难题。

高级特性

Scala有许多高级特性,比如宏、隐式类型等。使用这些特性时,很容易就编织出一堆连其作者也无法辨认的乱麻。在使用时,Coursera尽量避免去使用这些高级特性,比如从来不会在业务逻辑中定义新的隐式或者宏。也就是说,我们只有在重要的库或者框架中才会使用这些高级特性。而Coursera的产品攻城狮Josh则表示使用任何语言编码都可能写的一团糟,而Scala的高级特性能使代码更简洁,在可读性方面可以借助编程规范以及结对编程的方式来保证。

Scala IDE

相比起Java的IDE来说,Scala的IDE还有许多不足。虽然Eclipse在这方面已经做了持续的改进,但是很多功能仍然不具备(比如type hierarchy和call hierarchy),另外一些(比如move)还时不时的蹦出点bug。Scala的IDE是目前生态系统中的短板,Coursera的攻城狮们已经参与到了修复IDE BUG的工作中。

Scala与Java的差别

相对于Java而言,Scala的代码更为精简(减低犯错),而且功能更为广泛(Scala其实是Scalable Language 的简称,意为可扩展的语言),许多Scala的特性和语法都是针对Java的不足和弱点来设计的。

Scala的特点是有很多函数程式语言的特性(例如ML,Miranda, Scheme,Haskell),譬如惰性求值,list comprehension, type inference, anonymous function, pattern matching 等等,同时也包含 Object-Oriented 的特性(OO 能与 FP 混合使用是 Scala 的亮点)。此外,许多相似于高级编程语言的语法也渗入其中(例如 Python),不仅提高了 Scala 代码的可读性,维护、修改起来也较为省时省力。

Scala 与 Java 语法上的明显差异有:

  • 不需要分号结尾
  • 类型定义开头需大写(与 Haskell 相同)
  • 函数定义需 def 开头(与 Python、Ruby 相同)
  • return 可以省略

在此值得提醒的是,统计显示,Scala 的代码运行速率仅为 Java 的 8 成。

你可能感兴趣的:(《scala学习笔记0 -了解scala》)