当前位置:天才代写 > tutorial > JAVA 教程 > Java.next:下一代的JVM语言

Java.next:下一代的JVM语言

2017-11-02 08:00 星期四 所属: JAVA 教程 浏览:44

副标题#e#

本文是ThoughtWorks公司架构师Neal Ford在IBM developerWorks系列文章java.next中的第一篇,其基于Groovy,Scala和Clojure,报告了多语言编程的重要性,并对静态范例与动态范例,函数式编程与呼吁式编程举办了较量。(2013.02.06最后更新)

在我与Martin Fowler曾经相助泛起的一次主题演讲中,他作出了一个有洞察性的概念:

Java的遗产将是平台,而不是措施设计语言。

Java技能的原始工程师们作出了一个明智的抉择,就是将编程语言与运行时情况分隔,最终这使得高出200种语言可以或许运行在Java平台上。这种架构对付该平台的恒久活力是至关重要的,因为计较机措施设计语言的寿命一般都是较量短。从2008年开始,由Oracle主办的一年一度的JVM语言峰会为JVM上其它的语言实现与Java平台工程师举办开放式相助提供了机会。

接待来到Java.next专栏系列,在本系列的文章中,我将报告三种现代JVM语言–Groovy,Scala和Clojure–它提供了范式,设计选择与舒适因子之间一种有趣的殽杂。在此我不会花时间去深入先容每种语言;在它们各自的站点上都有这类深度先容。但这些语言社区的站点–它们主要目标是为了传布这些语言–都缺乏客观的信息,可能是该语言不合用的例子。在本系列的文章中我将举办独立地较量,以填补上述空缺。这些文章将概述Java.next措施设计语言,以及进修它们的长处。

逾越Java

Java措施设计语言到达卓越的水平就是,按Bruce Tate在他的Beyond Java一书中的说法,完美风暴:Web应用的鼓起,已有Web技能由于各种原因不能适应需求,企业级多层应用开拓的鼓起,这些因素配合培育了Java的卓越。Tate也指出这场风暴是一系列唯一无二的事件,曾经没有其它语言利用沟通的途径到达沟通的卓越措施。

Java语言已经证明其在成果方面的强大机动性,但它的语法与固有范式则存在着恒久已知的范围性。尽量一些理睬过的变革即将引入到该语言中,但Java语法却不能很容易地支持一些重要的将来语法特性,譬喻函数式编程中的某些特性。但假如你试图去找到一种语言去替代Java,那么你就找错了。

多语言编程

多语言编程–在2006年的一篇博客中我使这个术语重焕活力并从头风行起来–是基于这样的一种认识:没有一种编程语言可以或许办理每个问题。有些语言拥有某些内建的特性,使其可以或许更好地适应特定的问题。譬喻,由于Swing十分巨大,开拓者们发明很难编写Java中的Swing UI,因为它要求事先声明范例,为UI行动界说烦人的匿名内部类,尚有其它的贫苦事儿。利用更适合构建UI的语言,如Groovy中的SwingBuilder东西,去构建Swing应用会美好得多。

运行在JVM上的措施设计语言大量增多,这大大引发了多语言编程理念,因为你可以混用编号语言,并可利用最佳匹配的语言,但同时却维护着沟通的底层字节码和类库。譬喻,SwingBuilder并不是要替代Swing;它只是搭建在已有的Swing API之上。虽然,在相当长的时间内,开拓者们照旧将在JVM之外殽杂利用编程语言–譬喻,为特定目标而利用SQL和JavaScript–但在JVM的世界内,殽杂编程将变得更为风行。ThoughtWorks中的很多项目就适用着多种编程语言,而所有由ThoughtWorks Studios开拓的东西则都要利用殽杂语言。

即便Java仍是你主要的开拓语言,进修一下其它语言是如何事情的会让你将它们纳入你的将来计谋中。Java仍将是JVM生态系统中的重要构成部门,但最终它更多是作为该平台的汇编语言–或是由于纯粹的机能原因,或是在应对非凡需求时才会用到它。

编程语言的进化

当上世纪八十年月我还在大学时,我们利用着一种称作Pecan Pascal的开拓情况。它唯一无二的特性就是能使沟通的Pascal代码既可运行在Apple II上,又可以运行在IBM PC上。Pecan的工程师们为了实现这一目标利用了一种称作"字节码"的神秘之物。开拓者们将他们的Pascal代码编译成"字节码",该"字节码"则运行在为各个平台编写的原生"虚拟机"上。那是一段可骇的经验!最终措施慢的出奇,即便只是一个简朴的类赋值。其时的硬件无法应对这一挑战。
Pecan Pascal之后的十年,Sun宣布了利用沟通架构的Java,它受限也受利于上世纪九十年月的硬件情况。Java还插手了其它的对开拓者友好的特性,如自动的垃圾收集。由于曾经利用过像C++之样的语言,此刻我再也不想利用没有垃圾收集成果的语言去编码了。我甘愿花时间在更高抽象条理上去思考巨大的业务问题,而不是像内存打点这样的巨大管道问题。

计较机语言凡是没有很长命命的原因之一就是语言僻静台设计的创新速度。由于我们的平台变得更为强大,它们可以处理惩罚更多的特别事情。譬喻,Groovy的内存化(memoization)特性(2010年插手)会缓存函数挪用的功效。不需要手工编写缓存代码,那样会引入潜在的缺陷,你仅仅只是需要挪用memoize要领而以,如清单1所示:
清单1. 在Groovy中内存化函数

def static sum = { number ->
  factorsOf(number).inject(0, {i, j -> i + j})
}
def static sumOfFactors = sum.memoize()

#p#分页标题#e#

在清单1中,sumOfFactors要领返回的功效会被自动缓存。你还可以利用要领memoizeAtLeast()和memoizeAtMost()去定制缓存行为。Clojure也含有内存化特性,在Scala中也有略有实现。像内存化这样存在于下一代编程语言(以及某些Java框架)中的高级特性也将逐渐地进入到Java语言中。Java的下一个版本中将插手高阶函数(higher-order function),这使得内存化更容易被实现。通过研究下一代Java语言,你就可以先睹Java的将来特性为快了。

Groovy,Scala和Clojure

Groovy是二十一世纪的Java语法–浓缩咖啡代替了传统咖啡。Groovy的设计方针是更新并消除Java语法中的障碍,同时还要支持Java语言中的主要编程范式。因此,Groovy要"知晓"诸如JavaBean,它会简化对属性的会见。Groovy会以很快的速度纳入新特性,包罗函数式编程中的重要特性,这些特性我将在本系列的后续篇章中着重描写。Groovy仍然主要是面向工具的呼吁式语言。Groovy区别于Java的两个根基差异点:它是动态而非静态的;它是的元编程本领要好得多。

Scala从骨子里就是为了操作JVM而举办设计的,可是它的语法例是完全被从头设计过了。Scala是强静态范例语言–它的范例要求比Java还严格,但造成的贫苦却很少–它支持面向工具和函数式范式,但更偏好于后者。譬喻,Scala更喜欢val声明,这会生成不行变变量(雷同于在Java中将变量声明为final)赋给var,而var将建设更为各人所熟悉的可变变量。通过对这两种范式的深度支持,Scala为你大概想要的(面向工具的呼吁式编程)与你所应该想要的(函数式编程)之间架起了一座桥梁。

Clojure是最激进的,它的语法是从其它语言中疏散出来,被认为是Lisp的方言。Clojure是强动态范例语言(就像Groovy),它反应了一种义无反顾的设计决定。固然Clojure答允你与遗留的Java措施举办全面而深度的交互,可是它并不试图构建一座桥梁去毗连面向工具范式。譬喻,Clojure是函数式编程的铁杆,也支持面向工具以答允与该种范式举办互操纵。尽量它支持面临工具措施员所习惯的全部特性,如多态–但,是以函数式气势气魄,而非面向工具气势气魄举办实现的。设计Clojure时遵循了一组焦点的工程原则,如软件事务内存(Software Transactional Memory),这是为了迎合新成果而冲破了旧有的编程范式。


#p#副标题#e#

呼吁式 vs. 函数式

另一个主要的较量维度就是呼吁式与函数式。呼吁式编程注重于单步执行的布局,在很多环境下,它是仿照了早期底层硬件的有益布局。函数式编程则注重将函数作为第一等的布局体,以试图将状态通报与可变性低落到最小。

Groovy在很洪流平上是受Java的开导,它在基础上仍然是呼吁式语言。但从一开始,Groovy就插手了很多函数式呼吁的特性,而且今后还会插手更多的此类特性。

Scala则弥合了这两种编程范式,它同时支持这两种范式。在更方向(也更勉励)函数式编程的同时,Scala依然支持面向工具和呼吁式编程。因此,为了恰内地利用Scala,就要求团队要受到精采的培训,以确保你不会混用和随意地选择编程范式,在多范式编程语言中,这一直都是一个危险。

Clojure是铁杆的函数式编程语言。它也支持面向工具特性,使得它可以或许很容易地与其它JVM语言举办交互,它并不试图去弥合这两种范式之间的隔膜。相反,Clojure这种义无反顾的决定使它的设计者所思量的语句成为很好的工程学实践。这些决定具有深远的影响,它使Clojure可以或许以开创性的要领去办理Java世界中一些挥之不去的问题(如并发)。

在进修这些新语言时所要求的很多思想上的转变就是源自于呼吁式与函数式之间的庞大不同,而这也正是本系列文章所要摸索的最有代价的规模之一。

结论

开拓者们正糊口在一个多语言编程快速成长的世界中,在这种情况中,要求利用多种差异的语言去办理问题。进修高效地操作新语言可以辅佐你抉择哪种要领是符合的。即便你无法分开Java,它也会慢慢地将下一代JVM语言中的特性纳入到Java中;此刻看看这些新特性,就会使你在潜移默化之中把握到将来的Java语言。

在本系列的下一篇文章中,我将开始通过摸索Groovy,Scala和Clojure中的共通之处来对它们举办较量。

 

    关键字:


天才代写-代写联系方式