`
Eastsun
  • 浏览: 304183 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

为什么选择Scala?

阅读更多
原文地址: http://www.infoq.com/cn/news/2008/01/why-scala

在回答“为什么选择Scala?”这个问题之前,我们首先需要回答“什么是Scala?”。从Scala网站上,可以找到如下概述:

引用
Scala是一门现代的多范式编程语言,志在以简练、优雅及类型安全的方式来表达常用编程模式。它平滑地集成了面向对象和函数语言的特性。
Scala是面向对象的:Scala是一个纯面向对象语言,在某种意义上来讲所有数值都是对象。对象的类型和行为是由class和trait来描述的。Class的抽象可由子类化和一种灵活的基于mixin的组合机制(它可作为多重继承的简单替代方案)来扩展。
Scala是函数式的: Scala还是一个函数式语言,在某种意义上来讲所有函数都是数值。Scala为定义匿名函数提供了一种轻量级的语法,它支持高阶(higher-order)函数、允许函数嵌套、支持局部套用(currying)。Scala的case类及其内置支持的模式匹配模型代数类型在许多函数式编程语言中都被使用。
Scala是静态类型的:Scala配备了一套富有表现力的类型系统,该抽象概念以一种安全的和一致的方式被使用。
Scala是可扩展的:Scala的设计承认了实践事实,领域特定应用开发通常需要领域特定语言扩展。Scala提供了一个独特的语言组合机制,这可以更加容易地以类库的形式增加新的语言结构:
任何方式可以被用作中缀(infix)或后缀(postfix)操作符
闭包按照所期望的类型(目标类型)自动地被构造
两者结合使用可方便地定义新语句,无需扩展语法,也无需使用类似宏的元编程工具。
Scala可与Java和.NET进行互操作:Scala设计时就考虑了与流行编程环境良好交互,如Java 2运行时环境(JRE)和 .NET框架(CLR)。特别是与主流面向对象语言,如Java和C#尽量无缝交互。Scala有像Java和C#一样的编译模型(独立编译,动态装载类),允许访问成千上万的高质量类库。

对于某些开发者来说,这些刺激已足以引诱他们脱离Java进入Scala世界。但对另外一些开发者来说,它们并没有为Java世界里当前正在演绎的日复一日的编程活动提供更多好处。

在一篇名为“Scala:集Ruby和Java之所长”的博文中,Ian讲述了或许不应在Java和Scala之间做出选择,相反,相对于选择其它语言如Ruby,选择使用Java和Scala的混合物是的另一种选择:

许多开发者热爱Ruby,不过他们不能从中获取足够的东西。它可能是最具侵略性的语言之一,因为Java才是第一个到场的。人们总是引证Ruby的灵活而可扩展的语法、闭包等特性,以及其代码如何简明和具有表现力。

例如,你可以用一个简单语法创建一个Map(Ruby称之为“hashes”,尽管hashtable只是map一种可能的实现方式),如:

numberMap = {"one" => 1, "two" => 2, "three" => 3}
Java与之对等的语句显得颇为冗长:

Map<String, Integer> numberMap = new HashMap<String, Integer>(); numberMap.put("one", 1); numberMap.put("two", 2); numberMap.put("three", 3);
那么Scala怎么样呢?让我们看看Scala中map的例子:

var numberMap = Map("one" -> 1, "two" -> 2, "three" -> 3)
你会注意到它看上去非常类似等价的Ruby代码,但是这儿有一些重要区别。特别是,就像Java,Scala编译器知道numberMap使用String作为键,Integer作为值。与Java不同的是,你无需告知,它本身就能领会这一点!这称为“类型推理(type inference)”。

这意味着如果你试图给numberMap增加一个新的键值对,但是要使用Integer作为键,String作为值,Scala将在你试图编译它时立刻报错(或者你的IDE将立刻警告你)。使用Ruby,只有当你运行你的软件并试图从该Map中找回该键和值时,得到的分别是Integer和String而不是所期望的String和Integer,这时才会导致报错。

过分强调编译时类型检查节省多少多少时间是困难的,但它消除了所有类在执行时将会产生的bug。Scala给你带来了这一好处,而且代码并不繁琐。

为更进一步在一个小例子中展现代码量的缩减,Ted Neward研究了开发同一个类,用Java、C#、Virual Basic、Ruby和Scala的区别。请参考其博文Scala pt 2:简短。

Ian继续指出:

Scala还有一连串其它好的Ruby特性(Java所缺乏的),包括闭包,以及非常适合“领域特定语言”的可塑性语法。它拥有所有这些特性,而且结合了静态类型好处。
David MacIver在其博文说正经的,为什么选择Scala?中分享了他对于面向对象编程、面向模块编程、静态类型、函数编程以及该语言中他所喜欢的未言明特性的观点。他补充道:


Scala离完美还差得远。它有一些语法缺陷,一些由Java带来的问题,一个有适度问题的编译器以及一堆你记不住的琐碎特性和边界情况(edge case)。然而,我发现这些问题除了烦你之外并不真正产生什么后果。如果只是想坐下来书写好的代码,该语言的核心是强大的和非常有用的。
为了提供一个均衡的观点,David在其博文中接着探讨了为什么不选Scala,文中他阐述了一些边界情况(edge case)。作为总结,David有如下评论:


总而言之,我发现这些只是增加了一些烦心事。它仍是我最喜欢的JVM语言,但是你的看法将取决于你怎样搁置那些对你来说可能是更重要的需要优先考虑的事情。
为了展现Scala是一门不断成熟的语言,Programming in Scala一书很快将会出版。如果等不及,Artima网站上有该书PDF格式的预印版。


做出自己的决定,或想学习更多关于Scala内容,请关注他们的网站。

分享到:
评论
3 楼 ray_linn 2008-05-13  
这个Ted Neward的水平是很次的,他的C#代码压根就是驼臭狗屎
2 楼 Eastsun 2008-04-20  
貌似有个基于Scala的Web框架Lift.
引用

什么因素使得Scala成为构建一个Web框架的伟大环境?

句法。性能。稳定性。一个仅当你需要的时候才出现的优秀的类型系统。闭包。模式匹配。内建的XML语言支持(XML literals)。Actor[译注:Scala的基本并发构造]。很难说什么是决定性因素。
lift与Rails以及Seaside或者其他Java框架例如Structs或者Spring的区别是什么?

像Rails一样容易而简明。
像Seaside和Wicket一样安全而正式。

类型安全但不像Struts一样冗长。

支持允许多人合作的“实时”应用。

所以,你可以飞快地构建巨强大的应用(就像Rails),但是你不必把所有的状态一股脑地扔进一个关系数据库中。状态是“活的”而不是冻干的,这使得写从前端访问数据库表的应用非常地不同以往。

你可以描述一下你在生产环境中部署lift的经验么?你看到的性能如何?

我对lift应用做了许多基准性能测试。lift的渲染管道简明扼要,而且lift在标准的web容器中运行。这意味着你可以得到与良好开发的J2EE应用相同的性能。对于数据库无关的页面,lift的渲染时间通常低于1秒。对于需要访问数据库的页面,页面渲染时间与数据库访问相关。在一个Amazon EC2实例上(1.7Ghz Intel处理器,2GB内存),我可以支撑每秒500+的页面访问,其中50%的页面要访问数据库,而且MySQL实例与Web应用运行在相同的服务器上。
你如何看待lift与现存的Java应用配合工作,或者在混合语言环境(例如JRuby)中工作?

lift与现存的Java代码配合工作的非常好。lift的RabbitMQ和XMPP支持是基于Java库的。Scala可以100%无缝的调用Java代码。Scala可以100%无缝的实现Java接口,继承Java类。它就是可以工作。至少有一个lift项目,其中lfit和Spring在同一个WAR文件中共存。我的第一个Scala应用是一个Servlet容器。"它就是可以工作"让我松了一大口气。
1 楼 floating 2008-04-20  
不知道Scala有没有大规模应用的例子?我最近开始考虑在公司里大规模引入groovy,碰巧看到你这篇文章,觉得单纯从语言特性上讲Scala似乎比groovy更好些。不知道你在这方面有什么体会?在项目中使用Scala的成本高不高?

相关推荐

    scala-fmi-2019:索非亚大学教授的Scala函数式编程课程材料

    使用Scala进行高级功能编程讲课[] 函数式编程的简要历史为什么选择Scala? Scala作为SCalable语言。 样例代码安装和工具你好,世界测验[] Scala原理基本类型和基本类型。 文字定义val , var , def 。 类型和类型...

    scala习题精选100道附带解析

    scala习题精选100道,每道都有人工分析,技术点原理,不只是简单的答案

    Scala考试题1

    1.var,val和def三个关键字之间的区别 2.trait(特质)和abstract class(抽象类)的区别 3.object和class的区别 4.c

    Scala实战.docx

    一、 Scala简介 Scala 是一种有趣的语言。它一方面吸收继承了多种语言中的优秀特性,...Scala 就像一位武林中的集大成者,将过去几十年计算机语言发展历史中的精萃集于一身,化繁为简,为程序员们提供了一种新的选择。

    Scala语言分析报告

    Scala语言分析报告

    Simulino:面向TDD的Arduino模拟器

    为什么选择Scala? 因为我喜欢Scala,所以才这么做。室内建筑通常,这是具有计划的事件总线的事件驱动的体系结构。 将来的事件,例如执行指令,设置寄存器,更改引脚状态等,都安排在特定的时钟滴答中。 当模拟器...

    Scala程序设计(第2版)

    1.1 为什么选择Scala 1 1.1.1 富有魅力的Scala 2 1.1.2 关于Java 8 3 1.2 安装Scala 3 1.2.1 使用SBT 5 1.2.2 执行Scala命令行工具 6 1.2.3 在IDE中运行Scala REPL 8 1.3 使用Scala 8 1.4 ...

    《快学Scala》中文版带目录

    由于Scala语法有些“古怪”,入门相对不是那么容易,所以选择好的资料就显得尤为重要。《快学Scala》的作者是国际畅销书《Java核心技术》的主要作者,作者基于完全实用的角度给出了学习Scala的快速、基于代码的入门...

    scala的eclips插件

    分别放到自己eclips目录的features和plugin中,重启即可。 新建项目选择新建scala项目

    scala2.11.8

    scala2.11.8压缩包,解压直接使用,手动选择引入idea,scala2.11.8压缩包,scala2.11.8压缩包scala2.11.8压缩包,scala2.11.8压缩包,scala2.11.8压缩包,scala2.11.8压缩包

    idea 的scala插件

    idea中安装scala插件,选择configure-&gt;plugins-&gt;点击Install plugin from disk,选择压缩包所在的目录,确定后重启idea,生效,新建项目可以看到scala选项

    java-to-scala-plugin:用于将 Java 转换为 Scala 的 Scala IDE 插件

    您还可以将 Java 代码复制到剪贴板,打开 Scala 编辑器,然后按 Ctrl+Shift+V(或右键单击并选择“粘贴(将 Java 转换为 Scala)”)。 安装 在 Eclipse 中,转到“帮助”&gt;“安装新软件”,选择 Scala IDE 更新站点...

    scala从入门到精通技术教学视频

    2,生动形象,化繁为简,讲解通俗易懂。 3,结合工作实践及分析应用,培养解决实际问题的能力。 4,每一块知识点, 都有配套案例, 学习不再迷茫。 课程简介 第一章 环境搭建 00.导学 01.Scala简介 02.Scala程序和Java...

    eclipse-Scala不兼容的更新包

    Spark编译的目前都是基于Scala 2.10.4的,安装Scala插件版本也是选择2.10.4,否则eclipse会报spark的jar包和scala版本不兼容的错误.

    scala例程:Scala例程

    Scala和Spark例程 Scala和Spark例程培训和测试库 如何运行代码 克隆存储库 从以下位置下载MovieLens 100K数据集:[ ] 解压缩它,然后将生成的ml-100k文件夹移动到scala-routines / data文件夹中。 在IntelliJ欢迎...

    Scala实用指南-高清带目录

    很高兴见到你对 Scala 感兴趣。感谢你选择本书来学习和练习这门编程语言,你将感受到在一种编程语言中融合面向对象和函数式编程这两种编程范式所带来的巨大优势。 Java 生态系统是目前用于开发和部署企业级应用最...

    Scala in Depth

    本书适合想要了解Scala语言的底层机制和技术细节的读者阅读参考,是学习Scala语言的上上之选择。 Scala是一种多范式的编程语言,它既支持面向对象编程,也支持函数式编程的各种特性。 本书深入探讨了Scala里几个较为...

    scala插件_for_Eclipse_4.7.x-Oxygen我的资源名称太短了了呵呵

    scala for Eclipse 4.7 (Oxygen)。4.7.x系列都可用, 希望可以帮到有需要的朋友。亲测可用的安装方式:打开eclipse,点击help-Install New Software,然后点add,选择本地解压的文件夹,eclipse就会引导我们安装了。...

    HTTPS-Request-Scala:在Scala中快速紧凑地实现HTTPS请求

    HTTPS请求Scala Scala中HTTP / HTTP请求的紧凑而适度的实现。 概述 在Scala的Source库的大力...您可以选择添加到该存储库。 通常,创建用于添加代码的请求请求,为错误和/或功能请求创建问题。 执照 麻省理工学院执照

    Functional Programming Patterns in Scala and Clojure

    同时,新一代分布式计算系统Spark不仅在实现中选择了Scala,其提供的首选编程语言也是Scala。  所有迹象都显示,诞生50多年后,函数式编程却焕发了青春,越来越受到关注和青睐,从边缘地带步入了主流,除了Scala和...

Global site tag (gtag.js) - Google Analytics