JVM - 引论
当今时代是"计算机时代",虽然最近更准确的说是"智能数字时代",计算机已经从"工具"演变为"环境",已经不是时代的"主题",而是时代的"底座"。
微缩编程史
在正式开始了解 JVM 之前,先大概了解下"编程史"。"编程史"其实是从物理劳动演变为逻辑艺术的进程,其核心是抽象层级的不断提升。大概经历了如下几个阶段: 插拔电缆:本质是物理编程,程序逻辑由工程师手动插拔成千上万根电缆和设置开关来实现。程序即硬件,程序更改需要重新进行物理布线,可能需要数天时间,就像为了每听一首歌,去重新焊接一次音响内部电路。
打孔纸带:历史由所有人共同创造,但其方向和关键点往往由少数天才定义和加速。那个名为冯·诺伊曼的男人在 1945 年撰写了一份《关于 EDVAC》的草案中,明确提出了“存储程序”的概念,并描述了计算机的基本组织结构(此架构其实是多位科学家共同智慧结晶),至今,绝大多数计算机仍然遵循这一基本架构。打孔纸带则代表着存储程序的诞生。根据冯·诺伊曼架构,程序和数据一样,以二进制形式(有孔/无孔)存储在外部介质(纸带)上,然后被读入内存执行。此后,程序可以被保存、复制和快速加载,而无需去改变硬件,计算机可以自动读取并执行指令序列。打孔纸带虽然解决了很多问题,但是晦涩难懂,即使是自己制作的纸带,过一段时间就不知道是啥东西了,因为这是给机器看的机器码(二进制 0 和 1),就像"0001 0001 0011 1110 0010"代表一个数字,但是一眼看去,完全不知道是什么,对于人类非常不友好。
汇编:1950 年代初,为了解决机器码的非人性问题,汇编语言被创造出来,用助记符(简短、易记的单词)来代表二进制指令,再由汇编器专门负责把助记符翻译成机器码。代码首次变得对人类友好,大幅度的提升开发调试的效率,汇编在硬件细节和人类思维之间架起了第一座桥梁。汇编是一种低级语言,它与机器指令之间几乎存在一一对应的关系,直接掌控硬件,可以实现任何硬件允许的操作,精心编写的汇编程序可以做到体积很小、运行速度很快,没有任何高级语言能够超越它所能表达的性能。但是。。。汇编其实在专注于"如何做"而不是"做什么",虽然助记符容易理解,但是程序所表达的逻辑还是晦涩,对于一个非常简单的任务,可能需要编写大量的指令来完成;同时,汇编代码无法移植,针对一个指令集架构(每种 CPU 架构都有独一无二的指令集)编写的汇编程序,无法在另外一种指令集架构的 CPU 上运行。
高级语言:为了让程序员专注于解决问题本身逻辑,而不是计算机底层实现细节,高级语言应运而生。高级语言使用接近人类自然语言(尤其英语)和数学符号的语法和结构来编写程序,摆脱了对特定硬件指令集的依赖,实现了高度抽象。高级语言代码无法被 CPU 直接理解,需要通过编译器(一次性将源代码翻译成目标代码(机器码或者汇编),然后执行)或者解释器(逐行读取源代码,边翻译边执行)处理。高级语言极大的增强的代码的可读性和可维护性,显著提高了开发效率,是软件工业革命的引擎,催生了庞大的软件产业。
如何让人类更高效、更准确的指挥计算机是编程演进线路的核心驱动力。通过抽象层级的不断提升,从物理层(电缆)->二进制(纸带)->符号层(汇编)->逻辑/业务层(高级语言),让程序员离硬件越来越远,离要解决的现实问题越来越近。
java 诞生背景
时间来到 20 世纪 90 年代初,编程界各种高级语言百花齐放,同时各种家用电器也迎来了大爆发,电视机、电话、机顶盒等等都走进千家万户,但是这些电器的生产制造公司各不相同,不同品牌的电器使用的电子芯片也不相同,因此需要为使用不同 CPU、内存小、可靠性要求高的设备开发一个软件平台,这个平台不需要关注硬件平台的差异,程序员只需将精力完全放在应用程序开发上面。在 1991 年,Sun Microsystems 公司由詹姆斯·高斯林带领的团队,发起名为"绿色项目"的内部研究项目,旨在解决上述问题。
当时的主流高级语言存在如下一些问题。 1、可移植性差:为一种CPU编写的程序无法在其他CPU上运行; 2、内存管理不安全:指针操作和手动管理内存容易导致系统崩溃; 3、过于复杂:例如C++的某些特性对于这个领域的开发者来说过于复杂; 为解决上述问题,高斯林及其团队为新平台引入了三大核心技术特性: 可移植性:就是那句耳熟能详的"Write Once,Run Anywhere";
实现可移植性,可以通过编译器或通过中间语言实现两种方式: 编译器实现:类似于C/C++,既能运行于Windows,也可以运行于Linux,这种能力不是语言本身具备的,而是编译器赋予的;涉及到系统调用时,往往需要调整程序,调用特定系统的特定API; 中间语言实现:程序被编译后,生成中间语言,中间语言由虚拟机负责解释和运行,无论程序最终运行在哪个平台上,源代码编译成的中间语言都是相同的;java、C#等语言都是使用这种兼容方式;
安全性与健壮性:取消指针、增加垃圾回收(GC)、进行强类型检查和字节码验证; 简单性:语法借鉴C/C++的形式,摒弃其中复杂且容易出错的部分,让语言更容易学习和使用; 然而,理想是美好的,现实是残酷的,"绿色项目"在智能家电市场商业尝试并不成功,直到90年代中期,万维网开始爆炸式增长,Java的字节码正好极其适合网络传输,Java提供了完美的跨平台运行方案,从而Sun公司在1995年正式对外发布Java,伴随着网景浏览器决定支持Java Applet,Java瞬间引爆整个互联网,Java的时代就此到来。Java"生于家电,成于网络",完美的抓住了互联网发展的历史机遇,将其技术优势发挥的淋漓尽致。
JVM现状
如今,JVM(Java Virtual Machine)早已超越了仅仅运行Java程序的范畴,演变成了一个成熟、高性能、多语言的企业级计算基石。凭借其可靠性能和生态系统,在当今最关键的计算领域依然扮演着无可替代的角色。拥有庞大的中间件生态(kafka、Elasticsearch、RabbitMQ/ActiveMQ等),其相关企业级框架(Springboot、SpringCloud等)拥有无与伦比的社区和企业支持;大数据生态几乎由JVM语言"统治",相关系统需要处理TB/PB级数据,对稳定性、吞吐量和内存管理有极致要求,JVM是少数能完美满足这些要求的平台;kotlin、Scala等语言也是购建在JVM之上,开发者可以根据需求和喜好,选择最合适的JVM语言,同时又能无缝接入庞大的Java生态库。
最后
我们将用一系列文章介绍JVM架构及相关知识,共同学习、共同成长。在了解这些知识时,如果有计算机组成原理和操作系统相关知识,对于jvm相关知识就更容易理解,JVM毕竟是一个运行在计算机和操作系统之上的一个复杂软件。最后我们以一张驰名中外的图片结束。
下一篇:JVM - 运行时数据区
扫描下方二维码,关注公众号(星翰成长日记),及时获取更新
文中所用图片均来自网络,如因图片使用侵犯了他人的版权或其他合法权益,请及时与我们联系,我们将第一时间进行处理。