《Java白皮书1996自译》05:解释执行和动态的

詹姆斯·高斯林

第五章 解释执行和动态的

使用“传统的”软件开发工具的程序员已经接受了当前开发实践中人为的编辑-编译-链接-加载-应用程序脱离悬崖-让它崩溃-从头再来的风格。

此外,当声明在其他地方发生更改时,跟踪必须重新编译的内容会限制开发工具的能力——甚至会限制UNIX系统上使用的“make”风格的工具。随着应用程序的代码库增长到数十万行,这种开发方法陷入了困境。

我们需要更好的快速而大胆的原型化和开发方法。Java语言环境是这些更好的方法之一,因为它是解释的和动态的。

正如前面关于体系结构中立性的章节所讨论的,Java编译器为Java虚拟机1生成字节码,这在第4章\中简要介绍过。虚拟解释机的概念并不新鲜。但是Java语言将这些概念引入了安全、分布式、基于网络的系统领域。

Java语言虚拟机是一个严格定义的虚拟机,您希望在其上运行Java语言应用程序的每个硬件体系结构和操作系统都必须有一个解释器。一旦在给定的硬件和操作系统平台上提供了Java语言解释器和运行时支持,就可以在任何地方运行任何Java语言应用程序,始终假设特定的Java语言应用程序是以可移植的方式编写的。

编译后单独的“链接”阶段的概念在Java环境中很少见。链接实际上是类装入器装入新类的过程,它是一个增量的、轻量级的过程。开发周期中随之而来的加速意味着您的开发过程可以更加快速和探索性,并且由于Java语言和运行时系统的健壮性,您将在周期的更早阶段捕获bug。

5.1、动态装载和绑定

Java语言的可移植性和可解释性产生了一个高度动态和动态扩展的系统。Java语言是为了适应不断发展的环境而设计的。课程按需要链接进来,可以从网络上下载。传入代码在传递给解释器执行之前进行验证。

通过帮助封装数据和相应的过程,并鼓励代码的重用,面向对象编程已经被接受为至少解决部分“软件危机”的一种方法。现在大多数进行面向对象开发的程序员都采用c++作为他们的首选语言。但是c++遇到了一个严重的问题,这个问题阻碍了它在“软件集成电路”的生产和分发中的广泛使用。这个缺陷被称为脆弱的超类问题。

5.1.1、脆弱的超类问题

这个问题是c++实现方式的一个副作用。每当您向类添加新方法或新实例变量时,引用该类的任何和所有类都需要重新编译,否则它们将中断。跟踪类定义及其客户端之间的依赖关系已被证明是c++中编程错误的一个富有成效的来源,即使有类似make的实用程序的帮助也是如此。脆弱的超类问题有时也被称为“常量重新编译问题”。您可以在c++中避免这些问题,但这非常困难,而有效地避免这些问题意味着不直接使用该语言的任何面向对象特性。通过避免c++的面向对象特性,开发人员挫败了可重用“软件集成电路”的目标。

5.1.2、解决脆弱的超类问题

Java语言分几个阶段解决了脆弱的超类问题。Java编译器不会将引用编译成数值,而是将符号引用信息传递给字节码验证器和解释器。当类被链接时,Java解释器执行一次最终名称解析。解析完名称后,引用将被重写为数值偏移量,从而使Java解释器能够全速运行。

最后,对象的存储布局不是由编译器决定的。内存中对象的布局延迟到运行时,由解释器决定。在不影响现有代码的情况下,可以链接具有新实例变量或方法的已更新类。

在第一次遇到任何名称时,以很小的代价进行名称查找,Java语言消除了脆弱的超类问题。Java程序员可以以一种更直接的方式使用面向对象的编程技术,而不必承受c++带来的不断的重新编译负担。库可以自由地添加新的方法和实例变量,而不会对它们的客户机产生任何影响。作为一个程序员,你的生活更简单。

5.1.3、运行时表示

Java语言中的类有一个运行时表示。有一个名为class的类,它的实例包含运行时类定义。如果给你一个对象,你可以找出它属于什么类。在C或c++程序中,可能会给您一个指向对象的指针,但是如果您不知道它是什么类型的对象,您就无法找到它。在Java语言中,根据运行时类型信息查找是很简单的。

也可以通过给定一个包含类名的字符串来查找类的定义。这意味着您可以计算一个数据类型名称,并轻松地将其动态链接到正在运行的系统中。

5.2、总结

Java的解释和动态特性提供了以下几个好处:

解释环境支持快速原型化,无需等待传统的编译和链接周期,环境是动态可扩展的,因此类可以根据需要动态加载,c++开发人员所面临的脆弱超类问题也可以通过将内存布局决策延迟到运行时解决。


好好学习,天天向上!继续下一章…


发布了36 篇原创文章 · 获赞 30 · 访问量 5922

猜你喜欢

转载自blog.csdn.net/goldentec/article/details/104778894