Adobe架构师谈Scala:功能强大但令人困惑

原创
开发 后端
Scala是一个强类型语言。它可以直接在JVM(还有.NET平台)上运行,很方便的与Java代码和库集成,而且有并行编程的重要武器Actor模型。一位Adobe架构师抱着喜爱Scala的心情进行了一些深入的了解,然而这个过程中却产生了一些困惑。

【51CTO精选译文】本文是Adobe架构师Ricki在英文开发社区DZone上发布的一篇文章。Ricky专注SaaS,云计算以及使用Map/Reduce和Hadoop堆进行并行编程。最近Ricki参加了一次Scala线下课程,并对Scala语言留下了自己的一些印象。

51CTO编辑推荐:Scala编程语言

对Scala语言的第一印象

关于 Scala 这个编程语言,我听到很多正面的评论。我个人过去更多使用 Java,在过去两年,我已经转用 Ruby(还会用一些 Erlang)。我听到的那些 Scala 功能,对我很有吸引力,以下列出:

◆Scala 代码可编译为 Java 字节码,直接在 JVM 上直接运行。使用Scala写的代码能够直接享受 Java 虚拟机技术所具有的性能和健壮性(robustness)

◆可以很方便地与 Java 代码和库进行集成,能够直接享受大量现有 Java 库带来的便利。

◆对于 Actor 模型,它提供了很好的支持,我认为这一点对于多核计算机架构是一种非常重要的编程范式。

深入了解,继而困惑

所以我决定参加 Qcon 大会上 Dean Wampler 做的 Scala 课程。听课之后,我对 Scala 的印象,总结如下:

首先,Scala 是一个强类型语言。不过,它具有类型推理机制,所以你不是非要进行类型声明,它是可选的。

但在一些地方(如方法签名),类型声明是必须的。什么时候我必须声明一个类型,对于我这点不是非常清楚。

具有变量中的“val”和“var”声明是非常好的,因为它可以使得不变性(immutability)成为显式的。在 Ruby 中,通过向对象发送 freeze() 方法,你可以使一个对象成为不变的(immutable),但Scala做得更为显式。

不过,我发现使用两种不同的方式定义一个方法这点令人困惑。

  1. class A() {  
  2.  def hello {  
  3.  ...  
  4.  }  
  5. }  
  6.  
  1. class A() {  
  2.  def hello = {  
  3.  ...  
  4.  }  
  5. }  
  6.  

这个 MyFunction[+A1, -A2] 对我来说真的不容易弄明白。我觉得无类型语言更为简单。

另外,删除开始和结束的括号也让我很困惑。

  1. class Person(givenName: String) {  
  2.  var myName = givenName  
  3.  def name =(anotherName: String) = {  
  4.  myName = anotherName  
  5.  }  
  6. }  
  7.  
  1. class Person(givenName: String) {  
  2.  var myName = givenName  
  3.  def name =(anotherName: String) = myName = anotherName  
  4. }  
  5.  

 

这个特别的“隐式”转化方法提供了一种机制,即使用 Scala 开发 DSL(领域专用语言:Domain Specific Language)。但对于我,它看起来很奇怪。从根本上说,你需要导入单个隐式转化方法,后者需要处理所有可能的转化。

#T#所有以“:”结尾的方法,调用顺序都是颠倒的,这对我来说也是非常奇怪的东西。

Scala 中的 trait 为 Scala 提供了 mixin,但我觉得 Ruby 语言中的“模块”机制做得更好。

Scala 具有“函数”的概念,并且能够将“函数”作为参数传递。同样,我觉得 Ruby 中的 block 做得更好。

也许由于 JVM 对于动态语言支持的局限性,Scala 在做元编程时并不是很强,Scala 不提供“开放类”属性,通过它用户可以在运行时修改现有的类(添加方法、更改方法实施,添加类等等。)

Scala 还模仿了一些 Erlang 语言的功能,但我不认为它这活做得干净漂亮。比如,它使用 case 类和 unapply() 模仿 Erlang 编程的模式匹配风格,但对于我这有点奇怪。

Erlang 具有两个很酷的功能,在 Scala 中我还没有发现(也许是我期望太高了)。

◆能够同时运行类的两个版本

◆能够创建并传递函数对象到远程进程(有点类似远程代码加载)

总体印象

我不得不承认,我对 Scala 的印象并没有参加那个课程之前那样好。Scala 试图在 JVM 中放入不同的非常有用的编程范式,但对于我,有种勉强的感觉。当然,与JVM的紧密关系仍是我们选择Scala的一个原因。但从纯正的编程角度,我更喜欢 Ruby 和 Erlang 的结合,而不是 Scala。

原文:Impression on Scala 作者:Ricky

编者后记:开发者对于语言的喜好在某种程度上和开发者的性格有很大关系,正如敏捷大师Dave Thomas所说的,就好像喜欢猫的往往不喜欢狗,喜欢狗的往往不喜欢猫一样。而不知是否巧合,同样是Ruby狂热爱好者的Dave Thomas也曾在访谈中表示自己就是毫无理由的不喜欢Scala,对Scala的一些用法感到困惑。这样看来就仿佛Ruby是只猫而Scala是只狗一样。当然也有反例,比如这位从Ruby出家到Scala的程序员,以及曾经一直使用Ruby做后台的Twitter后来投向了Scala,而其团队并没有像上面两位那样表示困惑。看来开发者对语言的喜好真是一个难以琢磨的话题呢。

责任编辑:yangsai 来源: 51CTO.com
相关推荐

2023-12-08 11:05:00

GitLinux

2021-10-09 13:48:11

操作符Python运算符

2019-04-25 06:07:17

物联网平台物联网IOT

2022-06-23 10:17:00

Git技术Linux

2019-11-14 06:13:51

欺骗网络威胁网络安全

2024-01-15 18:02:09

docker系统文件格式

2020-06-19 09:35:58

备份Linux系统工具

2013-01-23 11:30:39

JSVirtualKeybjQuery

2010-03-05 09:19:54

Android系统

2020-12-07 16:56:35

Rails

2011-04-15 09:27:09

Windows PhoWindows phoMango

2012-01-10 16:23:12

兄弟传真机

2010-02-24 17:58:28

Python 测试框架

2022-10-10 10:14:38

Python绘图库

2010-08-05 13:51:13

软件架构师

2009-07-07 08:46:11

微软Windows 7新功能

2024-05-28 00:01:00

开发者Python模块

2011-03-11 15:38:08

Java

2012-02-02 10:23:07

2011-10-31 09:22:07

系统架构
点赞
收藏

51CTO技术栈公众号