当前位置: 华文问答 > 数码

为什么 Java 语言会有「虚拟机」这个概念?

2022-11-01数码

循序渐进,简单易懂概括一下虚拟机执行环境的好处和坏处。

第一步跨平台。这个是最基础的一个好处,不同芯片不同指令集不同环境,虚拟机提供了一个统一的指令执行环境,不同的平台只要适配了虚拟机,程序就能够兼容运行。

"你也不想每个平台重新编译一次,对吧"。

第二步方便调试。就像你在题目中说的,如果只是跨平台,c语言一样可以做到啊,我们把底层的硬件相关代码统一接口,上层调用,我们做好底层库的支持调用就行了,上层代码不照样跨平台,但一个工程项目开发环境最重要的并不仅仅是编译环境,还有调试环境,而c语言的调试环境是具有非常强的平台相关性,并与编译器有高度的依赖习惯性,不同的平台调试器,调试器实现起来千差万别,因此,基于虚拟机来实现一个通用的调试环境,要比直接依赖平台实现调试器方便的多。

"你也不想每个平台重新编写一套调试器,对吧"。

第三方便抽象,例如new一个对象这个过程,本质上涉及到了很多的包装细节,例如对象的内存分配管理,构造,静态区初始化,如果这个直接让原生指令集来支持,几乎是不现实的,一则没有必要,二来这会导致电路设计极度复杂甚至是不可实现,但虚拟机环境你可以对这些实现细节交给底层代码进行管理,能够简化上层编译器工作量减少上层代码的空间,同时能够提供边界检查,空指针引用,gc机制等多种查错及管理方案。如果没有这些抽象功能:

"你也不想被派去做这款芯片,对吧"。

第四方便进行任务调度。多任务执行(比如多线程)很多时候也是强平台相关的,如果上os没有直接的多任务支持,比如在嵌入式裸机开发中,一个非常头疼的问题是大多开发大量使用fsm(有限状态机),导致一个任务执行下来,要写一大堆的状态进行切换,导致代码越堆越大,后期越来越难维护,但虚拟机环境可以实现一个平台无关的多任务执行机制,完全由自己掌控指令切片及资源分配,为上层语言提供方便,减轻上层开发人员工作量。

"你也不想再过几年就脱发了,对吧"。

第五容错率更高,在原生代码中,如果一个程序中出现了错误,那么整个程序很可能都没办法继续执行下去了,如果没有操作系统进行进程管理之类的操作外,一些MCU环境需要一系列类似于看门狗之类的操作来让程序重置,当然使用一些程序架构的方式可以让程序具有一定的鲁棒性,但总体来说开发成本仍然太高了,如果一个程序需要承载几万几百万的的并发及任务,几个任务的错误导致整个程序都随之崩溃显然是不可接受的。因此,我们希望程序具有一定的容错能力,就像操作系统一样一个软件程序崩溃了不会导致整个系统宕机,虚拟机恰好就能提供这种功能,把那些发生错误的任务中止而不影响正常点业务

"你也不想每个周末都被叫回办公室擦屁股,对吧"。

第六方便建立生态,为什么Java,Python能够流行起来的原因主要是有几点,一是上层语言学习曲线简单友好,方便入坑,培训机构三个月上岗,有时还真不是吹的,二是统一的执行环境方便各种库的开发,大量好用的库又吸引了大量开发者进一步完善,进一步又提高了生产力,形成良性的生态循环。

我一直认为一个技术方向是否成功,必须放在工业界看看能否真正提高生产力真正用更低成本解决实际问题。实践始终是检验真理的唯一标准。

"你也不想学了一个网上都在吹,PPT和软广新闻各种发,最后出来发现根本就没人用的东西,对吧。"

虚拟机坏处:一胖一慢毁所有。

自制虚拟机+对应语言+调试器以示我不是在云