📄 java语言白皮书.txt
字号:
Java语言白皮书
Java程序语言和环境的设计目的是为了解决现代设计上的问题。它最初是一项较大规模『消费者电子产品先进软件发展专案』的一部份,该专案目的是为了发展小型、可靠、可移植、分布式、实时的嵌入式系统。我们在专案一开始原决 定采用C++,不过碰到一些问题。最初,那只是编译器技术方面的问题,可是后来我们遭遇更 多困难,且发现最好的解决方式就是更换编程语言。
Java
Java是一种简单、面向对象、分布式、解释、健 壮、安全、结构中立、可移植、高效能、多线程、动态的语言。
描述系统特性的方法之一就是把一堆高效能的术语摆在一起。一如上述,我们也使用一组标准的 语来描述Java。以下我们将解释这些术语在 ava上代表的意义,以及我们试图解决的问题是哪些。
『首先,我们要介绍阿基米得公司(Archimedes Inc.);它是我们为了方便说明Java功能而虚构的一家软件公司。阿基米得从事有关基本物理教学用途的软件开发,其软体设计目的是要与使用者产生交互关系,不仅提供一如传统教科书的文字
与插图,而且也包括一组软件实验工作室,供使用者进行实验和模拟真实世界的物理行为。例 如,它最基本的一项实验允许学生组成杠杆和滑轮,然后观察它们的物理作用。在以下的论述 中,我们将借由这些实验和阿基米得设计师的旁 白,以说明Java语言概念。』
简单
我们想建立一种真正简单的系统,它允许使用者轻易地设计程序而不需要像现今的标准程序一样 接受深奥的训练。目前大多数程序设计师都采用C语言,而面向对象程序设计师则大多使用C++。 因此,即使我们发现C++并非适合我们,我们在Java的设计上还是尽可能让它与C++相近, 确保系统更容易被理解。
Java删除许多极少被使用、不容易理解和令人混淆 的C++功能,这些功能在我们的使用经验中只能 带来麻烦而非效益。删除的功能主要包括运算符 重载(operator overloading)、多重继承(inheritance)
以及广泛的自动强迫同型(automatic coercions); 载是指以一个辨识元参照多重项目,Java语言 也提供重载函数,不过它重载的对象是方法(method)而 非变量或运算符。
我们增加自动内存垃圾收集(auto garbage collection) 功能,因此简化Java程序工作,不过同时也让系统变得稍复 杂一些。储存管理(storage management)是使C与C++ 应用程序变得复杂的常见的一项原因,即关于内存的 分配与释放。Java语言的自动垃圾收集功能(周期性地 释放未被使用的内存)不仅简化了程序设计工作,而且 能大幅度减少小错误(bugs)数量。
『阿基米得设计师们原想花时间思考杠杆与滑轮原 理,但是后来却发现大部份时间都浪费在世俗的程序工作上。事实上,他们的核心专业知识在于 教学而非程序设计。这些程序工作中最复杂的部 份就是从他们那二万行程序码中,找出那些地方 浪费了内存。』
确保Java『简单化』的另一特性在于『小而单 纯』。Java的目标之一是要协助开发能独立地在小 型机器上顺利执行的软件。Java的基本解释器 (interpreter)和对象类(class)支援约占4OKB,而 若增加基本的标准程序库和线程(thread)支援 (它 实际上是一整自含式的微核心) 需增加175K。体积 小对于在嵌入式的系统中的使用是很重要的,并因 此Java可以通过网络轻易下载。
面向对象
这是在业界被过度渲染的术语之一。不过,面向对象是一项很强的设计功能,因为它促成明确的 接口定义,并允许发展者建立可重复使用的『软件IC』。
简单的说,面向对象设计是一种以数据(对象) 及其接口为重心的程序设计技术。我们以木匠比 例;一位『面向对象』木匠最重视的是他想制作的椅子,其次才是他用来制做椅子的工具。相反 的,一位『非面向对象』木匠是把主要的心思放在工具上。面向对象设计也是定义程序模块如何 『即插即用』的机制。
Java的面向对象设施实质上就是C++,并包含 Objective C的一些延伸,以提供更有动态的解决 方案。
『阿基米得设计师在他们的模拟式中设计许多东西,包括绳子与橡皮筋等。他们初期的C版本 产品是一个非常庞大的系统,因为他们必须个别地设计软件来描述绳子和橡皮筋。当以面向对象 方式重新设计应用程序时,他们发现可以定义一个基本对象来代表绳子与橡皮筋两者之间的共同 部份,然后绳子与橡皮筋即定义成基本对象类型的子对象类。其后,当他们有需要增 加链结时就能非常轻易地建立起来,因为他们可以将这些链结建立在先前已设计妥当的对象之 而不需要整个重新设计新对象模拟。』
分布式
Java拥有广泛的例程库(routine library)能轻易地处 理TCP/IP协议,例如HTTP与FTP等。这使得在Java中 比在C或C++中更容易创建网络连接。Java应用程 序可以借由URL在通过网络开启和存取对象,就 如同存取一个本地(local)文件系统一样简单。
『阿基米得设计师最初把他们的程序建立在CD- ROM上。不过他们想把一些交互式教学游戏程序 概念放在下一个产品内。例如,他们想让不同电脑上的学生一起建立一台模拟机器供大家学习。 不过,他们评估过的所有网络系统都过于复杂且要求深奥的软件工程专业能力。于是,他们只好 放弃这个概念。』
健壮
Java的目标是要协助发展者建立各方面都必须可 靠的程序。Java强调在设计初期即检查可能存在 的问题,其后则执行动态(runtime)检查,并排除 容易出现错误的条件。
强类型(strongly typed)语言例如C++的优点是允许在编译时进行深入的检查,以便提前发现错误。 不幸的是,C++承袭了C在编译检查(compile-time checking)时的一些漏洞;C的检查较为松散,特 别是在方法/过程声明方面。我们在Java中要求 声明,但并不支持C风格的隐性声明。
链结器(linker)了解类型系统并重复执行许多 已由编译器完成的类型检查,以避免出现版本不匹配问题。
Java与C/C++之间最大的不同点之一在于Java拥有一种指针(pointer)模型,能排除发生内存被 覆盖和毁损数据之可能性。Java不采用指针算 术法,而是提供真正的阵列。这允许程序执行 下标检查;再者,它也不可能发生借由对象 类型转换将一个任意整数转成指针的情形。
『阿基米得设计师的应用程序在C执行时基本上相当快速。不过他们的软件开发日程一再落后,因
为总有清理不完的小错误逃过他们的检查。他们 面对许多麻烦,包括内存分配失败、版本不一致、
接口不匹配等。C让他们能在程序码中增加一些 巧妙的设计,然而却必须因此付出时间代价以求
确保程序品质。由于错误清不干净,因此他们的软件推出第一版之后就得忙着写修补程序。』
Java虽不能排除品质确认问题,不过它让这道程序变得简单许多。
许多动态语言例如Lisp、TCL与Smalltalk等,通常被用来制作原型程序(prototyping)。它们在这方面成功的理由是因为它们都非常健壮(robust),让程序设计师不再怕处理内存问题,因为他们 不须担心内存失败。Java即拥有这项特性。Java 程序员相对地可以不害怕处理内存问题,因为在 Java中不存在指针,Java程序不可能意外覆盖一 片内存缓冲区的末尾。Java程序也不可能非法访问 内存,但这些在C或C++中都有可能发生。
动态语言适合开发原型程序发展的理由之一,就是它们不会在发展初期就要求你拟定明确的决 策。Java刚好相反,它强迫你明确地做选择。这 些选择伴随许多辅助:你可以编写方法调用 (method invocations),而如果你有某些错误的地方,你将会在编译时获得通知,而不须担心方法
调用上的错误。
安全
Java设计目的是要供使用于网络/分布式运算环 境。为此,Java非常强调安全性,以确保建立无 病毒且不会被侵入的系统。Java的验证技术是以公钥 (public-key)加密法为基础。
『健壮性』与『安全』之间存在一种很强的相互作用关系。例如,指针语意的改变,让应用程 式不可能伪造对象结构存取权,或存取它们在对象中没有存取权的私有数据。这等于关起大门, 阻绝大多数病毒活动。 『有人为阿基米得的PC版软件写了一个有趣的修 补程序,然后将它贴到一个主要的电子布告栏上 面流通。由于这支修补程序很容易取得而且又能 为系统增加一些有趣的功能,于是很多人都下载 使用。这个程序未经阿基米得设计师检验过,不 过它用起来似乎还不错。直到四月一日那天,好 几千名使用者发现他们小孩使用的教学软件突然 跳出几张不堪入目的图片。不用多加说明,阿基米得设计师们虽不用为这个意外负起责任,但是 他们还是必须设法控制那个修补程序造成的破 坏。』
结构中立性
Java的设计目标是要支援网络应用程序。一般而 言,网络是由许多不同的系统构成,包括各种 CPU与操作系统结构。为了让Java应用程序能够 在网络上任何地方执行,其编译器会产出一种具 备结构中立性(architecture neutral)的目标文件格 式。编译后的程序码可以在提供Java runtime系统 的多种不同处理器上面执行。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -