Java关键术语


Java 的设计者编写了一个颇有影响力的白皮书,来结束设计初衷以及完成的情况,他们还发布了一个简短的摘要。这个摘要按以下11个关键术语进行组织:

白皮书英文
11个关键术语的概述

简短性

我们希望构建一个无须深奥的专业训练就可以进行编程的系统,并且要符合当今的标准惯例。因此,尽管我们发现C++不太适用,但在设计Java的时候还是尽可能地接近C++,以使系统更易于理解。Java剔除了C++中许多很少使用、难以理解、容易混淆的特性。在我们看来,这些特性带来的问题远远多于它们的好处。

的确,Java 语法是C++语法的一个“纯净”版本。这里没有头文件、指针运算(甚至没有指针语法)、结构、联合、操作符重载、虚基类等(请参阅本书各个章节给出的C++注释,其中比较详细地解释了Java 和C++之间的区别)。不过Java 设计者并没有试图修正C++中所有不适当的特性。例如,switch语句的语法在java 中就没有改变。如果你了解C++,会发现可以轻而易举地转换到Java 语法。
Java发布时,实际上C++并不是最常用的程序设计语言。很多开发人员都在使用Visual Basic和它的拖放式编程环境。这些开发人员并不觉得Java简单。很多年之后Java开发环境才迎头赶上。如今,Java开发环境已经远远超越了大多数其他编程语言的开发环境。

“简单”的另一面是“小”。Java的目标之一是支持开发能够在小型机器上独立运行的软件。基本的解释器和类支持大约仅为40KB,再加上基础的标准类库和线程支持(基本上是一个自包含的微内核),大约需要增加175KB。

在当时,这是一个了不起的成就。当然,由于不断的扩展,类库已经相当庞大了。现在还有一些带有较小类库的独立版本,这些版本适用于嵌入式设备和智能卡。 作者:CC躺平混吃 https://www.bilibili.com/read/cv17989172 出处:bilibili

面向对象

简单地讲,面向对象设计是一种程序设计技术。它将重点放在数据(即对象)和对象的接口上。用木匠打一个比方:一个“面向对象的”木匠主要关注的是所制作的椅子,其次才是使用的工具;一个“非面向对象的”木匠主要考虑的则是使用的工具。在本质上,Java的面向对象能力与C++是一样的。

开发Java时面向对象技术已经相当成熟。Java 的面向对象特性与C++旗鼓相当。Java与C++的主要不同点在于多重继承,在Java中,取而代之的是更简单的接口概念。与C++相比,Java提供了更丰富的运行时自省功能。

分布式

Java有一个丰富的例程库,用于处理HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网上的对象,其便捷程度就好像访问本地文件一样。

如今这一点被认为是理所当然的,不过在1995年主要还是C++或Visual Basic程序连接Web服务器。

健壮性

Java的设计目标之一是要让Java编写的程序具有多方面的可靠性。Java非常强调进行早期的问题检测、后期的动态(运行时)检测,以及消除容易出错的情况……Java与C/C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能性。

Java编译器能够检测许多其他语言中仅在运行时才能够检测出来的问题。至于第二点,对于曾经花费几个小时来检查由于指针bug而引起内存冲突的人来说,一定很喜欢Java的这一特性。

安全性

Java要适用于网络/分布式环境。为了实现这个目标,安全性颇受重视。使用Java可以构建防病毒、防篡改的系统。

从一开始,Java就设计成能够防范各种攻击,其中包括:

  • 运行时堆栈溢出,这是蠕虫和病毒常用的攻击手段。
  • 破坏自己的进程空间之外的内存。
  • 未经授权读写文件。

体系结构中立

编译器生成一个体系结构中立的目标文件格式,这是一种编译型代码,这些编译型代码可以在很多处理器上运行(只要它们有Java运行时系统)。Java编译器通过生成与特定计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且可以很容易地动态转换为原生机器代码。

当时为“虚拟机”生成代码并不是一个新思路,诸如Lisp、Smalltalk和Pascal 等编程语言多年前就已经采用了这种技术。
当然,解释虚拟机指定肯定比全速运行机器指令慢很多。不过,虚拟机有一个选项,可以将执行最频繁的字节码序列转换成机器码,这一过程称为即时编译(just-in-time-compilation)。
Java 虚拟机还有其他一些优点。它可以检查执行序列的行为,从而增强安全性。

可移植性

与C和C++不同,Java规范中没有“依赖具体实现”的地方。基本数据类型的大小以及有关运算的行为都是明确的。

例如,Java中的int总是32位整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器开发商指定的任何其他大小。唯一的限制是,int类型的字节数不能低于short int,并且不能高于long int。Java中,数值类型有固定的字节数,这消除了代码移植时一个令人头痛的主要问题。二进制数据以固定的格式进行存储和传输,消除了有关字节顺序的困扰。字符串则采用标准的Unicode 格式存储。

作为系统组成部分的类库定义了可移植的接口。例如,有一个抽象 Window 类,并给出了面向 UNIX、Windows 和 Macintosh环境的不同实现。

选择 Window 类作为例子可能并不太合适。凡是尝试过的人都知道,要编写一个在Windows、Macintosh 和 10 种不同风格的 UNIX 上看起来都不错的程序是多么困难。Java 1.0就尝试着做了这么一个壮举,发布了一个简单的工具包,为多个不同平台提供了常用的用户界面元素。遗憾的是,尽管花费了大量的心血,结果却不尽如人意,这个库并不能在不同系统上都提供让人接受的结果。原先的用户界面工具包已经重写,而且后来又再次重写,跨平台的可移植性仍然是个问题。
不过,除了与用户界面有关的部分外,所有其他 Java 库确实能很好地支持平台独立性。你可以处理文件、正则表达式、XML、日期和时间、数据库、网络连接、线程等,而不用操心底层操作系统。不仅程序是可移植的,Java API 往往也比原生 API 质量更高。

解释性

Java 解释器可以在任何移植了解释器的机器上直接执行 Java字节码。由于链接(linking)是一个增量式的轻量级过程,所以,开发过程也会更加快捷,更具有探索性。

这看上去很不错。用过 Lisp、Smalltalk、Visual Basic、Python、R 或 Scala 的人都知道“快捷而且具有探索性”的开发过程是怎样的。你可以做些尝试,然后立即就能看到结果。在 Java 发展的前 20 年里,开发环境并没有把重点放在这种体验上。直到 Java 9 才提供了jshell 工具来支持快捷而且具有探索性的编程。

高性能

尽管解释型字节码的性能通常已经足够让人满意,但在有些场合下还需要更高的性能。字节码可以(在运行时)动态转换为面向运行这个应用的特定 CPU的机器码。解释器可以在任何移植了解释器的机器上直接执行Java字节码。由于链接(linking)是一个增量式的轻量级过程,所以,开发过程也会更加快捷,更具有探索性。

使用 Java 的头几年,许多用户不同意“性能已经足够让人满意”的说法。不过,现在的即时编译器已经非常出色,可以与传统编译器相媲美,而且在某些情况下甚至超越了传统编译器,原因是它们有更多的可用信息。例如,即时编译器可以监控哪些代码频繁执行,并优化这些代码以提高速度。更为复杂的优化是消除函数调用(即“内联”)。即时编译器知道已经加载了哪些类。基于当前加载的类集合,如果一个特定的函数不会被覆盖,就可以使用内联。必要时,以后还可以撤销这种优化。

多线程

多线程可以带来更好的交互响应和实时行为。

如今,我们非常关注并发性,因为摩尔定律即将走到尽头。我们不再追求更快的处理器,而是着眼于获得更多的处理器,而且要让它们保持繁忙。不过,可以看到,大多数编程语言对于这个问题并没有显示出足够的重视。
Java在当时很超前。它是第一个支持并发程序设计的主流语言。从白皮书中可以看到,它的出发点稍有些不同。当时,多核处理器还很神秘,而Web编程才刚刚起步,处理器要花很长时间等待服务器的响应,需要并发程序设计来确保用户界面没有“冻住”。
并发程序设计绝非易事,不过Java在这方面表现很出色,可以很好地管理这个工作。

动态性

从很多方面来看,Java与C或C++相比更具有动态性。Java设计为能够适应不断演进的环境。库可以自由地添加新方法和实例变量,而对客户端没有任何影响。在Java中找出运行时类型信息十分方便。

需要为正在运行的程序增加代码时,动态性将是一个非常重要的特性。一个很好的例子是:在浏览器中运行从Internet下载的代码。如果使用C或C++,这确实难度很大,不过Java设计者很清楚动态语言可以很容易地让一个正在运行的程序实现演进。最终,他们将这一特性引入到这个主流程序设计语言中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值