📄 java语言白皮书.txt
字号:
这不仅对网络应用很有帮助,而且也很适合单一 系统软件流通。在目前的个人电脑市场上,应用 程序发展者必须为他们的程式分别编写IBM PC 和Apple Macintosh相容版本。现在,PC市场正 (透过Windows/NT)分散成许多CPU结构,而 Apple则从68000转向PowerPC,这些事实使得我 们几乎不可能设计出能在所有平台上执行的软 体。Java允许同一版本的应用程序在所有平台执 行。
Java编译器是借由产出与某一电脑结构无关的 字节代码指令,以达到上述功能。它们能轻易地 在任何机器上解释,并且动态地转换成原生模式的机器码。
『阿基米得是一家小公司。他们从设计PC软件起 家,因为那是最大的市场。经过一段时日之后, 他们成长至规模够大的公司,因此有能力为 Macintosh平台开发软件,不过那确实是一项很大 的工程,而且投资报酬并非真的很好。他们无力 负担将软件移植到PowerPC Macintosh或MIPS NT 机器所涉及的人力与成本。当第一波潮流来临 时,他们未能捉住机会,而竞争者即趁虚而 入。』
可移植性
结构中立性是确保程序可移植的最重要部份,不 过除此之外还有很多条件必须配合。和C与C++ 不同的是,Java规范中并无任何『结构相依性』 的陈述存在。它指定基本数据类型的大小,以及 其算术运算元之执行行为。例如,"int" 代表一 个有符号的二进制补码32比特整数,而"float" 代表一个32比特IEEE 754浮点数。这些选择在 今天的环境很适用,因为几乎所有CPU都具备这 些特性。
程序库属于系统的一部份,它定义了一些可移植 的程序接口。例如,它包括一个抽象的Windows类 ,并且提供了类在Unix、Windows和 Macintosh平台上的实现。
Java系统本身具备相当好的移植性。编译器以Java 写成,而runtime程序使用ANSI C,并有一个实 质上与POSIX相容的移植疆界(portability boundary)。"
解释
Java解释器(interpreter)可以直接在任何已移植解 释器的机器上解释、执行Java字节代码,不需存储。 再者,由于其链结比较倾向于逐步增量与轻量过程, 因此发展程序更快、更精密。
由于编译期间的信息属于字节代码资料流的一部 份,因此可以在运行期间携带更多的信息。这正是链结器类型检查的基础,它也让程序更容易执行除错。
『阿基米得设计师花很多时间等候程序编译和链 结。他们也花很多时间追踪许多无法感测到的错 误,因为有些更改过的原始档案未能完成编译程 序 (虽然他们使用了make公用程序) 而导致版本 不一致。同时还要追踪一些在程序中许多声明不 一致的程序。于是,他们的软件发展日程又延诱 几个月。』
高效能
虽然解释过的字节代码性能已相当不错,不过有 些情形下还是要求程序达到更高执行效能。 字节代码可以动态地(runtime)为执行应用程序的 特定CPU解释成机器码。这对于习惯使用一般编 译器与动态载入器(loader)的设计者而言,有点类 似将最终的机器码产生器放到动态载入器之内。
字节代码格式在设计上即顾及机器码的产生,因 此实际的机器码产生程序相当简单。产出的机器 码是有效的,编译器自动分配寄存器,而 在产出字节代码时也会进行一些优化。
我们以解释码在一台Sun Microsystem SPARC Station 10上执行时,达到每秒三十万个方法调用 (method calls)速率。字节代码转换 至机器码的速度性能,几乎和原生 模式的C或C++没有两样。
『当阿基米得公司刚成立时,他们 用Smalltalk设计原型程序。这协助该公司获得投 资者赞助,不过那并没有真正的帮助他们生产产 品:为了让他们的模拟程序跑得够快并符合精简
系统要求,他们只好用C重新设计。』
多线程
在真实世界中,许多事情同时发生在我们身边。 多线程(multithreading)是一种应用程序设计 法。不幸的是,要设计一个一次同时处理许多事 件的程序,比设计传统单一线程C与C++程序来得复杂许多。
Java拥有一组复杂的同步化基本单元,它们 是以广泛使用的C.A.R. Hoare监视器与条件变量图为 基础。将这些概念溶合到语言之后,它们即变得很容易使用且更为健壮。这项溶合方式大部份来自 Xerox的Cedar/Mesa系统。
多线程的其他效益包括更好的交互式回应能力 与实时执行行为。然而这会受到底层平台的限 制:独立执行的Java运行环境有着很好的实时执行行 为,而若在其他系统例如Unix、Windows、Macintosh或Windows NT等之上执行则由于底层 平台的原因实时反应性将会受到影响。
『阿基米得的模拟程序一次同时执行许多项实 验:拉动绳子、转动轮子和摇杠杆,同时还追踪 使用者输入。由于他们必须将这些模拟全部设计 在一个单一线程的程序格式内,因此所有同时发 生的动作 (不论彼此之问是否有关系) 必须用人 工方式予以混合。使用一个事件回路可以让情况 更清楚一些,不过那仍旧是一团混乱,系统变得 很脆弱而难以理解。他们从整个网络撷取数据, 不过最初他们只能一次抓一个区块,这种串行的 网络通讯非常缓慢。当他们转移到多线程模式 之后,网络通讯问题即迎刃而解。』
动态
从许多方面而言,Java是一种比C或C++更具动态 特性的语言。它在设计上强调为进化中的运算环 境提供支援。
例如,C++在生产环境中的主要问题之一在于该 程序码在一般设计上引起的负作用。如果甲公司 设计一个对象类程序库,而乙公司采购后它并 放到自己的产品中使用,然后如甲公司更改其程 式库并提供新的版本,那么乙公司将几乎可以确 定必须重新编译和重新流通他们的新软件。当最 终用户分别向甲乙两家公司购买软件 (例如甲 是作业系统厂商,而乙是应用程序厂商),那么 问题就产生了。
例如,如果甲公司为其程序库供应一种升级版 本,那么乙公司的所有软件都将必须修改。虽然 C++可以避免此一问题,不过那极为困难,而且 它也意味着不能直接使用该语言的任何面向对象功 能。
『阿基米得采用3DPC公司提供的面向对象图形程 式库建立他们的产品。3DPC后来推出新版本的 图形程序库,并且有数家电脑制造商将它搭配在 新机器上出货。采购这些新机器的阿基米得客户 很失望地发现他们的旧软件不能继续使用。 (在 真实世界中,这种情形只发生在Unix系统上。在 PC领域里,3DPC将永远不会推出这样的程序 库,因为他们更改和使用C++面向对象功能的能 力受到极大的限制。 )』
Java是在稍后的阶段为模块与模块之间建立这些 连接,因此完全避免了这些问题,并能更直接地 运用面向对象设计体系。程序库可以自由地增加 新方法和实例(instance)变量,而不会对它们的用户产 生任何效应。
Java能了解由Objective C引用过来的接口概念。 简单的说,接口就是规范一组与对象相对应的方 法,但对象如何实现这些方法则留待解决。一个 类实现一个接口是要提供这个接口所包含的所有 方法的实现。以此相反,派生子类则从父类继承 了一组方法以及它们的实现。一个Java类可以实行 多个接口,但只能从一个父类继承。接口告诉连接 对象它可以做什么而非怎么做,使得它在代码上更 具有灵活性和可复用性。
对象类有一种运行(runtime)表示法:它有一种类称 为Class,其内容包括runtime class定义。在C或
C++程序中,如果你有一个指针指向一个对 向,但你不知道该对象的类型为何,那么你将没 有办法找出它。然而,在Java中要根据runtime类 型信息寻找是很直截了当的。因为,在compile- time和run-time时都会检查数据类型转换,所以 你在Java中可以信任这种转换。另一方面,C与 C++的编译器则只是相信你已做了正确的处理。
此外,它也可能从一个包含名称的字串查找一个 对象类别定义。这意味着你可以演算一个数据类 型名称,然后轻易地以动态方式链结到执行系统。
『阿基米得为扩充营收源,希望让他们的产品能利用新的 入式模块来扩充系统。这种扩充以前 在PC上是可能做到的,只是很少实现。他们必 须增加一些新程序设计员,因为那些工作很复 杂,而且也增加许多除错问题。』
总结
Java语言提供一种强有力的工具支援程序设计员。
Java让程序设计变得更容易,因为它属于面向对 象语言,而且提供了自动的内存垃圾收集功 能。再者,由于Java码具备结构中立性,因此其 应用程序成为非同质性运算环境 (例如Internet) 的理想方案。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -