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