Scala具体解释---------Scala是什么?可伸展的语言!

Scala是什么

Scala语言的名称来自于“可伸展的语言”。

之所以这样命名,是由于他被设计成随着使用者的需求而成长。你能够把Scala应用在非常大范围的编程任务上。从写个小脚本到建立个大系统。

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

Scala是非常easy进入的语言。

它跑在标准的Java平台上。可以与全部的Java库实现无缝交互。

它也是用来编写脚本把Java控件链在一起的非常好的语言。可是用它来建立大系统和可重用控件的架构将更可以发挥它的力量。

从技术层面上来说,Scala是一种把面向对象和函数式编程理念增加到静态类型语言中的混血儿。Scala的很多不同的方面都展现了面向对象和函数式编程的熔合;也许它比其它那些广泛使用的语言更有渗透性。在可伸展性方面。这两种编程风格具有互补的力量。

Scala的函数式编程使得它便于高速地从简单的碎片開始建立一些有趣的东西。

它的面向对象特性又使它便于构造大型系统并使它们适应于新的需求。

Scala中这两种风格的组合使得它有可能表达新的编程模式和控件抽象。并产生了易读、简洁的编程风格。因为它良好的延展性,用Scala编程将会有非常多的乐趣。

不同尺寸的程序倾向于须要不同的编程结构。

举例来说。考虑下面的Scala程序:

  1. var capital = Map("US"->"Washington""France" -> "Paris")  
  2. capital += ("Japan" -> "Tokyo")  
  3. println(capital("France")) 

这段程序建立了一个国家和它们的首都之间的映射表,添加了一个新的绑定("Japan"->"Tokyo")。然后打印了与法国相关的首都。

本例中的声明都是高层次的。也就是说。没有被外加的分号或者类型凝视弄得乱糟糟的。实际上,这样的感觉就好像那种现代的“脚本化”语言,比方。Perl,Python或者Ruby。这些语言的一个普遍特征,与上例有关的,就是它们都在语法层面上支持“关联映射”。

关联映射很实用,由于它能让程序易读和清晰。然而。有些时候你也许不赞成它们的这样的“均码”哲学,由于你须要用一种更加细粒度地去控制在你程序中用到的映射的属性。Scala能够在你须要的时候提供这样的细粒度的控制。由于映射在Scala里并非语法特性。

它们是库抽象,你能够扩展或者改造。

在上面的程序里。你将获得一个缺省的Map实现,只是你也能够非常轻松地改变它。例如说,你能够定义个特别的实现,如HashMap或TreeMap,或者你能够特定这个映射必须是线程安全的,混入:mix-in个SynchronizedMap特色:trait。你还能够给映射特定一个缺省值,或你能够重载你创建的映射的随意方法。每一个样例里,你都能够如上例所看到的那样使用相同简单的映射訪问语法。

这个样例显示了Scala带给你的方便性和灵活性,能够让你更好的了解Scala是什么。Scala有一整套的方便构件来帮助你高速启动及让你用一种愉悦清晰的状态编程。

与此同一时候。你有信心你不会让语言过度发育。

你总能够把程序按你的须要裁剪。由于全部的东西都是基于库模块的。能够按照须要选择和改动。

Scala是什么:培育新的类型

Eric Raymond把大教堂和杂货铺作为软件开发的两个隐喻。 大教堂是几近于完美的建筑物,要花非常长的时间建设。一旦建成了,就长时间保持不变。

相对来说,杂货铺则天天在被工作当中的人调整和扩展。

Raymond的文章中,杂货铺是对于开源软件开发的隐喻。

Guy Steele在他的讲话“发展一门语言”中提到相同的区别也能够应用在语言定义中。 Scala更像一个杂货铺而不是大教堂,由于它被设计为让用它编程的人扩展和改动的。

Scala并没有提供全部你在一种“完美齐全”语言中可能须要的东西,而是把制作这些东西的工具放在了你的手中。

这儿有个样例。

很多程序须要一个可以变得随意大都不会溢出或者因为数学操作而“绕回”的整数类型。

Scala在库类Scala.BigInt中定义了这样一个类型。

这里有一个使用了那个类型的方法定义。用以计算传入整数的阶乘值:

  1. def factorial(x: BigInt): BigInt =  
  2.     if (x == 01 else x * factorial(x - 1

如今,假设你调用了factorial(30),你将得到:

265252859812191058636308480000000

BigInt看上去就像一个内建的类型,由于你能够使用整数值和这样的类型值的操作符如*和-。

然而它仅仅是凑巧定义在Scala标准库中的类。

假设这个类缺失了,能够直接由随意的Scala程序猿写一个实现出来,举例来说,通过包装Java的类java.math.BigInteger(实际上,Scala的BigInt就是这么实现的)。

当然。你也能够直接使用Java的类库。

但结果却不尽乐观,由于虽然Java同意创建新的类,但这些类总感觉不像原生的语言支持。

  1. import java.math.BigInteger  
  2. def factorial(x:BigInteger): BigInteger =  
  3.     if (x == BigInteger.ZERO)  
  4.         BigInteger.ONE  
  5.     else 
  6.         x.multiply(factorial(x.subtract(BigInteger.ONE))) 

BigInt代表了更多类似于数字的类型——大十进制数,复数,分数。置信区间,多项式——诸如此类。一些编程语言原生实现了当中的一些类型。举例来说。Lisp,Haskell和Python实现了大整数。Fortran和Python实现了复数。可是不论什么语言想要尝试同一时候实现全部的这些抽象类型将非常easy变得太大而难以管理。

更进一步,即使假设有这种语言,总有些应用会使用其它的没支持的数字类型。所以尝试在一种语言里提供全部东西的解决之道不可能非常好地伸展。

取而代之。Scala同意用户在他们须要的方向上通过定义易用库来发展和改造语言,使得这些特性感觉上好像原生语言支持一样。

培育新的控制结构

前面的样例演示了Scala让你添加新的类型。使得它们用起来方便得像内建类型一样。相同的扩展理念也应用在控制结构上。

这样的类型的扩展是由Scala的“基于行动类”的并发编程API阐明的。

随着近年多核处理器的激增。为了获取可接受的性能,你将必须在应用中运用很多其它的并行机制。经常这就意味着重写你的代码来让计算分布到若干并发线程上。不幸的是,创建依赖性的多线程程序在实践中被证明是非常具有挑战性的。Java的线程模型是环绕着共享内存和锁建立的。尤其是当系统在大小和复杂度都得到提升的时候。这样的模型经常是不可理喻的。

非常难说程序里面没有资源竞争或潜藏的死锁——有些东西不是能在測试里面检验得出,而也许仅仅在投入生产后才表现出来。而大致能够觉得比較安全的可选方案是消息传递架构。比如在Erlang编程语言中应用的“行动类”方案。

Java伴随着一个丰富的,基于线程的并发库。Scala能够像其它JavaAPI那样使用它编程。然而,Scala也提供了一个实质上实现了Erlang的行动类模型的附加库。

行动类是可以实现于线程之上的并发抽象。

它们通过在彼此间发送消息实现通信。每一个行动类都能实现两个基本操作,消息的发送和接受。发送操作,用一个惊叹号表示,发送消息给一个行动类。这里用一个命名为recipient的行动类举比例如以下:

  1. recipient ! msg 

发送是异步的;就是说。发送的行动类能够在一瞬间完毕,而不须要等待消息被接受和处理。

每个行动类都有一个信箱:mailbox把进入的消息排成队列。

行动类通过receive代码块处理信箱中受到的消息:

  1. receive {  
  2.  case Msg1 => ... // handle Msg1  
  3.  case Msg2 => ... // handle Msg2  
  4.  // ...  
  5. }  

接收代码块由很多case语句组成,每个都用一个消息模板查询信箱。信箱中第一个符合不论什么case的消息被选中,而且运行对应的动作。

假设信箱中不含有不论什么符合不论什么case的消息,行动类将休眠等待新进的消息。

这里举一个简单的Scala行动类实现检查值(cheksum)计算器服务的样例:

  1. actor {  
  2.  var sum = 0 
  3.  loop {  
  4.   receive {  
  5.    case Data(bytes)  => sum += hash(bytes)  
  6.    case GetSum(requester) => requester ! sum  
  7.   }  
  8.  }  
  9. }  

这个行动类首先定义了一个名为sum的本地变量。并赋了初值为零。然后就用receive段落反复等待在消息循环中。假设收到了Data消息,就把发送的bytes取哈希值加到sum变量中。假设收到了GetSum消息。就用消息发送requester!sum把当前sum值发回给requester。requester字段嵌入在GetSum消息里;它通常指出创建请求的行动类。

眼下我们并不指望你能全然明确行动类样例。

实际上,对于可伸展性这个话题来说这个样例里面最重要的是,不论是actor还是loop还是receive还是发送消息的符号“!”,这些都不是Scala内建的操作符。虽然actor,loop和receive看上去或者表现上都如此接近于控制结构如while或者for循环,实际上它们是定义在Scala的行动类库里面的方法。相同,虽然“!”看上去像是个内建的操作符。它也只是是定义在行动类库里面的方法。全部这四个构件都是全然独立于Scala语言的。

receive代码块和发送“!”语法让Scala看上去更像Erlang里的样子,可是在Erlang里面,这些构件是内建在语言中的。Scala还实现了Erlang其它并发编程构件的大多数,诸如监控失败行动类和超时类。总体来说,行动类已变成表达并发和分布式计算的很好的办法。

虽然它们是定义在库里的,给人的感觉就像行动类是Scala语言总体的部分。

本例演示了你能够向新的方向“培养”Scala语言乃至像并发编程这种特性。前提是,你须要一个好的架构和程序猿来做这种事。但重要的事情是这的确可行——你能够在Scala里面设计和实现抽象结构,从而高速投入新的应用领域,却仍然感觉像是原生的语言支持。

本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的《Programming in Scala》的第一章。

本文借鉴于http://developer.51cto.com/art/200907/134865.htm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

地理学:从未磨灭的价值

地理学:从未磨灭的价值 文|梁鹏 庄子说:“天地有大美而不言,四时有明法而不议,万物有成理而不说”,天地不言,四时不议,万物不说,于是地理学家就是替天地说话的那帮人。推开自然之门&…

Android之导入项目提示Android requires compiler compliance level 5.0 or 6.0. Found ‘1.8‘ instead解决办法

1、问题 导入项目eclipse提示如下: Android requires compiler compliance level 5.0 or 6.0. Found 1.8 instead 2、解决办法 项目右键->Android tools->Fix Project

Educational Codeforces Round 1

被C坑的不行不行的。。。其他题目都还可以。 A - Tricky Sum 求1,2,3,...,n的加和,其中2^x(x>0)为负。 因为2^x的个数很少,所以以每个2^x为分界点进行判断. 初始化x0; 如果n>2^x,求出2^(x-1)到2^(x)之…

自定义View的三个构造函数

自定义View有三个构造方法,它们的作用是不同的。 public MyView(Context context) {super(context); }public MyView(Context context, AttributeSet attrs) {super(context, attrs);}public MyView(Context context, AttributeSet attrs, int defStyleAttr) {su…

mysql查询今天_昨天_7天_近30天_本月_上一月 数据_mysql查询今天、昨天、7天、近30天、本月、上一月 数据...

获取当前时间CURTIME();查询今天的数据select * from table where to_days(time) to_days(now())查询昨天数据select * from error where to_days(now())-to_days(alarmtime)1查询最近一个星期数据select * from error where to_days(now())-to_days(alarmtime)<7SELECT * …

甲骨文严查Java授权,企业连夜删除JDK

文 | Travis出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013)根据外媒 The Register 报道和各大企业的反馈&#xff0c;甲骨文公司近日已经开始将 Java 纳入其软件许可审查中&#xff0c;目的是找出那些处于不合规边缘或已经违规的客户&#xff0c;甲骨文此举是为了推…

前端日志分析

前端日志分析介绍 前端日志分析是通过搜集访客访问网站的行为数据&#xff0c;然后在这些用户日志数据的基础上通过定量和定性分析&#xff0c;来改善用户的浏览体验及网站性能&#xff0c;最终提升商业回报的过程&#xff0c;通常&#xff0c;前端日志分析遵循以下步骤…

历史之外,地理之中

历史之外&#xff0c;地理之中 ◎梁鹏 沉迷于历史&#xff0c;却最终选择了地理&#xff0c;于是苦苦寻求历史与地理之间的共通衔接之处。于学科而言&#xff0c;是历史与地理&#xff0c;于我而言&#xff0c;是梦想与现实。我知道已经存在的历史地理学不是我的归宿&#xff…

linux之readelf命令

1、readelf命令解释 readelf命令用来显示一个或者多个elf格式的目标文件的信息 2、ELF文件类型 可重定位文件:用户和其他目标文件一起创建可执行文件或者共享目标文件,例如lib*.a文件。 可执行文件:用于生成进程映像,载入内存执行,例如编译好的可执行文件a.out。 共享目标文件…

zuul转发的一些常见异常

为什么80%的码农都做不了架构师&#xff1f;>>> ##序 使用zuul作为api网关的话&#xff0c;经常会碰见一些异常&#xff0c;这里小结一下。 ##ZuulException 这个是最外层的异常 public class ZuulException extends Exception {public int nStatusCode;public Str…

Java中如何利用gson解析数据

最近在学习Java&#xff0c;需要用到json&#xff0c;本人对java不是特别精通&#xff0c;于是开始搜索一些java平台的json类库。 发现了google的gson&#xff0c;带着一些好奇心&#xff0c;我开始使用了gson。 经过比较&#xff0c;gson和其他现有java json类库最大的不同时g…

python基础入门大作业怎么做_【百度飞桨】零基础Python课程大作业

转眼间百度飞桨的零基础python课程马上就要结束了&#xff0c;所谓年前学python&#xff0c;年后来上号&#xff0c;通过本次课程可以对python有一个基础的认知和掌握&#xff0c;以下是大作业的个人代码&#xff0c;仅供参考。【作业一】#创建Student类class Student:def __in…

Xamarin效果第八篇之视频监控

还记得全年帮助一个朋友通过技术手段写了一个PC端的监控软件,这不再次想起此事,准备基于Xamarin再来实现一个移动端的监控;毕竟直接手机上打开还是比较方便的;最终实现的效果:1、启动页动画,原来直接贴图片;这次尝试使用Lottie来玩玩,直接贴参考连接https://www.codesitory.com…

Python 日期格式相关

今天看网上一个说中文日期的问题. 自己试了下.#-*- coding: gb2312 -*- import datetime, time#now time.strftime(%Y年%m月%d日 %H时%M分%S秒, time.localtime()).decode(utf-8) now time.strftime(%Y年%m月%d日 %H时%M分%S秒, time.localtime()) print nownow time.strpti…

Android之解决java.lang.UnsatisfiedLinkError: dlopen failed: ××××.so: has text relocations

1、问题 项目导入别人的so,有个项目没问题,但是这个有问题,运行提示这个错误 java.lang.UnsatisfiedLinkError: dlopen failed: .so: has text relocations 2、临时规避的解决办法 把现在的项目targetSdkVersion版本降低: such as,又24变为22,这样可以解决问题(没有源代…

前端实现连连看小游戏(1)

博主玩了这么久的连连看&#xff0c;居然是第一次发现&#xff0c;连连看最多只能有2个转弯。orz… 在网上搜索连连看的连线算法判断&#xff0c;并没有找到很全面的&#xff0c;经过自己摸索之后&#xff0c;做了一些小动画&#xff0c;希望大家可以看一遍都懂啦&#xff5e;&…

在 Visual Studio 2010 中创建 ASP.Net Web Service

第一步&#xff1a;创建一个“ASP.Net Empty Web Application”项目 第二步&#xff1a;在项目中添加“Web Service”新项目 第一步之后&#xff0c;Visual Studio 2010会创建一个仅含一个站点配制文件&#xff08;Web.config&#xff09;的空站点&#xff0c;其余的什么也没有…

C#中缓存的使用

简介缓存是指可以进行高速数据交换的存储器&#xff0c;它先于内存与CPU交换数据&#xff0c;因此速率很快。由于CPU从内存中读取数据的速度比从磁盘读取快几个数量级&#xff0c;并且存在内存中&#xff0c;减小了数据库访问的压力&#xff0c; 所以缓存几乎每个项目都会用到。…

artDialog ( v 6.0.2 ) content 参数引入页面 html 内容

/*! artDialog v6.0.2 | https://github.com/aui/artDialog */ 将页面某一隐藏的 div 的 html 内容传到 artdialog 的弹窗中&#xff0c;并且该 div 不会被删除&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8…

Windows Phone 8开发环境搭建介绍

1. 如果是Windows 8系统中安装VS2012&#xff0c;可以直接安装&#xff1a;   Windows Phone SDK 8.0 是一个功能齐全的开发环境&#xff0c;可用于构建 Windows Phone 8.0 和 Windows Phone 7.5 的应用和游戏。 Windows Phone SDK 将提供一个适用于 Windows Phone 的独立 Vi…