Java 简史
Java 简史
Java 是由 James Gosling、Patrick Naughton、Chris Warth、Ed Frank 和 Mike Sheridan 于 1991 年在 Sun Microsystems 公司构思的。花了 18 个月的时间才开发出第一个工作版本。这种语言最初被称为 “Oak”,但在 1995 年被改名为 “Java”。从 1992 年秋天 Oak 的最初实现到 1995 年春天 Java 的公开宣布,在这段时间里,又有许多人对该语言的设计和进化做出了贡献。Bill Joy、Arthur van Hoff、Jonathan Payne、Frank Yellin 和 Tim Lindholm 是原始原型成熟的关键贡献者。
令人有些惊讶的是,Java 最初的推动力并不是互联网!相反,主要的推动力是互联网的发展。相反,主要的动机是需要一种独立于平台(也就是架构中立)的语言,可以用来创建嵌入到各种消费电子设备中的软件,如微波炉和遥控器。正如你可能猜到的,许多不同类型的 CPU 被用作控制器。C 和 C++(以及大多数其他语言)的麻烦在于,它们被设计成针对特定目标进行编译。尽管可以为几乎任何类型的 CPU 编译 C++程序,但要做到这一点,需要一个针对该 CPU 的完整的 C++编译器。问题是编译器的制作成本很高,也很耗时。我们需要一个更简单、更经济的解决方案。为了找到这样的解决方案,Gosling 和其他人开始研究一种可移植的、独立于平台的语言,这种语言可以用来生成在不同环境下能在各种 CPU 上运行的代码。这一努力最终促成了 Java 的诞生。
大约在 Java 的细节被研究出来的时候,第二个,也是最终更重要的因素正在出现,它将对 Java 的未来起到至关重要的作用。这第二股力量当然是万维网。如果万维网没有在 Java 被实现的同时形成,Java 可能仍然是一种有用的、但不为人知的消费类电子产品编程语言。然而,随着万维网的出现,Java 被推到了计算机语言设计的前沿,因为 Web 也需要可移植的程序。
大多数程序员在其职业生涯的早期就了解到,可移植程序是难以捉摸的,因为它们是理想的。虽然寻求一种创建高效、可移植(独立于平台)程序的方法几乎和编程学科本身一样古老,但它已经被其他更紧迫的问题所取代。此外,由于(当时)计算机世界的大部分人已经分成了英特尔、Macintosh 和 UNIX 这三个相互竞争的阵营,大多数程序员都呆在自己的防线内,对可移植代码的迫切需求也就减少了。然而,随着互联网和 Web 的出现,可移植性的老问题又回来了。毕竟,互联网由一个多样化、分布式的宇宙组成,里面有各种类型的计算机、操作系统和 CPU。尽管互联网上有很多种类的平台,但用户还是希望它们都能运行同样的程序。曾经是一个令人恼火但优先级较低的问题,现在却成了备受瞩目的必需品。到了 1993 年,Java 设计团队的成员们明显地发现,在为嵌入式控制器创建代码时经常遇到的可移植性问题,在试图为 Internet 创建代码时也会发现。事实上,Java 最初在小范围内设计
解决的问题,也可以大规模地应用到 Internet 上。这一认识使得 Java 的关注点从消费电子转向了互联网编程。因此,虽然对架构中立的编程语言的渴望提供了最初的火花,但互联网最终导致了 Java 的大规模成功。如前所述,Java 的大部分特征来自于 C 和 C++。这是有意为之的。Java 的设计者们知道,使用 C 的熟悉的语法和呼应 C++的面向对象的特性,会使他们的语言对经验丰富的 C/C++程序员大军产生吸引力。除了表面上的相似性,Java 还具有一些其他有助于 C 和 C++成功的属性。首先,Java 是由真正的工作程序员设计、测试和完善的。它是一种基于设计它的人的需求和经验的语言。因此,Java 是一种程序员的语言。第二,Java 具有凝聚力和逻辑上的一致性。第三,除了互联网环境所施加的那些限制外,Java 给了你这个程序员充分的控制权。如果你编程好,你的程序就会反映出来。如果你的程序编得不好,你的程序也会反映出来。换句话说,Java 不是一种带有训练轮的语言。它是一门专业程序员的语言。
由于 Java 和 C++ 之间的相似性,人们很容易将 Java 简单地视为 “互联网版的 C++"。然而,这样做将是一个很大的错误。Java 在实践和哲学上都有很大的差异。虽然 Java 确实受到了 C++的影响,但它并不是 C++的增强版。例如,Java 既不能向上兼容 C++,也不能向下兼容 C++。当然,与 C++ 的相似之处是很大的,如果你是一个 C++ 程序员,那么你会觉得 Java 很适合你。还有一点。Java 不是为了取代 C++ 而设计的 Java 是为了解决某一组问题而设计的。C++ 是为了解决一组不同的问题而设计的。两者将在未来的许多年里共存。
计算机语言的进化有两个原因:适应环境的变化和实现编程艺术的进步。促使 Java 诞生的环境变化是对注定要在 Internet 上发布的平台独立程序的需求。然而,Java 也体现了人们编写程序方式的变化。例如,Java 加强和完善了 C++所使用的面向对象的范式,增加了对多线程的集成支持,并提供了一个简化 Internet 访问的库。不过,归根结底,并不是 Java 的个别功能使它如此引人注目。相反,它是一门完整的,包含了丰富生态圈的语言。Java 是对当时新兴的高度分布式计算领域需求的完美回应。Java 之于互联网编程,就像 C 语言之于系统编程一样:一种改变世界的革命性力量。
JAVA 是如何影响互联网的
互联网帮助将 Java 推向了编程的前沿,而 Java 又对互联网产生了深远的影响。除了在总体上简化了网络编程外,Java 还创新了一种称为小程序的新型网络程序,改变了网络世界对内容的思考方式。Java 还解决了与互联网相关的一些最棘手的问题:可移植性和安全性。让我们更仔细地看看这些问题。
Java 小程序
在 Java 诞生之时,它最令人兴奋的功能之一就是小程序。小程序是一种特殊的 Java 程序,它被设计成可以在互联网上传输,并在兼容 Java 的网络浏览器内自动执行。如果用户点击一个包含小程序的链接,小程序就会下载并在浏览器中运行。小程序旨在成为小型程序。它们通常用于显示服务器提供的数据,处理用户输入,或提供简单的功能,如贷款计算器,在本地执行,而不是在服务器上。从本质上讲,小程序允许将一些功能从服务器转移到客户端。
小程序的诞生非常重要,因为在当时,它扩大了可以在网络空间自由移动的对象的范围。一般来说,在服务器和客户端之间传输的对象有两大类:被动的信息和动态的主动程序。例如,当你阅读电子邮件时,你查看的是被动的数据。即使你下载一个程序,在你执行之前,程序的代码仍然只是被动的数据。相比之下,小程序是一个动态的、自执行的程序。这样的程序是客户端计算机上的一个主动代理,然而它是由服务器发起的。
在 Java 的早期,小程序是 Java 编程的一个重要部分。它们说明了 Java 的力量和好处,为网页增加了一个令人兴奋的维度,并使程序员能够探索 Java 的全部可能。虽然今天很可能还有小程序在使用,但随着时间的推移,小程序变得不那么重要了。出于将要解释的原因,从 JDK 9 开始,小程序开始被逐步淘汰,JDK 11 取消了对小程序的支持。
安全性
尽管动态的、网络化的程序是可取的,但它们在安全和可移植性方面也会带来严重的问题。显然,必须防止下载并在客户端计算机上执行的程序造成伤害。它还必须能够在各种不同的环境和不同的操作系统下运行。正如你将看到的,Java 以一种有效而优雅的方式解决了这些问题。让我们更仔细地看看每一个问题,首先是安全问题。
你可能知道,每次下载一个"正常"的程序,你都要承担一定的风险,因为你下载的代码可能含有病毒、木马或其他有害代码。问题的核心是,恶意代码之所以会造成其破坏,是因为它获得了对系统资源的未经授权的访问。例如,病毒程序可能会通过搜索计算机本地文件系统的内容,收集私人信息,如信用卡号码、银行账户余额和密码。为了使 Java 能够在客户端计算机上安全地下载和执行程序,有必要防止它们发动这种攻击。
Java 通过使您能够将应用程序限制在 Java 执行环境中,并防止其访问计算机的其他部分来实现这种保护。(你将很快看到这一点是如何实现的。)能够在一定程度上放心地下载程序,确保不会造成伤害,这可能是 Java 最具创新性的一个方面。
可移植性
可移植性是互联网的一个重要方面,因为有许多不同类型的计算机和操作系统与之相连。如果一个 Java 程序要在几乎所有连接到互联网的计算机上运行,就需要有某种方法使该程序能在不同的系统上执行。换句话说,需要有一种机制,使同一个应用程序能够被各种各样的 CPU、操作系统和浏览器下载和执行。为不同的计算机提供不同版本的应用程序是不现实的。同样的应用程序代码必须在所有计算机上工作。因此,需要一些生成可移植的可执行代码的方法。正如你很快会看到的那样,有助于确保安全的同一机制也有助于创造可移植性。
字节码
Java 之所以能够解决刚才所说的安全性和可移植性问题,关键在于 Java 编译器的输出不是可执行代码。相反,它是字节码。字节码是一组高度优化的指令,被设计成由所谓的 Java 虚拟机(JVM)执行,它是 Java 运行时环境(JRE)的一部分。从本质上讲,最初的 JVM 被设计为字节码的解释器。这可能会让人有些惊讶,因为许多现代语言都是出于性能考虑而被设计成可执行代码的。然而,Java 程序由 JVM 执行的事实有助于解决与基于 Web 的程序相关的主要问题。这就是原因。
将 Java 程序翻译成字节码,使得在各种环境中运行程序变得更加容易,因为只需要为每个平台实现 JVM。一旦给定系统存在 JRE,任何 Java 程序都可以在其上运行。请记住,虽然 JVM 的细节会因平台不同而不同,但所有平台都能理解相同的 Java 字节码。如果一个 Java 程序被编译成本地代码,那么同一程序的不同版本将不得不存在于连接到互联网的每一种 CPU 中。当然,这不是一个可行的解决方案。因此,由 JVM 执行字节码是创建真正可移植程序的最简单方法。
Java 程序由 JVM 执行的事实也有助于使其安全。因为 JVM 处于控制之下,它管理着程序的执行。因此,JVM 有可能创建一个包含程序的受限执行环境,称为沙箱,防止不受限制地访问机器。Java 语言中存在的某些限制也增强了安全性。一般来说,当一个程序被编译成中间形式,然后由虚拟机解释时,它的运行速度会比编译成可执行代码时的运行速度慢。但是,对于 Java 来说,两者之间的差别并不是那么大。因为字节码已经被高度优化,使用字节码使得 JVM 执行程序的速度比你想象的要快得多。
虽然 Java 是作为一种解释语言设计的,但为了提高性能,Java 并没有什么可以阻止字节码的即时编译成本地代码。出于这个原因,HotSpot 技术在 Java 最初发布后不久就被引入。HotSpot 为字节码提供了一个即时编译器(JIT)。当 JIT 编译器是 JVM 的一部分时,字节码中选定的部分会被实时地、逐个地、按需地编译成可执行代码。重要的是要明白,整个 Java 程序并不是一次性编译成可执行代码的。相反,JIT 编译器在执行过程中,根据需要编译代码。此外,并不是所有的字节码序列都被编译–只有那些将从编译中受益的序列,剩余的代码被简单地解释。然而,及时编译的方法仍然会产生显著的性能提升。即使动态编译应用于字节码,可移植性和安全特性仍然适用,因为 JVM 仍然负责执行环境。