导航:首页 > 编程语言 > 编程语言scala武器

编程语言scala武器

发布时间:2023-01-09 23:06:54

㈠ 百战程序员编程语言有几种

把编程语言比喻成车:
Ada 是辆丑到极点但是永远不会出故障的坦克。
C 是辆赛车,它能跑得超乎想象得快,不过每跑个 50 英里就会抛锚。
Cobol 号称是辆车,不过没有哪个有自尊心的驾驶员肯承认曾经开过。
C# 是辆竞争模式的家庭旅行车。一旦你开过它,你就不会再用其他竞品厂商的产品了。
C++ 是辆大马力版本的 C 型赛车,它额外提供了成打的特性,而且每跑 250 英里才会抛锚,不过当它真出问题的时候,没有人能找到究竟是哪儿坏了。
Eiffel 是辆内置了法国口音驾驶说明的汽车。他会帮你快速地找到错误并从中学到东西,不过你要是敢跟他争论的话,他会骂你然后把你从车里扔出去。[来自 Daniel Prager ,稍有修改]
Erlang 是一个车队,它们会互相协作把你送到任何你想去的地方。想要每只脚各自操纵一辆车还是需要一些练习的,不过一旦学会了之后你就可以驾驶着它们通往其他方式难以企及的地方了。还有,你用了那么多辆车,所以就算有几辆坏掉也没什么可担心的。
Forth 是你亲手用套件组装出来的车。你这辆车不论长相还是功能都没必要和别人的一样。不过,Forth 型号的车只能倒着走。
[Digg.com 网站上的评论,来自 256byteram(我忍不住要把它加上):]
FORTH LOVE IF HONK THEN !(译注:抱歉我实在不知道这句话是啥意思……)
Fortran 是辆非常原始的车。它能跑得很快,前提是你要始终在完全笔直的道路上开。据说学开 Fortran 型汽车会导致你再也没法学开其他型号的汽车了。
java
Java 是辆家庭旅行车。它驾驶起来很容易,开起来速度也不会太快,不至于伤到你自己。
版本1:Haskell 是辆设计极端优雅漂亮的车,传闻它能开到非常极端的地形中去。当你试图驾驶它的时候,它并不是真的沿着道路在前进的;实际上,它是不断把自己和道路进行复制,每次成功复制之后,车在路上都会比上一次更远一点。应该还是有可能按照传统的方式来驾驶它的,不过你的数学能力不足以找出这个办法来。
版本2:Haskell 并不是辆真的车,它是一个抽象的机器,能够详细地告诉你驾驶这个过程应该是什么样子的,如果你愿意的话。你必须把这个抽象的机器放到另一台实际的机器里面才能开动它,别问这个实际的机器是怎么运行的。还有一种方法,你可以用多台抽象的机器造出另一台抽象的机器,然后把它交给那台实际的机器,这样就能一个接一个地完成你的旅途了。[Monadic 的版本]
版本1:Lisp 看起来像一辆车,不过经过足够的改装,就能把它变成非常有效的一架飞机或一艘潜艇。
版本2:一开始它看起来一点儿都不像一辆车,不过时不时地你也能看到有人在开着它转悠。终于有一天你决定多了解一下它,然后你意识到它其实是一辆能造出更多汽车的汽车。你把这个发现告诉了朋友,不过他们都大笑着说这些车看起来太奇怪了。至今你仍在车库里留着一辆,期待着哪天能把它开上路去。[来自 Paul Tanimoto]
Mathematica 是辆设计得很好的车,它从 Lisp 型汽车那里借鉴了大量的东西,却连一点儿应得的赞扬都不给它。它能通过方程计算出到达目的地最高效的路径,只不过这要花上一大笔钱。
是辆设计给新手用的短途旅行车,通常都是开往那些 Mathmatica 型汽车常去的地方。在那些地方这车开起来非常舒服,不过只要你偏离了路线,哪怕只有一点点,它就会变得非常难以驾驭,以致于很多势利的司机根本就不承认它是一辆车。
Ocaml 是辆非常性感的欧洲车。它不像 C 那么快,但它从不出故障,所以结果你反而会花更短的时间到达目的地。不过因为这是法国,所有的控制装置都不在它们平时该在的地方。
Perl 应该是辆挺酷的车,不过驾驶员手册却难以理解。另外,就算你能找到方法去驾驶一辆 Perl 型号的车,你也开不起来别人的 Perl 型汽车。
PHP 是辆热狗车(Oscar Mayer Wienermobile),它非常古怪、又难以驾驭,但是所有人却还是想开它。[来自 digg.com 网站的 CosmicJustice]
版本1:Prolog 是全自动的:你告诉它你的目的地是什么样子的,然后剩下的驾驶工作它就全搞定了。[Paul Graham附加的:]不过,大多数情况下,确认目的地所花的工夫,和你直接开过去也差不多了。
版本2:Prolog 这辆车上装了一个独特的试错型 GPS 系统。在通往目的地的路上,它会一直往前开,如果走到死胡同了,它就调头回来再试试别的路,如此不断往复,一直到目的地为止。[我忘了是谁建议的这一条]
python 是辆非常棒的给初学者用的车,就算没有驾照也能开。除非你想开得超级快,或者想开去很危险的地方,否则你可能永远都用不到别的车。
Ruby 这辆车是因为一次 Perl、Python 和 Smalltalk 三车相撞事故产生的。一个日本的机师找到了这些车的碎片然后拼成了一辆车,很多司机都觉得这比那三辆车加在一起还要好。不过也有些司机会发牢骚说 Ruby 型汽车的好多控制器都是重复的、甚至有三份,而这些重复的控制器在某些特别的情况下又稍有不同,这会让这车开起来更麻烦。据传说重新设计的工作已经在进行中了。
Smalltalk 是辆小型汽车,原本是设计给那些打算学驾驶的人用的,不过因为它设计得太棒了,即使那些有经验的老司机都喜欢开它。它速度并没有很快,不过你可以把它的任何一个零部件拿下来改造改造,让它更符合你的期待。古怪的事情是,你其实并没有真正地驾驶它,你只是发了条消息让它去什么地方,然后它要么就开过去了,要么就告诉你它不懂你在说啥。
版本1:汇编就只是个发动机。你得自己把车子造出来,还得在它跑的时候手动给它加油。不过只要你足够小心,它就能像来自地狱的蝙蝠(a bat out of hell)一样飞速前进。
版本2:汇编:你自己就是那辆车。
如果编程语言是种武器:
C 语言是 M1 式加兰德步枪,很老但可靠。
C++是双截棍,挥舞起来很强悍,很吸引人,但需要你多年的磨练来掌握,很多人希望改用别的武器。
Java 是 M240 通用弹夹式自动机枪,有时它的弹夹是圆的,但有时候不是,如果不是,当你开火时,会遇到 NullPointerException 问题,枪就会爆炸,你被炸死。
Scala 是 M240 通用机枪的变种,但它的使用手册是用一种看不懂的方言写的,很多人怀疑那只是一些梦话。
JavaScript 是一把宝剑,但没有剑柄。
Go 语言是一种自制的“if err != nil”发令枪,每一次发射后,你都必须要检查它是否真的发射了。
Rust 语言是一种 3D 打印出的枪。将来也许真的能派上用场。
bash 是一个十分碍手的锤子,你抡起它时会发现所有东西看起来都像钉子,尤其是你的指头。
Ruby 是一把外嵌红宝石的宝刀,人们使用它通常是因为看起来很炫。
PHP 是水管子,你通常会把它的一段接到汽车的排气管,另一端插进车窗里,然后你坐进车里,开动引擎。
Mathematica 是一种地球低轨道粒子大炮,它也许能够干出很神奇的事情,但只有付得起费用的人才能使用它。
C#是一种强悍的激光大炮,架在一头驴子上,如果从驴子上卸下来,它好像就发不出激光。
Prolog 语言是一种人工智能武器,你告诉它要做什么,它会照做不误,但之后,它会弄几个终结者出来,烧掉你的房子。
Lisp 语言是一把剃须刀,有很多款式。只有寻求刺激和危险的人才会使用它。
希望可以帮到您,谢谢!

㈡ Scala 是一门怎样的语言,具有哪些优势

曾经有人问Java的创始人高斯林这样一个问题,“除了Java语言以外,您现在还使用JVM平台上的哪种编程语言?”他毫不犹豫的说是Scala。

Scala到底是什么?在目前众多的JVM语言当中,Scala无疑是最引人注意的语言之一。Scala是一个静态语言,更适合大型工程项目,Scala直接编译成Java字节码,性能接近Java。Scala是一个多范式的语言,你可以混合使用函数式和面向对象编程,混合使用可变类和不变类,混合使用Actor和传统的Java并发库。
短短一个月的时间,Scala于本月冲进了TIOBE的前五十名。一个 Twitter 的开发人员说过,Scala 将会成为现代 Web2.0 的发起语言。LinkedIn 也用这种语言。同样许多其他大的公司如 Sony Picture, EDF, SAP 也开始使用这种语言。为什么Scala发展这么迅猛,可以获得如此热烈的社区支持。
曾冠东还表示,Scala不是Java的杀手,它无法取代Java的地位,也突破不了JVM的限制、Java实现不了的功能它也实现不了。我们可以将Scala形象的理解成大量语法糖的Java。
Scala 开发团队发布了最新的2.9.2稳定版本,Scala 语言的特性有许多,例如高阶函数和对象、抽象类型绑定,actor 使得函数在 Scala 中能是一个子类成为可能,Scala 中的设计模式使得面向对象和函数编程无缝结合。Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。它已经成功运用在电信行业。Spark 是一种可扩展的数据分析平台,它整合了内存计算的基元,因此,相对于 Hadoop 的集群存储方法,它在性能方面更具优势。Spark 是在 Scala 语言中实现的,并且利用了该语言,为数据处理提供了独一无二的环境。Scala 编译器可以生成字节码,直接运行在使用JVM上。该语言(它实际上代表了可扩展语言)被定义为可直接集成到语言中的简单扩展。
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#一样的编译模型(独立编译,动态装载类),允许访问成千上万的高质量类库。
在并发性方面,与 Scala 在 .NET 领域中的姐妹语言 F# 相似,Scala 是针对 “并发性问题” 的解决方案之一,让开发人员能够更加轻松地专注于问题的实质,而不用考虑并发编程的低级细节。Actor 编程模式让高度并行应用程序的开发更加简单。Scala把Erlang风格的基于actor的并发带进了JVM。我们可以利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序,以自动获得多核心处理器带来的优势,而不必依照复杂的Java线程模型来编写程序。Scala 为并发性提供了两种级别的支持,这与其他与 Java 相关的主题极为类似:
首先,对底层库的完全访问(比如说 java.util.concurrent)以及对 “传统” Java 并发性语义的支持(比如说监控程序和wait()/notifyAll())。其次,这些基本机制上面有一个抽象层
Scala 提供了在稳定的高性能平台(Java 虚拟机)上生成的能力同时也是一门敏捷性语言。这一类型的语言也有其他的选择,例如 Jython, JRuby, Groovy 和 Clojure, 但是这些都是运行在 JVM 上的动态类型语言。Open Class 的效果让大家会觉得Scala是动态语言,但它是选择隐式转换来实现的,这也正好证明了Scala是静态语言。隐式转换(Implicit conversion)使 Scala 具有类型安全性,正如扩展方法(extension method)之于 C#,开放类(open class)之于 ruby。即:向未曾定义的类型添加方法(如字符串、列表、整数)。这是使得 Scala 符合 DSL(特定领域语言)模型的特性之一。
Scala结合了面向对象和函数编程的优势,函数编程的一个好处就是你能够像运用一个数据那样运用函数,可以用来定义真正高层级的库,或者去定义新的领域特殊语言(DSL)。

在谈及Java与Scala的对比时,曾冠东表示,Scala能调用绝大部分的Java,而Java调用Scala独有的东西会比较难。Java 拥有非常强的概念规范,因此任何一个 Java 程序之间具有非常多的相似之处,并且这样能够方便的进行程序员交替。但是 Scala 并没有这样的统一性,因为这是一门很有表现力的语言。现场曾冠东为我们演示了实际案例,如下图所示:

正所谓,金无足赤,人无完人。Scala对二进制不兼容,语法也越来越复杂,不能突破Bytecode的限制、编译速度有所缓慢。当它被广泛用于单元测试、开发工具、Socket开发、以及面对多核挑战的并发应用。总而言之,Scala是一种函数式面向对象语言,它融汇了许多前所未有的特性,而同时又运行于JVM之上。正如JRuby 创建者之一Charles Nutter 所宣称的那样Scala就是 Java 王位的合法继承人。随着开发者对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为广大软件工程师手上一件必不可少的工具。更多精彩内容,请关注专题:http://www.it168.com/remen/qcon/

㈢ Scala语言的主要应用领域与作用

Scala的特性
1.面向对象特性
Scala是一种纯面向对象的语言,每一个值都是对象。对象的数据类型以及行为由类和特征(Trait)描述。类抽象机制的扩展有两种途径。一种途径是子类继承,另一种途径是灵活的混入(Mixin)机制。这两种途径能避免多重继承的种种问题。

2.函数式编程
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scala的CaseClass及其内置的模式匹配相当于函数式编程语言中常用的代数类型(AlgebraicType)。

更进一步,程序员可以利用Scala的模式匹配,编写类似正则表达式的代码处理XML数据。在这些情形中,顺序容器的推导式(comprehension)功能对编写公式化查询非常有用。

由于JVM不支持尾部递归,Scala也不能完全支持尾部递归优化。不过,在简单的情况下,Scala编译器可以把尾部递归优化成循环。

4.静态类型
Scala是具备类型系统,通过编译时的检查,保证代码的安全性和一致性。类型系统具体支持以下特性:

泛型类,型变注释(VarianceAnnotation),类型继承结构的上限和下限,把类别和抽象类型作为对象成员,复合类型,引用自己时显式指定类型,视图,多态方法。

5.扩展性
Scala的设计承认一个事实,即在实践中,某个领域特定的应用程序开发往往需要特定于该领域的语言扩展。Scala提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构:

任何方法可用作前缀或后缀操作符,可以根据预期类型自动构造闭包。联合使用以上两个特性,使你可以定义新的语句而无须扩展语法也无须使用宏之类的元编程特性。

5.使用Scala的框架
Lift是一个开源的Web应用框架,旨在提供类似RubyonRails的东西。因为Lift使用了Scala,所以Lift应用程序可以使用所有的Java库和Web容器。

scala语言主要应用领域
cala运行于JVM之上,并且它可以访问任何的java类库并且与java框架进行互操作,scala也大量重用了java类型和类库。

大数据的开发语言是Scala的原因:

1:大数据的本身是计算数据,而Scala即有面向对象组织项目工程的能力,又有计算数据的功能。

2:现在大数据事实上的计算标准框架Spark,它是用Scala开发的,因为计算数据,Scala它是函数式编程,它实现算法非常简洁优雅。

例:kafka,它是一个消息中间件,如果外部数据要流进大数据中心,我们一般都要用kafka作适配器,那如果大数据中心的数据流到外部,也是用kafka(如Spark计算的数据要交给HBASE或MySql,期间我们都会用kafka),很多的大数据组件都是用的Scala编写的,所以,如果你想成为一个较高级的大数据开发高手,你一定要掌握Scala。

㈣ Scala 是一门怎样的语言,具有哪些优缺点

以前在这个版块也答过关于Scala的问题,但那更多的是知识普及,而没有谈Scala是什么,做什么,以及有怎样的特点。

Scala可怕的地方在于人人都能对它说上一二,但是不一定每个人都能明白。查看这个版块的帖子,有人把它当做Java的延伸版(一个UPenn宾大的学生Justin Kim ——此人目前在沃顿混得风生水起,当着我的面说Scala是在JVM上的脚本语言),有人把它当做JVM上的C++,有人觉得这是面对对象语言和函数语言的简单混合,有人觉得这就是Haskell,而且也还不如Haskell强。对Scala的偏见(或者是错误的见地)达到了很高的地步,Martin Odersky马丁·奥德斯基(Scala的发明者,EPFL教授)在今年夏天的Scala Day旧金山大会上发出了这张着名的玩笑照片:
gt;

这个图片上的翻译是:“Scala唯一的作用是将人引向Haskell”(原谅我没法完全直译)。马丁·奥德斯基以此作为一个笑话,说他该把Scala改一下名字,叫做Hascalator,还请人设计了一个Logo。

不同的语言有不同的特点,同时也带来不同的优势。如果不能理解Scala的特点,就不可能知道如何运用Scala,以及发挥其最大的优势。一些语言有很显而易见的优势,也很容易理解,比如Python,Python的哲学(Zen of Python PEP 20 -- The Zen of Python),我很早的时候曾经觉得有道理,尤其是One way to do it(一种方法做一件事情),理由是对任何任务,虽然可以采用很多方法,但总有最好的一种方法,通过在语言或者哲学层面这样定义后,能简化程序员的任务,从而达到提高效率的方法。但经过一段时间的思考后,我突然发现Python其实并不是“一种方法做一件事”的哲学,而是“一种方法做一百万件事情”的哲学:极其有限的数据结构(只有四个: List, Tuple, Dictionary, Sets),以及不能查看时间复杂度的访问方法,比如鼓励人们使用for x in list。

这种处理方式能达到Python最初的打算:发明一种每个人都能使用的简易语言,但是对于追求速度和效率的程序员而言,这几乎是略带噩梦性质的。当然,这不是说Python很慢,通过各种优化(比如NumPy/SciPy中的),以及Cython这样的将Python直接翻译为C/C++语言又重新通过C_Mole方式读回Python环境的编译器,性能可以得到不少提升,但是仍旧,Python并不追求快。

再举一个语言的例子:Java。Java的特性或者优势何在?Java的第一个优势在于它是第一个系统提供模块化(mole)设计的语言(在此之前有Smalltalk存在,该货是OOP的鼻祖)。在Java之前,炒程序员鱿鱼是很困难的事情,那些C/C++程序员,以及而且尤其是那些Lisp程序员,一旦炒掉他们,新来的人没有十天半个月,甚至半年,是不可能搞懂前任人士的代码的。每个人的代码有自己的逻辑,自己的思路,写上个数万行任谁来看都头疼。这也是为什么Paul Graham保罗·格雷厄姆(写了《黑客与画家》)讲他给雅虎做了一个用Lisp写成的在线商店的案例,在他离开后,雅虎根本没法维护他写的代码,因为数万行Lisp没人能弄得很清楚。

Java的模块化,给企业、大公司带来了第一道曙光,模块化之后,这些公司不再给程序员一整个任务,而是一大块任务的一小块。接口一定义,虚拟类一定义,换谁上都可以,管你是保罗·格雷厄姆这样的明星程序员,还是一个新来的大学生,程序员不听话就直接开除,反正模块化之后,开除程序员的成本大大降低,这也是为什么谷歌、甲骨文(这货最后收购了Java)一类的公司大规模的推崇Java,还一度提出了模块化人事管理的理念(把人当模块化的积木一样随时移进移出)。

过度企业化后,这延展出了Java的第二个特性,束缚手脚。保罗·格雷厄姆在《黑客与画家》中写道,Java属于B&D(捆绑与束缚)类型的语言。为何束缚手脚?因为要让新手和明星程序员写出类似质量的代码,尽可能的抹消人的才华对程序的影响。不同于C/C++,老手和新手写出的Java代码不会有上百倍的耗时差距。但同样也导致了Java的一个弱点——不容易优化。很多优化Java代码的程序员必须要对JVM(虚拟机)进行优化,实际上增大了很多任务难度。

通过Python和Java这两个语言的优缺点,返回来看Scala,就能瞬间明白Scala的定位了。

首先,Scala不把程序员当傻子。当马丁·奥德斯基宣布Scala 2.12将要简化语法,推出Scala "Don Giovanni"项目的时候,在视频中说的很清楚:“Scala现在是为聪明人创造的,以后也是为聪明人服务的。”所以不同于Python让程序员用一种方法做所有事情,Scala提供一整套工具,让程序员自由选择,无论是mutable数据结构,immutable数据结构,并行(parallel)数据结构。然后在这些选择中,Scala再针对他们进行算法层面的特殊优化。Scala相信程序员的聪明才智,让程序员自行选择合适的结构,以针对变化万千的任务需求,这点是Scala做得极好的地方。

再者,有人会说immutable数据结构占用内存,或者速度很慢。这是真的,但这不是Scala的错,而是这些结构就是这样定义的。这里讲的是Scala集合的运行速度,是一个来自Goldman Sachs的程序员讲他们为Java写的集合库(GSCollection)速度和内存消耗,但同时比较了gs-collection(goldmansachs/gs-collections · GitHub),Java,和Scala库的速度。最后Scala的可变集合mutable原生库完爆Java,和gs-collection基本持平。

Scala的第二个优势,相较于Java而言,则是相信程序员的优化能力。在Scala with Style讲话中(),马丁·奥德斯基说:“很多程序员会告诉我,他们一般会重构他们的Scala代码两三次,甚至三四次。”这听起来似乎非常的没有效率,但Scala就是这样的语言,每一次重构,代码的性能或者是可读性都会有极高的提升。

之前就有人提到过,Scala新手和老手写出来的代码完全会呈现两种不同的风格,甚至新人根本不能读懂有经验的Scala程序员所写的代码,有人于是戏称:“太好了,这样的话我们部门的实习生就不能乱碰我写的代码啦!”但其实不仅风格不同,执行效率差距也一定是巨大的。Scala提供一整套工具,但是要明白什么时候用拿一种工具,哪些算法能够随意调用,哪些算法不能,这一定要依靠经验、研究和学习以及对源代码的理解才能得知。最简单的例子,Scala的foreach()方法是高度优化过了的(尤其针对Range结构和Vector结构),但是fold()就不一定了。或者当受到诱惑想用zipWithIndex()的时候,一定要明白这是两次循环,最好改用Vector(...).indices.foreach()的方法,或者用.view来推迟执行。

像这样的地方还有很多。所以在这个层面上来讲,简直和C++非常的相似。从另外一个层面来讲,不仅仅是要理解语言层面的优化,Scala作为一个社区而言,是非常追求运行速度的。Ruby社区就完全不同了,Ruby曾经是推特的主要语言。推特的团队找到了Ruby团队,说,你们能不能让Ruby运行的快一点,我们有这个这个和这个建议。Ruby直接把这些建议拒绝了,因为它们会增加语言复杂度,让Ruby不能继续做一个“fun”(好玩)的语言。而Python直接就立志做一个“Simple”(简单)的语言了。于是推特只好将后台换做Scala和Java的结合。有一位在推特工作的知乎友人在我的一个回答下留言说推特换用Scala后,TypeSafe(Scala的母公司)还送去了一个蛋糕。

为了追求速度,Scala社区是绝对不会管所谓的“简单”或者是“好玩”,怎样有效率就怎样弄。与其专注于JVM的改进,Scala社区大部分在编译器上下功夫,比如很着名的Miniboxing(Miniboxing),这是一个编译器增进器。Miniboxing做的是什么呢?只做一件事:防止auto-boxing和auto-unboxing。所有的泛型,尤其是原生类泛型(Primitive Types),诸如Int、Double等等,在进行各种操作的时候会自动取出和装回它们所属的类中去——这个我解释的不太好,但是可以看这里(Java 自动装箱与拆箱(Autoboxing and unboxing))。

Miniboxing这样的插件可以让所有的原生类泛型再也不用自动装拆箱,从而将Scala的运行速度提升1.5倍到22倍()。当然这样的东西可不是白来的,这是马丁·奥德斯基的PhD博士学生做的一个研究项目,然后为OOPSLA写了一篇论文(),所以怪不得这玩意Scala可以有,但其他语言想要有都没有。

另一个Scala的很大优势就是所谓的Macro——宏。宏本身作为元编程而言,其实和运行速度是没有什么太大关系的,反而,因为对反射(Reflect)的利用,可能会影响到速度。但Scala社区对宏的理解显然和最初的设计理念有偏差。因为Scala本身是没有传统意义的循环的(for-loop),所以很多时候循环必须利用while或者foreach。但是部分追求效率的Scala程序员们利用宏为Scala写了一个传统循环,叫做cfor,被收录在Spire(non/spire · GitHub)数学计算库中。cfor的写法如下:

import spire.syntax.cfor._// print numbers 1 through 10cfor(0)(_ < 10, _ + 1) { i =>
println(i)}

而这玩意运行效率如何呢?文章中做了一次测评,将cfor和zip写的一个算法作比较——在公布结果之前,我想说的是,zip并不是一个高度优化的方法,所以本身就慢很多,cfor用了26.1毫秒运行,zip方法用了7.4 秒运行,这几乎是284倍的速度差距。

通过这两点,Scala的一个优势就很明显了——多样化。当需要写简单的代码,像Python一样当脚本语言使用时,Scala提供大量的原生方法和数据结构,可以很轻松的写出比较复杂的操作。但当需要速度的时候,又可以通过重构来获取数十倍或者上百倍的速度提升。通过Miniboxing一类的编译器增强器,Scala在某些操作的速度是必定超过Java的。

Scala的第二个优势就是——一帮勤劳勇敢的PhD博士生。二十一世纪的程序语言和二十世纪的程序语言已经不能比拟了。那个年代的普通人(甚至是学生)还能任意发明一下语言,稍微把编译器优化几次就能上得了厅堂(比如那一大堆Lisp方言),到了这个年代,编译技术已经达到了很复杂的程度(虚拟机技术也是如此),优化和语义理解,程序语言的定义与延展,再也不是随便任何人都能搞定的工作了。作为编程语言方面的教授,马丁·奥德斯基不断的将最前沿的学术界成果转移到Scala这个语言中,还让他的博士学生发展出新的,让语言运行得更快的方法,这些都是其他语言,尤其是Python、Ruby、甚至是Go都没有的优势。

当然,说了这么多,总会有人说了,Scala如果像C++一样难,又追求速度的话,为什么不直接去学C++,原因很简单——现在有很多在JVM上面写成的软件啊!大家又不是Haskell程序员,压根不打算一切自己写呐。

㈤ scala与python区别有哪些

Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言、并集成面向对象编程和函数式编程的各种特性。

Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。

scala与Python的区别:

1、性能对比

由于Scala是基于JVM的数据分析和处理,Scala比Python快10倍。当编写Python代码用且调用Spark库时,性能是平庸的,但如果程序涉及到比Python编码还要多的处理时,则要比Scala等效代码慢得多。Python解释器PyPy内置一个JIT(及时)编译器,它很快,但它不提供各种Python C扩展支持。在这样的情况下,对库的C扩展CPython解释器优于PyPy解释器。

使用Python在Spark的性能开销超过Scala,但其重要性取决于您在做什么。当内核数量较少时,Scala比Python快。随着核数的增加,Scala的性能优势开始缩小。

当大量的处理其工作时,性能不是选择编程语言的主要驱动因素。然而,当有重要的处理逻辑时,性能是一个主要因素,Scala绝对比Python提供更好的性能,用于针对Spark程序。

相关推荐:《Python基础教程》

2、学习曲线

在用Scala语言编写Spark程序时有几个语法糖,所以大数据专业人员在学习Spark时需要非常小心。程序员可能会发现Scala语法有时会让人发疯。Scala中的一些库很难定义随机的符号运算符,而这些代码可以由没有经验的程序员理解。在使用Scala时,开发人员需要关注代码的可读性。与Scala相比,Java或Python是一个灵活的语法复杂的语言。对Scala开发人员的需求越来越大,因为大数据公司重视能在Spark中掌握数据分析和处理的高效而健壮的开发人员。

Python是为Java程序员学习相对容易的因为它的语法和标准库。然而,Python是不是一个高度并行和可扩展的像SoundCloud或推特系统的理想选择。

学习Scala丰富了程序员对类型系统中各种新抽象的认识,新的函数编程特性和不可变数据。

3、并发性

大数据系统的复杂多样的基础结构需要一种编程语言,它有能力集成多个数据库和服务。在大数据的生态系统中,Scala胜在Play框架提供了许多异步库和容易集成的各种并发原语,比如Akka。Scala使开发人员编写高效的、可读性和可维护性的服务而不是。相反,Python不支持的重量级进程并行在用uWSGI时,但它不支持真正的多线程。

当使用Python写Spark程序时,不管进程有多少线程,每次只有一个CPU在Python进程中处于活动状态。这有助于每个CPU核心只处理一个进程,但糟糕的是,每当部署新代码时,需要重新启动更多的进程,还需要额外的内存开销。Scala在这些方面更高效,更容易共事。

4、类型安全

当用Spark编程时,开发人员需要根据变化的需求不断地重新编码代码。Scala是静态类型语言,尽管它看起来像一种动态类型语言,因为它具有优雅的类型推断机制。作为静态类型语言,Scala仍然提供编译器来捕获编译时错误。

重构像Scala这样的静态类型语言的程序代码比重构像Python这样的动态语言代码要容易得多且简单。开发人员在修改Python程序代码后常常会遇到困难,因为它造成的bug比修复程序原有的bug要多。所以最好是缓慢而安全地使用Scala,而不是快速的、死地使用Python。

对于小型的特殊实验,Python是一种有效的选择,但它并不像静态语言那样有效地扩展到大型软件工程中。

5、易用性

Scala和Python语言在Sparkcontext中有同样的表达,因此通过使用Scala或Python可以实现所需的功能。无论哪种方式,程序员都会创建一个Sparkcontext并调用函数。Python是一种比Scala更便于用户使用的语言。Python不那么冗长,开发人员很容易用Python编写脚本来调用Spark。易用性是一个主观因素,因为它取决于程序员的个人偏好。

6、高级特性

Scala编程语言有几个存在类型、宏和隐式。Scala的晦涩难懂的语法可能很难对开发人员可能无法理解的高级特性进行实验。然而,Scala的优势在于在重要的框架和库中使用这些强大的特性。

话虽如此,Scala没有足够的数据科学工具和库,如Python用于机器学习和自然语言处理。Sparkmlib–机器学习库只有较少的ML算法但他们是理想的大数据处理。Scala缺乏良好的可视化和本地数据转换。Scala无疑是Spark streaming特性的最佳选择,因为Python 通过pySpark 调用Spark.streaming不像Scala那样先进和成熟。

总结

“Scala速度更快,使用方便 但上手难,而Python则较慢,但很容易使用。”

Spark框架是用Scala编写的,所以了解Scala编程语言有助于大数据开发人员轻松地挖掘源代码,如果某些功能不能像预期的那样发挥作用。使用Python增加了更多问题和bug的可能性,因为2种不同语言之间的转换是困难的。为Spark使用Scala提供对Spark框架的最新特性的访问,因为它们首先在Scala中可用,然后移植到Python中。

根据Spark决定Scala和Python取决于最适合项目需要的特性,因为每种语言都有自己的优点和缺点。在使用Apache Spark编程语言之前,开发者必须学习Scala和Python来熟悉它们的特性。学习了Python和Scala之后,决定何时使用Scala来Spark以及何时使用Python来调用Spark是相当容易的。Apache Spark编程语言的选择完全取决于要解决的问题。

㈥ scala是什么是一种编程语言吗

java 虚拟机上开发的编程语言 就好比 ruby 是基于C语言上开发
java虚拟机上开发的语言很多比如 groovy
scala不但效率高 并且支持函数式编程
理解函数式编程对你将来编程有很大帮助
groovy 之父曾经说过 如果他再早几年看到scala编程这本书 他就不会开发groovy这门语言了 scala将在某一天替代java
jruby 之父说过 scala就像是java合法的王位继承人
推荐你看scala编程 这本书 我最近也在看 才看到100多页 但被它的语法惊呆了

㈦ 学习scala有哪些好的资源

为什么学习函数式编程
在阅读DDD巨着《Patterns, Principles, and Practices of Domain-Driven Design》的过程中,Scott在第5章提到了使用函数式编程语言配合贫血模型去实践DDD的一种思路,这激发了我的无限遐想。
在开发领域,我们已经拥有了许多的抽象方法论和大量的实现技术。但我个人认为,这一切归根结底,都是人类思维在开发领域的具体表达方式。而人类在认识和分析所要解决的业务领域问题时,思考的内容不外乎由两个部分组成:‘业务流程’与‘业务规则’。前者,回答了业务活动中先做什么后做什么的问题;后者,则回答了遇到什么情况时应该怎么做的问题。两者结合后,得到我们需要的业务结果,或者叫作“实现业务目标”。
再想想目前学习和掌握的面向对象的一系列方法,又是如何将上述思维结果映射到中去的呢?我认为是这样的:
对于业务流程,我们将其表达为若干对象之间的合作,比如UML里序列图的对象与消息,进而具化为具体的类及其职责,比如类及其若干业务方法。
对于业务规则,我们将其表达为若干的判断逻辑,比如UML流程图里的判断分支,进而具化为业务方法里的if-else语句,或者再复杂一点,表达为工厂、策略等设计模式的实际运用。
然后,我认为,对于复杂业务规则的梳理,可以象数学归纳法一样进行演绎:假设一个函数y=f(x),给定x的定义域,确定y的值域。特别是在排列组合等方面的一些问题,也经常采用递归的方式来解决。所以,从这个角度讲,函数式编程更贴近人类思维习惯,所以让我自然而然地把目光转向了它。
为什么选择Scala
在选择具体的函数式编程语言时,我首先想到的是它最好是同时能支持面向对象编程的。因为即便LISP作为函数式编程语言的先祖,诞生已长达半个世纪,但单纯的函数式编程语言与面向对象编程语言相比,在抽象领域概念、组合系统模块、实现信息隐蔽等方面存在一定的差距,所以一直没有成为开发的主流。
信息隐蔽原理:在西安电子科大蔡希尧与陈平老师于1993年合作出版的《面向对象技术》一书中是这样描述的:把需求和求解的方法分离;把相关信息——数据结构和算法,集中在一个模块之中,和其他模块隔离,它们不能随便访问这个模块内部的信息。
其次,由于我的语言路线是从Pascal → C → C++ → C#,所以我希望能选择一种风格近似于C、强类型的函数式编程语言。在比较了F#、R、ErLang等几种常见的函数式编程语言之后,我最终选择了Scala。
Scala有何优势
注:以下内容,节选翻译或参考自《Programming in Scala》第1章、第3章,《Programming Scala》第6章,不算完整意义上的个人心得。
函数式编程的优势
纯的函数是没有副作用的。无论何时何地,对于一个函数y=f(x),给定x必定得到y,不会因此产生二义结果。因此无论对于代码测试还是并发,由于给定输入必定得到预期输出,而不受其他因素干扰,所以能有效减少Bug产生。
在函数式编程里,大量使用immutable的值。这意味着函数运算的结果总会创建一个新的实例,避免了通常并发环境下为防止数据共享冲突而采取的保护机制。尽管这需要额外的Copy操作,但Scala针对性地提供了高效的Copy实现,以及延迟计算等弥补机制。
函数是一等公民。函数作为表达式的一部分,可以借由函数之间的嵌套、组合,实现复杂的判断逻辑。
Scala语言本身的优势
Scala是面向对象与函数式编程的混合语言,所以能有效结合二者的优点。
Scala属于Java生态圈,可以在JVM上与Java一起编译运行,所以许多Java的框架、工具都可以直接应用于Scala语言编写的项目。
Scala视一切数据类型皆为对象,且支持闭包、lambda、by-name参数等特性,语法简洁明快。
Scala使用Actor作为并发模型,与Akka框架自然契合。这是一种区别于传统的、基于数据共享、以锁为主要机制的并发模型,其特点在于以Actor为基本单位、没有数据共享、基于消息传递实现Actor之间的协作,因此可以有效避免死锁、减少竞争。
最后,如果有朝一日要转向大数据领域,有Spark这样的大型框架作为支撑。知乎:与 Hadoop 对比,如何看待 Spark 技术?
Scala对实践DDD有何意义
说了那么多,我的根本目的还是要将Scala作为实现DDD的主要武器。那么试想一下,Scala在我们实现DDD的过程中能有哪些帮助呢?我暂且胡侃乱诌如下:
表示值对象、领域事件等元素更直观。值对象、领域事件在DDD里都应该是immutable的,以往多采取POCO形式表示,现在改用Scala里的val以及case class表示,在语法层面就直观地表明是不可修改的。
在类的方法层面实现CQRS时有语法支持。用Scala里的Function(返回类型为非Unit)对应CQRS里uery,保证类的方法没有副作用;用Procere(返回类型为Unit)对应CQRS里的Command,明确表明这一类方法会产生修改状态等副作用。这同样从语法层面就能对二者进行明确区分。
模式匹配丰富了函数操作。除了正则表达式,Scala形式多样的模式匹配语法,为提取数据、完成数据分组聚合等运算、实现逻辑判断提供了强大支持。比如定义def sum_count(ints:Seq[Int) = (ints.sum, ints.size)这样一个函数后,我们可以这样调用,以得到一个1至6的整数序列的整数值合计,及该序列的尺寸:val(sum, count) = sum_count(List(1, 2, 3, 4, 5, 6))。
为实现DSL提供有力支持。Scala自带有解析框架,加上灵活的函数语法支持,要自己实现一套DSL及其相应的语法解析器将不再困难。比如在配置文件里这样的一条配置语句,表示退休条件为年龄达到60周岁或者工龄届满30年:retire = (Age >= 60) || (ServiceLength >= 30)。以往的方式是自己写一个语法解析器,把这条文本转换成相应的Specification对象,然后扔给聚合去使用。现在有了Scala的帮助,就使编写语法解析器这一环节的工作量大大减少。
合理的高阶函数设计,使规则编写得到简化。比如规则、费用报销规则,以往可能需要若干层的if-else嵌套,现在则将通过高阶函数得到大幅简化。对此,我强烈刘光聪先生的Refactoring to Functions,你会在刘先生的重构过程中发现高阶函数的强大。
Actor为高效并发打下基础。Actor
内部完全自治,自带用于存储消息的mailbox,与其他Actor只能通过消息进行交互,每个Actor都是并发的一个基本单位。这些特点,非常适合于
采取Event
Sourcing方式实现的DDD。每个聚合都好比一个Actor,在聚合内部始终保持数据的强一致性,而在聚合之间交互的领域事件则好比Actor之间
的消息,聚合之间借由领域事件和Saga保证数据的最终一致性。
Trait成为AOP利器。Trait是Scala的另一大特色,它就象AOP织入一样,能动态地给某个类型注入方法或者结构。比如配合类Circuit和with后面那4个Trait的定义,val circuit = new Circuit with Adders with Multiplexers with Flipflops with MultiCoreProcessors这样就创建了一个带有加法器、乘法器、触发器和多核处理器的元件。
隐式实现为类型扩展提供支持。对应C#里的静态扩展方法,Scala通过implicit为实现数据类型的方法扩展提供了便捷,成为Trait之外的另一个功能扩展手段。
能降低常见BDD框架的学习成本。尽管这一点可能比较牵强,但我正在努力摸索如何将BDD与DDD结合,而常见的Cucumber、Spock等一些BDD框架,其语法与Scala比较相近,所以我才有如此一说。
有哪些Scala学习资料
以下是我目前主要的学习资料,并衷心欢迎各位留言补充。
书籍
Programming in Scala:由Scala语言的设计师Martin Odersky编写,循序渐进,配合了大量实例,入门必读吧。
Programming Scala:视角与上面那本有点不一样,没有Scala语言基础会感觉很困难,适合掌握了基本语法后温故而知新。
在线文档与
Scala 官方文档:Scala的,作为寻找资料的出发点是不错的。
Scala 课堂:中文版的Scala基本语法在线课堂。
Scala Synatax Primer:由Jim McBeath整理的Scala语法概要,可以当字典用。
The Neophyte’s Guide to Scala:很出名的一个Scala入门指南,以Scala中的提取器Extractor作为实例开始。
Scala 初学指南:这是上面那本指南的中译本。
Effective Scala:中文版的Scala高效编程
SBT中文入门指南:Scala Build Tool
社区
Scala 中文社区:不算活跃,原因你懂的。
Scala User:Scala入门者聚集地,没有Stack Overflow那么严格,但也需要点爬墙的身手。
SDK及IDE
Java SE:先装这个
Scala SDK:再装这个
SBT:然后装这个
IntelliJ IDEA:最后装这个,就能比较方便地开始Scala编程了
写在最后

近读的书很多也很杂,DDD、BDD、Scala、Cucumber以及Java基础等等都有涉及,真恨不得一口吃成个大胖子。由于时间和精力有限,所以
现在知识消化很成问题,迟迟没有进入学以致用的环节,只能先这样纸上谈兵了,好歹先把自己在学习过程中的一些思考、看到的好东西先记载下来,以备将来之
需。

阅读全文

与编程语言scala武器相关的资料

热点内容
黑马程序员路径大全 浏览:1000
saas平台PHP 浏览:333
云服务器科学计算配置怎么选 浏览:649
jar解压命令 浏览:609
php正则问号 浏览:299
无线已加密不可上网是怎么了 浏览:464
什么app可以免费做手机 浏览:375
异性下载什么app 浏览:680
51单片机程序单步视频 浏览:241
家庭宽带如何连接服务器 浏览:119
汽车高压泵解压 浏览:772
上门正骨用什么app 浏览:761
安卓为什么免费使用 浏览:398
加密货币都有哪些平台 浏览:629
python和matlab难度 浏览:391
python爬虫很难学么 浏览:574
小米解压积木可以组成什么呢 浏览:818
为什么滴滴出行app还能用 浏览:567
怎么升级手机android 浏览:926
php权威编程pdf 浏览:998