在不改变语言的前提下如何推进Java的不断演进

James Gosling在“The Feel of Java”中说到:

Java是一种蓝领语言,它并非博士的论文素材而是用于完成工作的语言。各式各样的程序员都非常熟 悉Java,因为在设计Java之初我就坚持这样一种观点:选择久经考验的东西而非仅仅是听起来很美。

Java所获得的巨大成功证明了这种设计方式是正确的,但如果这依然是当今Java的重要目标的话,那 么其结果就是语言的演进将变得非常缓慢。除此以外,Java是一门成熟、使用广泛的语言这个事实也将导 致其演进过程充满了困难。一方面,添加到语言中的每个特性都可能在一定程度上造成不可预料的结果, 这么做会疏远那些已经使用了该语言的开发者。另一方面,本身很完美的特性可能在同语言中的其他特性 进行交互时产生不可预料的结果。更糟的是,一旦增加了某个语言特性,几乎就不可能再将其移除了,即 便是该特性会对整个语言产生不利影响也没办法。为了证明某个新特性是正确的,语言设计者必须确信从 长远来看,该特性会给语言带来好处,而不是短期效益或是针对某个问题的快速解决方案,之后就变得可 有可无了。为了降低风险,语言设计者通常都会创建单独的一种语言或是分支来进行试验,比如Pizza语 言就是在实现前用来测试Java泛型的。这种方式的问题在于试验的参与者非常小众并且都是自己想参与进 来的;显然他们对语言特性很感兴趣,很多人都是学者或研究员。但是,在普通的程序员开始使用这些特 性时,那些学者或是研究员认为很棒的特性可能会变得很糟。

为了直观感受一下这种情况,请考虑关于Java 7闭包特性的激烈争论。一段时间以来,有人在提案中 给出了闭包的实现,但最终却还是没有达成共识。随后,Sun决定不打算在JDK 7中添加完整的闭包支持。 这时争论的焦点转向为Java是否变得越来越复杂了,在Java 5中添加泛型(尤其是通配符语法)时就已经 出现了这种争论;在Java已经通过匿名内部类部分实现该功能的情况下,完整的闭包支持是否是正确的呢 。需要完整闭包支持的两个重要场景是简化fork/join API(添加到了JDK 7中以改进多核编程)的使用以 及辅助资源的清理。Josh Bloch的ARM block提案(期望通过Project Coin加入到JDK 7中)就第二个问题 给出了另一种解决方案。Cliff Click博士在面向Java的可扩展、非阻塞编程风格的研究中给出了关于 fork/join的另一种方案,随着处理器核心数的不断增 加,这种方案看起来更合理。如果这一切都成为可 能的话,那么Java中使用闭包的地方将变得非常少了,语言根本没必要提供这个特性。

话虽如此,但对于编程语言来说,持续不断地平稳发展还是非常重要的。因此本文探究了如下3种技术 以向Java中增加新的语言特性而又不改变语言本身,他们 是客户化领域特定语言(DSL)、Java 6的注解 处理器(通过库来增加可选的语言特性)以及将语法糖从语言迁移到IDE中。每项技术都可以让众多的主 流开发者以非侵入的方式体验这些新特性,最棒的想法则可以融入到语言核心当中。

客户化DSL

在这3项技术中,人们谈论最多的还是DSL。该术语的确切含义至今尚未统一,但出于讨论的目的,我 们在这里简单地把它看作是用于解决特定问题、应用范围很窄 的一种语言而非用于解决所有计算问题的 通用语言。这样,DSL就并非是图灵完备(non-Turing complete)的。当然了,还是会有一些边际情况存 在的,比如说Postscript是一种图灵完备的语言, 但根据我们方才的定义,它也是一种DSL。

如上所述,DSL并非新概念。其他类似的DSL还有正则表达式、XSLT、Ant以及JSP等等,所有这些都需 要某种客户化的解析器对其进行处理。Martin Fowler还说fluent interfaces/API也可以看作是另一种 DSL,称之为内部DSL。他说内部DSL是直接在宿主语言中开发出来的。这对于Lisp和 Smalltalk开发者来 说很容易理解,而最近Ruby社区也开始对内部DSL情有独钟了。

时间: 2025-01-24 20:43:14

在不改变语言的前提下如何推进Java的不断演进的相关文章

java socket 多线程-请问下面这个程序,在不改变功能的前提下,可以改装成多线程运行吗?*请贴上代码,谢谢*

问题描述 请问下面这个程序,在不改变功能的前提下,可以改装成多线程运行吗?*请贴上代码,谢谢* import java.net.*; // for Socket, ServerSocket, and InetAddress import java.io.*; // for IOException and Input/OutputStream public class Server { private static final int BUFSIZE = 32; // Size of receiv

如何在不破坏Java虚拟机的前提下实现热部署

本文将探索如何在不破坏 Java 虚拟机现有行为的前提下,实现某个单一类的热部署,让系统无需重启就完成某个类的更新. 在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作.对于某些大型的应用来说,每次的重启都需要花费大量的http://www.aliyun.com/zixun/aggregation/7201.html">时间成本.虽然 osgi 架构的出现,让模块

Excel2010不改变原数据顺序下怎么排序?

  在Excel2010中,如果不改变原有数据的顺序下,怎样进行排序呢?下面小编就为大家介绍Excel2010不改变原数据顺序下怎么排序的方法,一起来看看吧! 方法/步骤 1.编辑好的工作簿. 2.在E2的单元格中输入=RANK. 3.在输入(D2,$D$2:SD$21,0)后按住Enter键. 4.其中,0代表的是按照降序排序列表,1则代表的是按照升序排列列表. 5.选中E2单元格,用填充柄填充其他的单元格. 6.这样,就可以在不改变数据顺序下进行排序了. 以上就是Excel2010不改变原数

在不格式化硬盘的前提下转成NTFS格式

  故障问题:在不格式化硬盘的前提下转成NTFS格式 故障处理:在"开始"菜单中单击"运行"命令,打开"运行"对话框,输入"cmd"并回车,在打开的命令提示符窗口中输入命令"convert X: /FS:NTFS",其中X代表欲转换文件的分区盘符.比如要将C盘从FAT32格式转换为NTFS格式,就在命令提示符窗口中输入"convert C: /FS:NTFS",然后回车.

在没有物理光驱的前提下,U盘在PE下怎么安装xp

在没有物理光驱的前提下,利用U盘在PE下安装XP原版镜像的步骤方法如下: 需要用到的工具: winxp原版系统iso镜像+启动U盘 电脑店U盘制作工具 winxp原版系统iso镜像下载地址: 中文版迅雷下载(或电驴) | 英文版迅雷下载(或电驴) 1.进入第一个PE后找到我们事先准备好的xp光盘iso镜像,右键点击加载虚拟磁盘(也可以利用虚拟光驱来加载或者直接用右键里的RAR解压到本地硬盘分区) 第一步 2.打开桌面上的windows安装工具,选择刚才加载的虚拟磁盘(如果前面是直接解压的ISO文

如何通过c语言实现Linux下的top命令来获取cpu利用率?

问题描述 如何通过c语言实现Linux下的top命令来获取cpu利用率? 如何通过c语言实现Linux下的top命令来获取cpu利用率?我下载了好几个版本的procps但是在Ubuntu下编译里面的top.c时都出错,求各位大神帮忙解答. 解决方案 linux下用top命令查看cpu利用率超过100%linux下用top命令查看cpu利用率超过100%LINUX下查看CPU使用率的 top 命令 解决方案二: #include <stdio.h>#include <unistd.h>

python-Python中subprocess模块怎样运行外一个shell命令的前提下再运行另外一个,谢谢

问题描述 Python中subprocess模块怎样运行外一个shell命令的前提下再运行另外一个,谢谢 比如说先运行切换用户权限,然后再进行操作比如以下编码是不行的 child1=subprocess.Popen('su test'shell=True)child1=subprocess.Popen('mkdir test'shell=True)这样子还是会在当前用户进行mkdir,那怎样做才能在test用户下进行创建?谢谢!! 解决方案 把几个命令放到一个bash脚本 然后popen直接执行

如果文件感染病毒,在保证数据安全的前提下应该:

问题描述 如果文件感染病毒,在保证数据安全的前提下应该: A.隔离病毒 B.删除病毒 C.不做任何操作 D.删除文件 应该选择什么? 求网鞋回答 解决方案 我会选择这个:D.删除文件 解决方案二: B 一定要删除v 病毒 解决方案三: 和文件一起隔离,一般删不掉的

ios- IOS在不使用任何框架的前提下,如何把模型转换成字典呢?

问题描述 IOS在不使用任何框架的前提下,如何把模型转换成字典呢? IOS在不使用任何框架的前提下,如何把模型转换成字典呢?我现在真的不知道怎么弄了,谢谢 解决方案 利用KVC就可以了直接[self setValuesForKeysWithDictionary:Dict]; 解决方案二: 你要的是自动转换吗?那样就需要通过objc的函数遍历模型的属性,然后转换成字典的 key-value ,还要考虑数据类型兼容问题,不然会有bug,具体做法可以参考 JsonModel 的实现如果是手动转换,那就