java修改语言环境_在不更改语言的情况下发展Java

java修改语言环境

詹姆斯·高斯林(James Gosling)在《 Java的感觉 》中说:
Java是一种蓝领语言。 它不是博士学位论文的材料,而是工作的语言。 Java对于许多不同的程序员来说都非常熟悉Java,因为我倾向于使用很多东西而不是听起来不错的东西。

Java的非凡成就证明了这是一种明智的方法,如果它仍然是当今Java的重要目标,那么该语言应继续相对缓慢地发展是有道理的。 除此之外,Java是一种成熟的,广泛使用的语言这一事实​​使它的发展充满了困难。 一方面,添加到该语言中的每个功能都可以以微妙且通常是不可预测的方式改变其感觉,从而冒着疏远已经将其用作其选择语言的开发人员的风险。 另一方面,一个完全有意义的功能可能会以尴尬或出乎意料的方式与该语言的其他功能交互。 更糟糕的是,一旦添加了语言功能,就算是对整个语言有害,也几乎无法删除。 为了证明增加新功能的合理性,语言设计者必须非常有信心,这将对语言有长期的好处,而不是对Swift变得多余的问题提供短期或时髦的解决方案。 为了减轻风险,语言设计人员通常会在实现之前通过创建单独的语言或分支(例如用于试验Java泛型的Pizza语言)进行实验。 这种方法的问题在于,此类实验的受众既小又能自我选择。 显然,他们都会对语言功能感兴趣,其中许多人可能是学者或研究人员。 当将这样的听众很好地运用到主要语言中并且一般程序员开始使用它时,可能会在这种情况下表现不佳。

为了对此有所了解,请考虑一下Java 7引起的关于闭包的争论。主要提案(和其他一些提案)的实现已经存在了一段时间,但尚未达成共识。 因此,Sun决定JDK 7将不会获得完全关闭支持。 核心争论归结为在Java 5中添加泛型(特别是通配符语法)时,Java是否已变得足够复杂。 当Java通过匿名内部类具有更有限的形式时,是否有理由对闭包提供完全支持。 添加完全闭包支持的两个重要用例是简化与JDK 7中添加的fork / join API的配合使用,以改进多核编程并帮助清理资源。 乔希·布洛赫(Josh Bloch)的ARM块提议(现在预计将通过Project Coin包含在JDK 7中)为该问题提供了一种替代解决方案。 Cliff Click博士对Java的可伸缩性,非阻塞编程风格的研究提供了一种分叉/联接的替代方法,随着处理器内核数量的增加,它可能更合适。 如果发生这种情况,那么Java中闭包的使用可能会受到限制而无法证明它们的合理性。

尽管编程语言在某种程度上继续发展,但仍然很重要。 因此,本文研究了三种无需向语言本身进行更改即可向Java添加新语言功能的替代技术-使用自定义领域特定语言,利用Java 6注释处理器通过库添加可选语言功能以及移动从语言到IDE的语法糖。 每一种都提供了潜力,使广大主流开发人员可以在中期以非侵入性的方式尝试新功能,然后最好的想法可以过滤掉,以包含在核心语言中。

定制DSL

三种语言中讨论最广泛的是领域特定语言或DSL。 关于该术语的确切含义存在一些分歧,但是出于讨论的目的,我们将其简称为专门为解决特定问题而专门创建的一种语言,而不是将其设计为通用语言。解决每个计算问题。 因此,我们希望DSL不具备图灵功能,并且在大多数情况下都是如此。 当然也有一些极端情况。 例如, Postscript是一种图灵完整的语言,但根据我们的定义,它也可以被视为DSL。

如上述示例所示,DSL的想法并不新鲜。 其他熟悉的DSL包括正则表达式,XSLT,Ant和JSP,所有这些都需要某种自定义解析器来处理。 马丁·福勒(Martin Fowler)还建议将流畅的接口/ API视为第二种DSL,他将其称为内部DSL。 他的定义是内部DSL直接在主机语言中开发。 这是Lisp和Smalltalk程序员之间的常见做法,最近Ruby社区已经在普及该技术。

在商业上开发和维护许多著名的DSL的同时,一些企业开发团队已经使用该技术创建一种语言,使他们能够快速探索其问题领域的各个方面。 但是,它并不像现在那样普遍,这可能是因为DSL的进入障碍相当大。 团队必须设计语言,构建解析器以及可能的其他工具以支持编程团队,并对加入团队的每个新开发人员进行DSL工作原理的培训。 在这里,专门支持DSL开发的工具的出现可能会大大改变现状。 Intental Software的Intental Domain Workbench的开发时间比Java更长,这是该工具的第一个重要实现。 该项目开始于Microsoft Research,Charles Simonyi博士在1995年发表的论文“ 计算机语言的死亡,意图编程的诞生 ”描述了他的愿景。 2002年,Simonyi创立了Intentional Software,以继续致力于他的想法,并且提供了该系统的非常令人印象深刻的视频演示 。 产品本身处于1.0状态,但是访问仅限于非常有限的合作伙伴。

其他软件公司也在探索这些概念,其中包括JetBrains,它们因IntelliJ IDEA Java IDE而备受推崇,后者最近发布了1.0版的元编程系统(MPS)。 MPS不使用解析器,而是直接使用抽象语法树(AST)。 它提供了一个类似于文本的投影编辑器,使程序员可以操纵AST,并用于编写语言和程序。 对于树中的每个节点,都会创建一个文本投影-程序员处理投影时,更改会反映在节点中。 这种方法允许您以任何组合(通常称为语言编写)扩展和嵌入语言,从而促进语言的重用。 JetBrains正在内部使用该产品,并且最近发布了YouTrack ,它是使用该系统开发的错误跟踪产品。

Java 6注释处理器

尽管DSL在比Java更主流的语言(例如Java)中不如在Ruby,Smalltalk和Lisp中常见,但是Java语言的最新发展,特别是Java 6中添加的注释处理器,为希望使用它们的开发人员提供了新的可能性。在Java中。 将作为Java EE 6(本身是DSL)的一部分提供的JPA 2.0标准API提供了一个示例。 在这里,注释处理器为应用程序中的每个持久类建立一个元模型类型。 尽管开发人员完全有可能用Java手工制作元模型,但它既乏味又容易出错。 使用注释处理器消除了这种痛苦,并且由于注释处理器内置于Java 6中,因此该方法不需要特定的IDE支持-IDE委托由编译器触发的注释处理器,并且元数据模型是即时生成的。

使用注释处理器,库还可以添加新的语言功能。 例如,布鲁斯·查普曼(Bruce Chapman)的原型“无闭包”提议使用该技术提供了一种将方法转换为可在Java 6上编译的单一抽象方法(SAM)类型的机制。在我们的交谈中,查普曼指出SAM类型还支持自由变量,这是闭包的关键方面:

使用@As.Additional批注,方法主体可以声明单一抽象方法所需参数以外的其他参数。 在您获得SAM类型的实例时,这些参数可以具有绑定到它们的值,然后在每次调用该方法时将其传递给该方法。

查普曼还建立了Rapt项目,以探索该技术的其他用途,并添加了两种语言更改的实现- 多行字符串和XML文字 -JDK 7曾考虑过这些更改,但现在不会将其纳入最终版本。 Java甚至可以使用这种方法获得某种形式的闭包支持。 当被问到这一点时,查普曼说:

我们刚刚完成了一个用于它的Swing项目。 我们已经发现了一些关于泛型类型的小错误,一个最近发现的错误仍待修复,但除了使用起来似乎还不错之外,没有人愿意急于使用常规的匿名内部类。

Lombok项目是另一个探索注释处理器的项目,进一步推动了该技术的发展。 实际上,Lombok使用注释处理作为挂钩来运行Java代理,该Java代理根据注释重写各种javac内部结构。 因为它正在处理内部类,所以它可能不适合生产使用(内部类甚至可以在JVM的次要发行版之间进行更改),但是该项目是使用注释处理器可以完成的事情的令人大开眼界的示例,其中包括:

  • 支持使用具有不同访问级别的一对@Getter和/或@Setter批注来支持属性,例如@Setter(AccessLevel.PROTECTED) private String name;
  • @EqualsAndHashCode批注,它从对象的字段生成hashCode()equals()实现
  • @ToString批注,该批注生成toString()方法的实现
  • @data方法,等效于在所有字段上组合@ToString@EqualsAndHashCode@Getter和在所有非最终字段上使用@Setter以及构造函数来初始化最终字段

其他语言实验,例如从Java中删除检查的异常,也可以使用这种方法来完成。

尽管注释处理器技术为语言实验开辟了一条令人欢迎的新途径,但需要注意的是,开发人员可以轻松地读取生成的代码,而不仅仅是机器。 查普曼在我们的谈话中提出了一些建议:

生成源代码而不是字节码,并注意所生成代码中的格式(尤其是缩进)。 编译器不在乎是否全部在一行上,但是您的用户会在意。 我什至有时在适当的地方在由注释处理器生成的源代码中添加注释和javadoc。

希望该技术变得更流行时,IDE还将使查看在编译时生成的代码更加容易。

IDE中的语法糖

布鲁斯·查普曼(Bruce Chapman)在他的博客中还谈到了我们的第三种技术-将语法糖从语言迁移到IDE,并在我们的对话中阐述了他的想法。 Java IDE已经为您创建样板代码的一部分(例如类的getter和setter)已经成为惯例,但是IDE开发人员正在开始进一步推动这一概念。 JetBrains的IntelliJ 9 为内部类提供了简洁的代码块语法,类似于闭包,开发人员也可以键入。 就像代码折叠一样,它们可以扩展为编译器使用的完整匿名内部类,这使喜欢使用标准匿名内部类语法的开发人员可以这样做。 也存在类似的Eclipse 插件 。 这里的关键是“替代”语法只是编译器和任何源管理工具继续使用的实际代码的视图。 因此,开发人员应该能够在两种形式(例如扩展或折叠代码折叠)之间切换视图,并且任何无法访问Sugar定义的人都只能看到正常的Java代码。 查普曼写道 :

为了使它易于访问,有很多细节需要解决,但是从长远来看,我看到开发人员相对容易地定义了两种加糖/减糖转换( 累积奖金是实现此目标的一个不错的开始),然后进行尝试,不断发展。他们,并与同事和社区分享好人。 这样做的优点与更改语言几乎相同,没有缺点。 最好的方法会无处不在,然后在必要时形成实际语言更改的基础,以消除这种方法无法实现的任何剩余“噪音”。

由于语法糖必须映射到另一种(更详细的)语言功能,因此它不能提供完整的闭包支持。 例如, BGGA闭包的某些功能无法映射到匿名内部类,因此无法通过此方法实现。 尽管如此,这种想法为使用各种新语法来表示匿名内部类提供了可能性,类似于BGGA语法或FCM语法 ,并允许开发人员选择他们想要使用的语法。 其他语言功能(例如null安全的Elvis运算符 )当然可以通过这种方式完成。 为了进一步试验这个想法, 这个由Chapman开发的NetBeans模块被他描述为使用这种方法的Properties的“几乎没有功能”的原型。

结论

在语言开发中,始终需要在稳定性和进步之间进行权衡。 所有这些技术带来的好处是它们不会影响平台或语言。 因此,它们更容易容忍错误,因此更有利于快速而彻底的实验。 在开发人员可以自由进行实验的情况下,我们应该开始看到更多的人分别解决一些常见样板的不良信噪比,例如匿名内部类语法,将这些思想混合并发展为某种最佳形式,从而最大程度地增加了价值。案件。 看到开发人员如何使用这些不同的方法将Java平台推向新的方向,将会很有趣。

翻译自: https://www.infoq.com/articles/evolving-java-no-lang-change/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

java修改语言环境

你可能感兴趣的:(编程语言,python,人工智能,java,大数据)