文档介绍:为什么出现JAVA
JAVA诞生之前,当时的语言存在着众多问题。C++的“大量消耗资源”一直为人们所熟知。C++开发人员需要自行管理内存。使用C++编写(比如在Visual Studio中)普通的“Hello World”程序并运行需要好几MB的内存。虽然C++生成了高度优化后的代码,然而运行代码的需求通常非常高。这是当时市场上的其他开发环境和运行时系统,如Borland C++和Turbo Pascal也存在的问题。因此,大家迫切需要一门能够生成短代码且在运行时环境中不会占用目标设备过多内存空间的语言。为嵌入式设备编程同样需要可移植性,因为这些设备一般使用各种不同的CPU及体系架构。C++应用程序在每一种体系架构中的行为并不一致,因此通常需要为新设备重写代码。管理多种构建环境和代码库的复杂性成为支持多设备开发的最大挑战。Java就是为了解决这些问题应运而生的一门高级语言。Java通过引入虚拟机(VM)与可移植的字节码架构解决了多设备开发的问题。Sun Microsystems就这样打着“编写一次,到处运行”的标语适宜地挺进了市场。
JAVA虚拟机结构图
Java不仅是一门编程语言
Java既是平台,
也是开发和运行时环境
JAVA虚拟机
Java编译器将Java源程序翻译成所谓的字节码(bytecode),这有点类似于C++或其他语言编译器生成的OBJ代码。唯一的不同之处在于:大部分编译器会为实际的CPU生成对象代码,而Java编译器生成的字节码则由“伪CPU”指令构成,而Java字节码指令集针对的CPU在现实中并不存在。Sun Microsystems所做的工作是在内存中创建虚拟的CPU,并为这个虚拟的CPU设计一套指令集,之后运行时在内存中进行仿真。
Java虚拟机(Java Virtual Machine,JVM)正是仿真了前面提到的虚拟CPU,为Java可执行文件(字节码)提供了运行时环境。,JVM本质上是能够运行Java可执行文件的机器。
JAVA特性
体积小
Java生成的可执行代码非常小;一般来说,“Hello World”应用程序的大小只有几个字节。如果同C++编译器生成的类似代码相比,后者的大小会轻松达到KB级别,此外后者在运行时还需要大量内存。运行Java编译后代码的运行时环境一般所需的内存空间少于1MB。如果再同运行C++应用程序相比,后者不仅需要MFC(Microsoft Foundation Classes,微软基础类库)或OWL(Borland’s Object Windowing Library,Borland对象窗口库)中嵌入的上百MB空间的代码,还需要成熟的操作系统及硬件才能部署。
简单易学
作为一门面向对象语言,Java简单易学。人们常说,如果没有学过像C和Pascal一样的面向过程语言,那么就直接跳过它们去学习面向对象语言。学习过面向过程语言的人通常会觉得迁移到面向对象语言很困难,因为学习时可能需要忘掉一些之前学习过的知识。Java非常简单易学, 我们推荐任何计算机科学课程都挑选Java作为首门编程语言。
JAVA虚拟机
JAVA虚拟机
面向对象
Java的重要特性是面向对象。C++源自C语言,允许声明全局变量,这意味着变量可以声明在任何对象范围之外,更确切地说,是可以声明在任何类定义之外。这违背了封装的准则——封装是面向对象语言的重要特性之一。Java不允许声明全局变量。类似的,Java中并没有像C和C++中的结构与联合,因为这些数据结构会将成员默认标记为公开,这违背了面向对象的准则。Java语言中这些特性的缺失使得Java成为一门更好的面向对象语言。
JAVA虚拟机
兼具编译与解释特性
类似C++这样的语言会将源程序编译成对象代码()。链接器通过将对象代码与目标库结合,将生成的对象代码转换为可执行文件(.exe文件)。当运行可执行文件时,操作系统中的加载器会在内存中加载可执行代码,解析出函数引用的绝对内存地址,继而执行代码。
编译和运行一段Java程序与之前的过程有着很大差别。之前也介绍过,Java编译器会将Java源程序翻译为所谓的字节码(面向虚拟CPU的指令集)。从Java源程序创建可执行文件并不包含链接器的过程。事实上,从Java源程序创建的可执行文件只有字节码。那么这类字节码是如何运行在实际CPU上的呢?当Java可执行文件(字节码)在机器上运行时,解释器会将每一个字节码指令转换为实际的CPU指令。这些指令会在接下来运行于实际CPU之上,因此编译和运行Java程序包含了编译与解释过程。正因为如此,Java被认为既是一门编译型语言,也是一门解释型语言。
JAVA虚拟机
平台无关
引入JVM的一大好处在于平台无关。在前