Document the Java: Sun Microsystems 公司的白皮书-- 1995.10 James Gosling 和 Henry McGilton 的草案-- 说明了Java的以下主要特性:
*Simple and Familiar (简单熟悉)
*Object-oriented (面向对象)
*Architecture-neutral (结构中立)
*Portable (可移动)
*Somewhat Interpreted (部分解释)
*Distributed (分布式的)
*Robust (鲁棒性)
*Secure (安全)
*High performance (高性能)
*Multi Threaded (多线索)
*Dynamic (动态)
Java 特性 -- 简单熟悉
Java 省略了C++ 中一些很少用到的, 不易理解的和易于混淆的特性, 包括操作符重载, 多重继续, 指针和自动类型强制.
它增加了自动垃圾清理, 使得用Java进行动态编程比用 C 或 C++ 轻易.
不再有mallocs!
它还加了´接口´ 构造, 类似于 Objective C 的概念, 经常用于通过答应method调用语法是"继续的"来弥补多重继续的缺少带来的不便.
结果因为它类似于C++, 用户会比较熟悉, 便于编程.
这样做的另一个结果是使得内核变得很小, 适用于消费者电子设备. 基本解释器(alpha) 为~40Kb, 库和线索另外需要 175Kb.
Java 特性 -- 面向对象
Java 模型可以看成是 C++ 的一个子集, 带有一些从Objective_C 中继续下来的动态元素(方法重载, 垃圾收集).
结构, 联合和函数被抽象成为Java类的数据和方法(methods) -- Java 比较简单!
Java模型的优点不仅在于简单还在于和系统相关的类库的扩充 (大约 250 个公共库在alpha 和 beta 版中发布).
Java 类也在Web 嵌入模型中起到通讯单元的作用. Applet 类通过Html的applet标记中的名字标识自己. Applet 下载出现在applet源程序中的其它类. 因此, Java 类名字起到分布式Java代码数据库的地址模式的作用.
Java 特性 --结构中立
C/C++ 在异构网络环境下编程需要使用和兼容多个平台和相应的编译器. 这个问题在 Java中通过称为bytecode(或opcode)的独立于平台的二进制描述解释的设计而解决了.
Java 编译器(用 Java 写成的, 平台独立) 读取 Java 源程序生成Java bytecode. 这些 bytecodes 根据浏览器的要求被送到客户端的机器上.
每个客户机器必须运行 Java 解释器, 它完成 Java bytecode的解释执行. Java 解释器是用POSIX的ANSI C编写的, 需要送到每个单独的平台下面进行一次常规的编译.
一旦解释器就绪, 应用程序开发者不必关心任何平台说明和区别不同的本地编译器.
Java 特性 -- 可移动
Java 语言提供了一个统一的抽象 (虚拟) 机器模型, 对所有的平台是一致的.
SUN 拥有 Java 虚拟机 -- 它是通用的, 而任何用户可以增加它的类
不同于在 C/C++ 中需要手工为不同的整数匹配到物理机器的结构上, Java byte, char short, int 和 long 的大小始终是一样的, 分别等于 8, 16, 16(unicode), 32 和 64 位.
没有头文件, 预处理程序,#define 等.
浮点数总是IEEE 754
特定窗口环境的区别的说明 (X Windows, MS Windows, Macintosh) 根据抽象窗口工具 Abstract Windowing Toolkit (AWT) 消除掉了.
AWT 是由 ~60 Java 类(alpha)写成的, 它提供了一个通用的 GUI 编程模型, 可以在 UNIX, PC 和 Mac 上移动, 由Java解释器自动翻译成本地平台的窗口系统.
Java 特性 -- 部分解释
Java 代表了完全编译 (如 C/C++) 和完全解释 (如 Smalltalk 或者 Perl) 之间的一种折衷方案.
Java "编译器" 生成一种二进制 bytecode 输出, 它是可移动的, 比特定机器实际所需的二进制代码要小得多 .
Java "解释器" 执行这个 bytecode , 因此动态性比象Perl这样的解释器小 (后者内部实现一个等价的 bytecode 构造, 当阅读程序源码时 on-the-fly).
通常地, 编辑过程是: a) 时间消费和 b) 平台说明. 因此, 解释器用于促进 a) 快速原型化和/或 b) 可移动性. Java 模型主要考虑平台独立性但是效率也是适当的因为Java 编译器比较快, 生成简洁的 bytecode 输出.
Java 特性 -- 分布式
流行的 TCP/IP 为基础的协议如 FTP 或 HTTP 是根据网络协议类来支持的. 这方便了各种形式的分布式处理. 新的协议 (如 PVM ) 可以增加和动态安装.
Java 的分布式计算模型主要是客户-服务器, Java 编译器在服务器一方预备 opcodes, Java 解释器在客户一方执行它.
用户可以期待用服务器和客户的Java线索互相通讯实现更多的动态使用.
Java 特性 -- 鲁棒性
Java 增强了编译时的类型检查, 消除了 C/C++ 在这方面的一些错误.
指针算法被完全放弃, 这样是为了运行时检查数组下标和增强了Java模型的安全性.
始终要求显式说明, 即 C 类型的隐式说明被放弃. 这样使得Java 编译器可以完成早期的错误检查.
Java中快速原型化(prototyping )不如 javascript,Lisp, Tcl, Smalltalk 或 Perl, 但是Java的软件质量保证比这些更加动态和 ´宽大的´ 语言要好.
Java 特性 -- (希望的) 安全性
Java 二进制代码在网络中传送, 在客户机器上执行. 因此安全性是一个至关重要的问题, 在Java中得到着力加强.
Java 有它自己的已安全方式设计的网络类
C++ 模型的修改如去掉指针算法和强制类型转换主要是基于安全要求的考虑.
多数病毒是基于对私用的/保护的计算机存储器的访问实现的, 这在Java中是不可能的.
Java opcode 是由Java解释器在客户一端独占的虚拟存储器中执行的. 因此除非Java解释器自己存在安全漏洞, 否则模块是安全的, 用户无法通过不正确地或者恶意地编写applet产生安全漏洞.
穿过网络发送的 bytecode在客户端被检验, 阻止恶意/错误的类引发问题
Java 特性 -- 高性能
Java 解释器完成Java bytecode的on-the-fly runtime 执行, 获得了满足的性能.
NOT true in initial software which is often 100 times slower than C but this is eXPected to improve as true compilers are prodUCed and general software improves!
支持生成从bytecode中生成与本地机器相关的代码, 作为中级编译器形式来看, 这一点满足了对性能要求较高的应用程序.
从Jave bytecode中生成的机器代码的性能与同样平台下的典型的 C/C++ 编译器提供的性能相当.
这里的一些概念实际上和 OSF/ANDF 相似. 使用 ANDF 术语的话, 我们可以称 Java 编译器为 ´生产者producer´, 这里讨论的机器代码生成器是一个 ´安装者installer´. 缺省情况下 Java 的工作模式不使用 installer 而是直接解释中级代码形式 (这种方式在 ANDF 中是用 GAI -- Generalized ANDF Interpreter支持的).
ANDF 模型在原理上可以应用到所有的语言上. Java/HotJava 系统为Java语言实现了 ANDF 概念.
Java 特性 -- 多线索
Java 模型提供优先权多线索, 在Thread类上面执行. 线索方法基于C.A.R. Hoare的监视者和条件变量变化表提供一套时间同步原语. Java 线索从Xerox Park的先驱性的Cedar/Mesa系统(它创造了Macintosh和面向对象程序设计)中继续了一些特性.
Java 多线索在applet 编程中的一个典型应用是有几个独立但又相互关联的情况的模拟 (例如各种排序算法的), 它们同时在一个applet窗口中运行. 多线索还内部用于 HotJava 浏览器, 处理多个动态文档.
另一个有趣的应用领域是多-HotJava 环境的情况, 例如合作实验室或游戏
Java 线索内置的点对点通讯原语. 各种线索的通讯环境可以通过线索和网络协议对象的联合来提供.
Java 特性 -- It 动态性
Java 模型比C++的动态性要好, 接近于Smalltalk 或 Perl.
在父类实现被更新后, 子类不需要重新编译.
类有runtime 陈述(按照Class类实现), 它答应用户在运行时察看一个给定对象实例的类型 (在 C 中假如指针是指向整数或浏览器则无法知道)
C++ 有 "脆弱父类" 问题, 假如改变了父类或引用的类中的任意内容(方法/实例变量), 必须重新编译子类. Java 在运行时解决类的引用, 解决了这个问题.