1、Java 发展史
Java 语言的诞生并不是精心策划、制作,最后产生出来的,因为当时的开发者并没有想创造出世界上
如此伟大的编程语言之一。
时间让我们回到 1990 年年末,当时并不是互联网发展的浪潮(全世界都是如此),各大公司争相推崇的是电器领域,那时候的生活我想还是基本的生活设施较为重要(如电视机,微波炉,电话)。
在各大公司中,Sun 就不得不说了(创造 Java 的公司),Sun 公司预料嵌入式系统将在未来智能电器领域大显身手,于是公司成立了一个由 James Gosling 领导的 “Green 计划”,为智能家电编写一个通用控制系统。
由于智能家电等设备的处理能力和内存都很有限,所以编程语言必须非常小且能够生产非常紧凑的代码。另外,由于不同的厂商选择不同中央处理器(CPU),因此这种语言的关键不是任何特定体系结构捆绑在一起,也正是有这些局限性的要求进而促使开发团队要设计一个高效可移植性的语言 Gosling 把它称为 “Oak”。
到了 1992 年夏天,Green 计划已经完成了新平台的部分功能,包括 GReen操作系统、Oak 的程序设计语言、类库等。同年 11 月,Green 计划被转化成 “FirstPerson 有限公司” ,一个 Sun 公司的全资子公司。
1992 年的时候 Green 项目发布了它的第一个产品,称之为 “*7” 。这个产品是具有非常智能的远程控制,但很遗憾,Sun 公司对这个产品并不感兴趣。后来直到 1994 年上半年也没有一个买家对其产生的产品有兴趣这也导致了 “FirstPerson 公司” 公司解散的命运。
而就在 1994 年的夏天在 Sun 公司以外,Internet 的万维网正在逐渐发展壮大。
Gosling 在第一时间,意识到这是一个机会,于是对 Oak 进行了小规模的改造,到了 1994 年秋,小组中的 Patrick Naughton 和 Jonathan Payne 完成了第一个 Java语言的网页浏览器:WebRunner。Sun公司高层在观看了浏览器的演示之后,对其给予了高度的评价,而当时 Oak 这个商标已经被人注册了,所以只能将 Oak 更名为 Java。
有了产品那自然是要让跟多的人知道它的强大,所以 Sun 公司在 1995 年年初发布了 Java语言,并直接把 Java 放到了互联网上,免费给大家使用。更疯狂的是连源码也不保密,一起放到了互联网上向所有人公开。
几个月后,让所有人都大吃一惊的事情发生了:Java 称为了互联网上最热门的宝贝。其 Java 语言的下载量竟然高达 10 万多次(想想那时候就有 10 万+)。然后,互联网上立即就有了数不清的 Java 小程序,掩饰着各种小动画、小游戏等。
此时,Java 语言终于是扬眉吐气,成为了一种广为人知的编程语言。
1995 年,Sun 虽然推出了 Java,但这只是一种语言,如果想要开发更为复杂的程序,那必须有一个强大的开发类库。因此,Sun 公司在 1996 年年初发布了 JDK 1.0 。这个版本包括两个部分:
- 运行环境(JRE)
- 开发环境(JDK)
运行环境包括核心 API 、集成 API、用户界面 API、发布计划、Java虚拟机(JVM)五个部分;
开发环境包括编译 Java 程序的编译器(既 javac 命令)。
1997 年 2 月 18 日 Sun 发布了 JDK1.1 。JDK1.1 增加了 JIT(即时编译)编译器,通过该功能让 JDK 在效率上有较大提升。
但是一直以来,Java 都没有准确的找到自己的一个准确定位,也没有找到它必须存在的理由,因为在 1996 年 Flash 面世了,这是一种更加简单的动画设计软件:使用 Flash 几乎无需任何编程知识,就可以做出丰富多彩的动画。随后 Flash 增加了 ActionScipt 编程脚本,Flash 逐渐蚕食了 Java在网页上的应用。
直到 1998 年 12 月,Sun 发布了 Java 历史上最重要的 JDK 版本:JDK1.2,伴随JDK1.2 同时发布的还有 JSP/Servlet、EJB 等规范,并将 Java 分成了 J2EE、J2SE 和 J2ME 三个版本。
- J2ME:主要用于控制移动设备和信息家电等有限存储的设备。
- J2SE:整个 Java 技术的核心和基础,它是 J2ME 和 J2EE 编程的基础。
- J2EE:Java技术中应用最广泛的部分,J2EE 提供了企业应用开发的完整解决方案。
三个版本推出后,标志着 Java 已经吹响了向企业、桌面和移动 3 个领域进军的号角,Java 已经进入了 Java2 时代,这个时期也是 Java 飞速发展的时期。
2002 年 2 月,Sun 发布了 JDK 历史上最为成熟的版本:JDK1.4。此时由于 Compaq、Fujitsu、SAS、Symbian、IBM 等公司的参与,使 JDK1.4 称为发展版本最快的一个 JDK 版本。到 JDK1.4 为止,我们已经可以使用 Java 实现大多数的应用了。
与此同时,Java 语言在企业应用领域的发放异彩,涌现了大量基于 Java 语言开发的框架:Struts、WebWork、Hibernate、Spring 等;大量的企业应用服务器也开始涌现:WebLogic、WebSphere、JBoss等,这些都标志着 Java 语言的飞速发展时期。
2004 年 9 月, Sun 发布了万众期待的 JDK1.5,同时,Sun 将 JDK1.5 改名为 JavaSE5.0,J2EE、J2ME也相应改名为 JavaEE 和 JavaME 。
2006 年 12 月,Sun 公司发布了 JDK 1.6(也被称为 JavaSE 6)。往后 Sun 公司一直维持着大约 2 年发布一个新版本的习惯。
但在 2009 年 4 月 20 日,Oracle 宣布将以每股 9.5 美元的价格收购 Sun,该交易的总价值约为 74 亿美元。而 Oracle 通过收购 Sun 获得了两项软件资产:Java 和 Solaris(称比 Linux 更稳定的操作系统)。
于是曾经代表了一个时代的公司:Sun 终于是落幕了,“江湖” 再也不显 Sun 身影。
虽然 Sun 不在了,不过 Java 的大旗依然“猎猎”作响。2007 年 11 月,Google 宣布推出一款基于 Linux 平台的开源手机操作系统:Android。Android 的出现顺应了即将出现的移动互联网潮流,而且 Android 系统的用户体验非常好,因此讯处称为了手机操作系统的中间力量。Android 使用 Java 语言来开发应用程序,这也给了 Java 语言一个全新的机会。过去的岁月中,Java 语言作为服务端编程语言,已经取得了极大的成功;而 Android 平台的流行,则让 Java 语言获得了在客户端程序上大展拳脚的机会。
2011 年 7 月 28 日,Oracle 公司终于“如约”发布了 JavaSE 7 —这次版本升级经过了将近 5 年时间。Java SE 7 也是 Oracle 发布的第一个 Java 版本,虽然并未完全满足所有人的期望,不过它的发布,意味着 Java 能继续在它的赛道上继续驰骋。
Java 版本发布时间表:
注:LTS 表示的是长期稳定支持版本。
2、Java 程序运行机制
Java 语言是一种特殊的高级语言,它既具有解释型语言的特征,也具有编译型语言的特征,因为 Java 程序要经过先编译,后解释两个步骤。
2.1 高级语言的运行机制
计算机的语言按照程序的执行方式可以分为编译型和解释型两种。
编译型语言是指通过专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成可以被该平台执行的机器码,并包装成能被该平台识别执行程序的格式,这个转换过程称为编译。编译生成的可执行程序可以脱离开发环境,在特定的平台上独立运行。
编译型语言的运行效率较高,但它是被编译成特定平台的机器码,所以通常无法移植到其他平台上运行。现有的 C、C++、FORTRAN、Psscal 等高级语言都属于编译型语言。
解释型语言是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于把编译型语言中的编译和解释过程混合到了一起同时完成。
可以认为:没错执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言有一个优势:跨平台比较容易,只需要提供特定平台的解释器即可,每个特定平台上的解释器负责将源程序解释称特定平台的机器指令即可。
解释型语言可以方便的实现源程序级的移植,但这些是以牺牲程序执行效率为代价。现有的 Ruby、Python 等语言都属于解释型语言。
2.2 Java程序的运行机制和 JVM
Java 语言比较特殊,由 Java 语言编写的程序需哟经过编译步骤,但这个编译步骤并不会生成特定平台的机器码,而是一种与平台无关的字节码(也就是 *.class 文件)。并且,这种字节码不是可执行的,必须使用 Java 解释器来解释执行。因此,我们可以认为:Java 语言即时编译型语言,也是解释型语言。或者说,Java 语言既不是存粹的编译型语言,也不是存粹的解释型语言。Java 程序的执行必须经过先编译,后解释两个步骤,如图。
Java 语言负责解释执行字节码文件的是 Java 虚拟机,既 JVM(Java Virtual Machine)。
JVM 是可以运行 Java 字节码文件的虚拟计算机,所有平台上的 JVM 向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。
当使用功能 Java 编译器编译 Java 程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体平台,只面向 JVM 。不同平台上的 JVM 都是不同的,但它们都提供了相同的接口。JVM 是 Java 程序跨平台的关键部分,只要为不同平台时间了相应的虚拟机,编译后的 Java 字节码就可以在该平台上运行。
显然,相同的字节码程序需要在不同的平台上运行,这几乎是“不可能的”,只有通过中间转换器才可以实现,JVM 就是这个转换器。
JVM 是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域。它负责执行指令,还要管理数据、内存和寄存器。
3、Java 语言的特性
从 Java 语言的设计者编写的“白皮书”中可以简要概括 Java 语言的 11 大特性,如下:
- 简单性
- 面向对象
- 分布式
- 健壮性
- 安全性
- 体系结构中立
- 可移植性
- 解释型
- 高性能
- 多线程
- 动态性
3.1 简单性
在设计 Java 的时候,尽管人们发现 C++ 不太适用,但还是尽可能的接近它,以便系统更易于理解。Java 剔除了 C++ 中许多很少使用、难以理解、易混淆的特性。所以 Java 语法也可以说是一个纯净版 C++ 语法。
Java 语法没有文件头、指针运算(指针语法)、结构、联合、操作符重载、虚基类等。
3.2 面向对象
简单地讲,面向对象设计是一种程序设计技术。它将重点放在数据(既对象)和对象的接口上。
用木匠打个比方,一个“面向对象的”木匠始终关注的是所制作的椅子,第二位才是所使用的工具;一个“非面向对象的”木匠首先考虑的是所用的工具。
Java 语言在设计时面向对象技术已经相当成熟。Java 的面向对象特性与 C++ 旗鼓相当,Java 与 C++ 的主要不同点在于多重继承,在 Java 中,取而代之的是更简单的接口概念。
3.3 分布式
Java 有一个丰富的例程库,用于处理像 HTTP 和 FTP 之类的 TCP/IP协议。Java 应用程序能够通过 URL 打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。
3.4 健壮性
Java 的设计目标之一在于使得 Java 编写的程序具有多方面可靠性。
Java 投入了大量的精力进行早期的问题检测、后期动态的(运行时)检测,并消除了容易出错的情况等。
Java 和 C++ 最大的不同在于 Java 采用的指针模型可以消除重写内存和损坏数据的可能。
3.5 安全性
Java 适用于网络 / 分布式环境,为了达到这个目的,在安全方面也是投入了很大精力。
使用 Java 可以构建防病毒、防篡改的系统。
Java 的设计能够防范攻击包括:
- 运行时堆栈溢出。如蠕虫和病毒常用的攻击手段。
- 破坏自己的进程空间之外的内存
- 未经授权读写文件
3.6 体系结构中立
编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码, 只要有 Java 运行时系统, 这些编译后的代码可以在许多处理器上运行。
Java 编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。 精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且还可以动态地翻译成本地机器代码。
3.7 可移植性
与 C 和 C++ 不同,Java 规范中没有“ 依赖具体实现” 的地方。基本教据类型的大小以及有关运算都做了明确的说明。
例如,Java 中的 int 永远是 32 位的整数,而在 C/C++ 中,int可能是 16 位整数、32 位整数,也可能是编译器提供商指定的大小。
在 Java 中,数据类型具有固定大小,这消除了代码移植时令人头痛的主要问题。二进制数据以固定的格式进行存储和传输,消除了字节顺序的困扰。字符串是用标准的 Unicode 格式存储。
3.8 解释型
Java 解释器可以在任何移植了解释器的机器上执行 Java 字节码。
3.9 高性能
尽管对解释后的字节码性能已经比较满意,但在有些场合下还是需要更加高效的性能。字节码可以(在运行时刻)动态地翻译成对应运行这个应用的特定 CPU 的机器码。
3.10 多线程
多线程可以带来更好的交互响应和实时行为。
Java 在当时很超前。它是第一个支持并发程序设计的主流语言。那时,多核处理器是非常神秘的,而 Web 编程才刚刚起步,处理器要花很长时间等待服务器响应,需要并发程序设计来确保用户界面不会“冻住”。
而并发程序设计并非易事,不过 Java 在这方面表现出色,可以很好的管理这个工作。
3.11 动态性
从各种角度看,Java 与 C 或 C++ 相比更加具有动态性。它能够适应不断发展的环境。库中可以自由的添加新方法和实例变量,而对客户端却没有任何影响。在 Java 中找出运行时类型信息十分简单。
好了,今天的内容到这里就结束了,关注我,我们下期见