跳至主要內容

Java History

LiuSongLing大约 17 分钟javajava

如果你是一个历史迷,对Java的前世今生非常感兴趣,这篇文章帮助你了解Java的历史。

软件程序

我们知道,没插电源的电脑是一堆废铁,那插了电源的呢?那是一堆会电人的废铁,要想电脑真正利用起来,就不得不说电脑的灵魂,软件,电脑没了它就好比行尸走肉。

一般来说,电脑软件分为两大类,一类是系统软件,一类是应用程序。

机器程序

电脑其实只认识0和1,而电脑最重要的运算和逻辑判断都是在CPU进行的,CPU是具有微指令集的。想要让 CPU 帮忙工作,就得参考微指令集的内容,撰写出让CPU读的懂的机器码给它执行,这样才能让 CPU 运行。

但麻烦的地方在于:

  • 需要了解机器语言:机器只认识0与1,因此你必须要学习直接写给机器看的语言,这是相当难的一件事情;

  • 需要了解所有硬件的相关功能函数:因为你的程序必须要写给机器看,当然你就得要参考机器本身的功能,然后针对该功能去撰写程序码,比如想要使用蓝牙功能,就得参考蓝牙的硬件信息才行;

  • 程序不具有可携性:每个CPU都有独特的微指令集,同样的,每个硬件都有其功能函数。 因此,你为A电脑写的程序,理论上是没有办法在B电脑上面直接运行的,因为B电脑的CPU可能是不同的型号的CPU;

  • 程序具有专一性:程序必须要针对硬件功能函数来撰写, 如果已经开发了一个浏览器程序,想要再开发文件管理程序时,还是得从头再参考硬件的功能函数来继续撰写。

那如何解决这个问题呢?聪明的计算机科学家们想到了一个办法,那就是设计出一种让人类看的懂得程序语言, 然后创造一种编译器来将这些人类能够写的程序语言转译成为机器能看懂得机器码。这样一来我们编写程序就轻松多了。

目前常见的编译器有C、C++、JAVA、Python、Go等等,这些统称为高级语言。

操作系统

有了高级语言之后,如何控制硬件资源成了一个问题,A程序想要将运行的数据写入内存中,就得要自行分配一个内存区块出来让自己的数据能够填上去, 所以还得要了解到内存的位址是如何定位的,B程序想要将运行的数据写入内存中,同样的事情还得再做一遍,不知不觉,眼泪都留下来了,写个程序怎么就这么难呢。

为了要克服使用硬件方面的资源老是需要重复撰写控制码的问题,所以就有操作系统(Operating System, OS)的出现了,喜大普奔!

操作系统一般具有以下内容:

  • 操作系统核心(Kernel)

    • 操作系统(Operating System, OS)其实也是一组程序, 这组程序的重点在于管理电脑的所有活动以及驱动系统中的所有硬件,硬件的所有动作都必须要通过这个操作系统来达成。

    • 核心程序所放置到内存当中的区块是受保护的,这是因为核心主要管控硬件与提供相关的能力(例如存取硬盘、网络功能、CPU资源取得等), 这些管理的动作是非常的重要的,如果使用者能够直接操作修改到核心的话,万一使用者不小心将核心程序停止或破坏, 将会导致整个系统的崩溃!核心程序在开机后就一直常驻在内存当中。

  • 系统调用(System Call)

    • 硬件都是由核心管理,操作系统通常会提供一整组的开发接口给工程师来开发软件!工程师只要遵守该开发接口那就很容易开发软件了,举例来说,我们学习C程序语言只要参考C程序语言的函数即可,不需要再去考虑其他核心的相关功能,因为核心的系统调用接口会主动的将C程序语言的相关语法转成核心可以了解的任务函数,那核心自然就能够顺利运行该程序了。
  • 程序管理(Process control)

    • 良好的CPU调度机制(就是CPU先运行哪个工作的排列顺序),可以有效的加快整体系统性能。
  • 内存管理(Memory management)

    • 控制整个系统的内存管理,系统所有的程序码与数据都必须要先存放在内存当中。通常核心会提供虚拟内存的功能,当内存不足时可以提供内存交换(swap)的功能。
  • 文件系统管理(Filesystem management)

    • 不同文件格式的支持,如果核心不认识某个文件系统,那么您将无法使用该文件格式的文件。
  • 设备的驱动(Device drivers)

    • 硬件的管理是核心的主要工作之一,所以设备的驱动程序是核心需要做的事情。

总结来说:

  • 操作系统的核心层直接参考硬件规格写成, 所以同一个操作系统程序无法在不同的硬件架构下运行。举例来说,个人电脑版的Windows 11 不能直接在 ARM 架构 (手机与平板) 的电脑下运行

  • 操作系统只是在管理整个硬件资源,包括CPU、内存、输入输出设备及文件系统文件。如果没有其他的应用程序辅助,操作系统只是让电脑主机准备妥当而已,并无法运行其他功能,比如图片剪辑,视频剪辑等。

  • 应用程序的开发都是参考操作系统提供的开发接口, 所以该应用程序只能在该操作系统上面运行而已,不可以在其他操作系统上面运行。

应用程序

应用程序是参考操作系统提供的开发接口所开发出来软件,这些软件可以让使用者操作、利用某些电脑的功能。举例来说,办公室软件(Office)主要是用来让使用者办公用的;影像处理软件主要是让使用者用来处理影音数据的;浏览器软件主要是让使用者用来上网浏览用的等等。

举例说明,Windows11 和 office 365的关系:

  • Windows11 是操作系统,必须先安装到电脑上,不然无法开机运行;

  • office 365是办公应用软件,选择正确的操作系统对应的软件安装程序进行安装后,才能正常使用软件进行使用各种办公功能。

Java

前面铺垫那么多,都是为了让你了解一些计算机的基本常识,下面让我们进入Java的历史博物馆,了解Java的前世今生。

1. Java简史

20 世纪 90 年代,单片式计算机系统诞生。单片式计算机系统不仅廉价(之前的计算机体积非常庞大,并且昂贵),而且功能强大,可以大幅度提升消费性电子产品的智能化程度。

Sun 公司为了抢占市场先机,在 1991 年成立了一个由詹姆斯·高斯林(James Gosling)领导的,名为 “Green” 的项目组,目的是开发一种能够在各种消费性电子产品上运行的程序架构。

当时市面上已经有了 C、C++ 这类的高级语言,所以项目组首先考虑的是采用 C++ 来编写程序,但 C++ 过于复杂和庞大,再加上消费电子产品所采用的嵌入式处理器芯片的种类繁杂,需要让编写的程序能够跨平台运行并不容易,C++ 在跨平台方面做得并不好。

思前想后,项目组最后决定:在 C++ 的基础上创建一种新的编程语言,既能够剔除 C++ 复杂的指针和内存管理,还能够兼容各种设备。这语言最初的名字叫做 Greentalk,文件扩展名为 .gt。这个名字叫的比较随意,就因为项目组叫 Green,没什么特殊的寓意。

`Oak`` 是 “Java” 的第二个名字,这次就有点意义了。Oak(橡树)是力量的象征,被美国、法国、德国等许多欧美国家选为国树。

1992 年,Oak 的雏形有了,但项目组在向硬件生产商进行商演的时候,并没有获得认可,于是 Oak 就被搁置一旁了。

1994 年,项目组发现 Java 更适合进行 网络编程。随后,项目组用 Oak 语言研发了一种能将小程序嵌入到网页中执行的技术—- Applet。Applet 不仅能嵌入网页,还能够随同网页在网络上进行传输。

1995 年,Oak 被重新命名为 Java,因为 Oak 被别的公司注册过了。新的名字最好能够表达出技术的本质:dynamic(动态的)、revolutionary(革命性的)、Silk(像丝绸一样柔软的)、Cool(炫酷的)等等。另外,名字一定要容易拼写,念起来也比较有趣。

1995 年,Sun 公司在 SunWorld 大会上正式发布了 Java 1.0 版本,第一次提出了“Write Once, Run anywhere(一次编写,随处运行)”的口号。《时代》杂志将 Java 评为 1995 年十大最佳产品之一。

1996 年 1 月 23 日,JDK 1.0 发布,Java 语言有了第一个正式版本的运行环境。JDK 1.0 是一个纯解释执行的 Java 虚拟机,代表技术有:Java 虚拟机、AWT(图形化界面)、Applet。

1996 年 4 月,十个主要的操作系统和计算机供应商宣称将在产品中嵌入 Java 技术。

1996 年 5 月底,第一届 JavaOne 大会在旧金山举行(后来 JavaOne 成为全世界数百万 Java 语言开发者的技术盛会)。

1996 年 9 月,已有大约 8.3 万网页应用采用了 Java 来制作。

1997 年 2 月 19 日,JDK 1.1 发布,代表技术有:JAR 文件格式、JDBC、JavaBeans、RMI(远程方法调用)。

1998 年 12 月 4 日,JDK 1.2 发布,这是一个里程碑式的版本。Sun 在这个版本中把 Java 拆分为三个方向:面向桌面开发的 J2SE面向企业开发的 J2EE面向移动开发的 J2ME。代表技术有:EJB、Swing。

2000 年 5 月 8 日,JDK 1.3 发布,对 Java 2D 做了大幅修改。

2002 年 2 月 13 日,JDK 1.4 发布,这是 Java 真正走向成熟的一个版本,IBM、富士通等著名公司都有参与。代表技术有:正则表达式、NIO。

2004 年 9 月 30 日,JDK 5 发布,Sun 把“1.x”的命名方式抛弃了。JDK 5 在 Java 语法的易用性上做出了非常大的改进,比如说:自动装箱、泛型、动态注解、枚举、可变参数、foreach 循环。

2006 年 12 月 11 日,JDK 6 发布,J2SE 变成了 Java SE 6,J2EE 变成了 Java EE 6,J2ME 变成了 Java ME 6。JDK 6 恐怕是 Java 历史上使用寿命最长的一个版本了(JDK 6 的最后一个升级补丁为 Java SE 6 Update 211, 于 2018 年 10 月 18 日发布,此版本寿命长达12年)。主要的原因有:代码复杂性的增加、世界经济危机、Oracle 对 Sun 的收购。

2009 年 2 月 19 日,JDK 7 发布,但功能是阉割的。很多翘首以盼的功能都没有完成,比如说 Lambda 表达式。主要是因为 Sun 公司在商业上陷入了泥沼,已经无力推动 JDK 7 的研发工作。

2009 年 4 月 20 日,Oracle 以 74 亿美元的价格收购了市值曾超过 2000 亿美元的 Sun 公司。对于 Java 语言来说,可以说是好事,也可以说是坏事。好事是 Oracle 有钱,能够注入资金推动 Java 的发展;坏处就是 Oracle 相当于后爸,对 Java 肯定没有 Sun 那么亲,走的是极具商业化的道路。

2011 年 7 月,Oracle 收购 Sun 后的第一个版本——也称为 OracleJDK 发布,没有重大功能和特性。

2014 年 3 月 18 日,JDK 8 LTS 终于来了,带着最强有力的武器——Lambda 表达式而来。从此,江湖流传着这样一个传说: “新版任你发,我用 Java 8”。

2017 年 9 月 21 日,JDK 9 发布,这是JDK的一次重大更新,引入了模块系统、JVM指令集扩展、改进的JIT编译器等新特性。这些特性的引入,提高了Java在模块化编程和性能优化方面的表现。不过也是在这个版本以后,JDK 更新版本的速度犹如坐上了火箭,令开发者应接不暇,半年一个新版本。虽然 Oracle 的目的是好的,但不得不承认,版本更新的节奏实在是有点过于频繁,对此 Oracle 宣布,每六个 JDK 大版本才会被长期支持(Long Term Support,LTS)。“新版任你发,我用 Java 8” 不是没有原因的。

2018 年 3 月,JDK 10 发布,没有重大更新和新特性,增强的try-with-resources语句、增强的switch语句等等小改动。

2018 年 9 月,JDK 11 发布,引入了 HTTP 客户端、Local-Variable Syntax for Lambda Parameters、ZGC 等新功能,具有重要的实用价值。(2018 年 10 月,最后一届 JavaOne2018 在旧金山举行)。

2019 年 3 月,JDK 12 发布,引入新特性如可插拔注释、可扩展标记语言(XML)支持增强,Switch 表达式预览功能、微基准测试套件等等。

2019 年 9 月,JDK 13 发布,引入了文本块预览功能、动态 CDS等特性。

2020 年 3 月,JDK 14 LTS 发布,引入了实例模式匹配预览功能、非易失性内存支持等特性。

2020 年 9 月,JDK 15 发布,引入了密封类预览功能、Edwards-Curve 数字签名算法等特性。

2021 年 3 月,JDK 16 发布,引入了记录类预览功能、向量 API 等特性。

2021 年 9 月,JDK 17 LTS 发布,引入了模式匹配、密封类等正式特性。

2022 年 3 月,JDK 18 发布,引入了简单的 web 服务器、支持在 Java API 文档中加入代码片段、制定 UTF-8 作为 Java API 的默认字符集。

2022 年 9 月,JDK 19 发布,引入了结构化并发的 API 来简化多线程的编程、支持虚拟线程等。

2023 年 3 月,JDK 20 LTS 发布,引入了记录模式、Switch 模式匹配等。

JDK 9,JDK 10,JDK 12、JDK 13、JDK 14、JDK 15、JDK 16、JDK 18、JDK 19 都是过渡产品,就好像是试验品一样,不太受开发者待见。

2. Java特性

目前,Java 在云时代面临着以 Go 语言为主的容器(Docker 等技术)生态圈的挑战,以 Scala 语言为主的大数据生态圈的挑战,这也是为何版本更新频繁的原因,Java发展历时20多年,是编程语言排行榜的常青树,占有率也是屡次遥遥领先,为何它这么流行呢?

主要在这几方面做的好:

  • 简单性:Java 为开发者提供了简单易用的用户体验,与其他面向对象编程语言相比,Java 的设计和生态库具有巨大的优势。Java 剔除了 C++ 中很少使用、难以理解、易混淆的特性,比如说指针运算、操作符重载,内存管理等。 Java 可以做到堆栈分配、垃圾回收和自动内存管理,在一定程度上为开发者减轻了入门的难度。

  • 可移植性:Java 先编译生成字节码,再由 JVM(Java 虚拟机)来解释执行,目的就是将统一的字节码转成操作系统可以识别的二进制码,然后执行。而针对不同的操作系统,都有相应版本的 JVM,所以 Java 就实现了可移植性。

  • 安全性:Java 适用于网络/分布式环境,在安全方面投入了巨大的精力。使用 Java 可以构建防病毒、防篡改的程序。

  • 并发性:Java 在多线程方面做得非常突出,只要操作系统支持,Java 中的线程就可以利用多个处理器,带来了更好的交互响应和实时行为。

3. Java应用领域

大数据领域:

与 Python 一样,Java 在大数据领域占据着主导地位,很多用于处理大规模数据的框架都是基于 Java 开发的。

  • Apache Hadoop:用于在分布式环境中处理大规模数据集。Hadoop 采用了主副架构模式,其中主节点负责控制整个分布式计算栈。Hadoop 在需要处理和分析大规模数据的公司当中很流行。

  • Apache Spark:大型的 ETL(数据仓库技术)、预测分析和报表程序经常使用到 Spark。

  • Apache Mahout:用于机器学习,比如分类、聚类和推荐。

  • JFreechart:用于可视化数据,可以用它制作各种图表,比如饼图、柱状图、线图、散点图、盒状图、直方图等等。

  • Deeplearning4j:用于构建各种类型的神经网络,可以与 Spark 集成,运行在 GPU(图形处理器)上。

  • Apache Storm:用于处理实时数据流,一个 Storm 节点可以在秒级处理数百万个作业。

物联网领域:

Java 提供了大量的 API 库,可以很容易应用到嵌入式应用程序中。相比其他编程语言,比如 C 语言,Java 在切换平台时更加顺畅,不容易出错。

  • 多种协议:MQTT协议、CoAP协议等等物联网协议, Java 都有多个API库支持使用。

  • 数据存储与分析:Java支持各类各样的数据存储和分析框架,如MySQL、MongoDB、Hadoop、Spark等。

金融服务领域:

  • 聊天机器人,由于可移植性、可维护性、可视化等诸多方面的因素,Java 成了开发聊天机器人最好的工具。

  • 欺诈检测和管理,银行和金融公司使用 AI(人工智能)工具来进行金融欺诈和信用卡欺诈检测,而 Java 常用来开发这些 AI 工具。

  • 交易系统,Java 虚拟机提供的动态运行时编译优化在很多情况下比编译型语言(如 C++)具有更好的性能,让交易系统运行得更顺畅。

  • 移动钱包,基于 AI 和 Java 算法开发的移动钱包,可以帮助用户在花钱时做出更智能的决策。

web领域:

Java 对 Web 领域的发展注入了强大的动力,主流的 Java Web 开发框架有很多:

  • Spring 框架,一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,渗透了 Java EE 技术的方方面面,绝大部分 Java 应用都可以从 Spring 框架中受益。

  • Spring MVC 框架,是一种基于 Java 实现的 MVC(Model-View-Controller)设计模式的请求驱动类型的轻量级 Web 框架。

  • MyBatis 框架,一个优秀的数据持久层框架,可在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM(Object Relational Mapping,对象关系映射)实现。

  • JavaServer Faces 框架,由 Oracle 开发,能够将表示层与应用程序代码轻松连接,它提供了一个 API 集,用于表示和管理 UI 组件。