JVM-追本溯源,带你从头了解jvm的来路

引言

(本小节更多侧重思考jvm的发展来历,带你从头了解它出现的必要,不涉及具体jvm具体组成)

一门新技术的发明或领域的发现都是为了解决某个问题

当人脑在计算存在疲倦等一系列生理限制

人们会想有没有一种工具能帮助我们更快的完成计算,而且是快准狠多

于是有了计算机,它可以不用休息的无时无刻完成人们想要的计算工作,还可以永久记录保存

随着时间的发展,计算机除了计算,还能帮我们做很多的事情,进行各种娱乐活动,浏览网页,玩游戏,看视频等等

那么你会发现一个很神奇的现象,眼前的一台没有生命的盒子,它究竟是如何做到与我们人类建立沟通的,来保证完成我们人类想要的结果

现实中,如果你想要别人帮你做一件事情,那么一定离不开一个东西就是“语言

或者换句话说,是一种约定俗成的的规则

就像我知道你能知道我的意思,那我为什么知道你能知道我知道你的意思,那就是我们人类发展历史来,大家达成的共识

同理,我们想计算机知道我们想让它们做什么,那就需要和它们达成共识

如何达成共识?

最直接的办法就是,当我输入“a”的时候,计算机做一个动作,当我输入“b”的时候,计算机再做一个动作,当我把所有的规则都给计算机说清楚后,那么就意味着我们已经达成共识了!计算机只有按照我说的,通过规定做就好了

当然前提是它只能理解你目前制定的已有规则,目前的它可不会举一反三

计算机只认识0和1(就是二进制),换句话说,不管我们在计算机上干了什么事情,运行了多么复杂的程序,最终到了CPU的执行层面,其实就是 一串串的0和1组成的指令罢了

为什么计算机只能识别0和1,这就是计算机发明的人们达成的一种共识!

机器语言

那么就意味着0001,0011,0111(举例使用)....等等的组合将代表计算机内部不同的操作,这种语言我们叫做机器语言,根据名字可以知道人类设计的机器能看懂的语言,它对机器而言,简单直接,看到什么指令执行就好,这些指令都是固定好了的

汇编语言

但对人类来说不太友好,比如 计算 1+1,两个 数据1都 使用 0x0001 来表示,而 加操作,放在cpu中,可以是 0x1011(这个是胡乱写的),这个二进制代表的加操作能被计算机识别。而因为这个加操作对于cpu来说,编码的0x1011格式是固定的。所以可以直接用一个我们人类好理解的一个助记符“add"来表示,这样人们写程序就方便多了,也好记忆一些,而这就是汇编程序的由来,这种语言也被叫做汇编语言

当然,一个是学的英语,一个是学的中文,如何达成共识?必然需要一个都理解的翻译来替我们完成沟通,也就是一个叫”汇编器“的东西帮我们完成,这里我们就不去深究"汇编器"原理,你知道它起一个翻译作用,减轻人们编程的负担即可

接着往下思考

虽说有了汇编语言,但是不同的设备都有不同的汇编规则,一种汇编专用于某一种计算机系统,若我们的程序要运行多种计算机系统里面,它又会加重人们的编程的负担

高级语言

于是,我们想有没有办法,再来一套约定的规则,一套规则适用于所有的汇编,比如:我们写下”1+1”这种人们一下就知道的符号,然后机器帮我们翻译当前机器系统能后识别的汇编语言,一条条指令,然后再汇编成计算机知道的0和1的机器语言,这样,cpu等硬件能识别的东西没有变化,我们也只需要记住“1+1”这种利于人类记忆的符号即可,那么,这种语言我们把它叫做高级语言

你可以发现计算机语言的发展:机器语言-汇编语言-高级语言

小总结:万物发展都是循序渐进的,不可能说一个国家直接原始社会直接进化到社会主义社会,中间一定是需要世世代代伟大的人物不断的探索与发现的

同理,这些计算机语言的概念的东西也不是直接一下就出来的,

而是在人类探索的过程中不断遇到问题不断的更新而来,有汗也有泪,从而形成一套系统化的约定,以后说不一定还有新的更新迭代,请允许我对给时代的开拓者保持崇高的敬意

我们继续往后看上述说的高级语言

        最开始的高级语言叫“C语言”,它的执行效率是非常高的,直接和计算机内部硬件交互,但它不是我们今天的主角,我们就不谈它好在哪,而是看它有什么问题?

        不同公司所生产的 cpu芯片,他们所使用的指令集不同, 这种芯片设计的事情,又不像TCP/IP协议那样,有国际统一的标准,像intel所代表的复杂指令集,和arm为代表的精简指令集,它们指令集的设计思路就是不一样的,那就更不要说不同的操作系统了,不同系统所编译出来的文件的格式都不同。

        所以 我们C语言最后编译出来的的二进制文件,不同的cpu和平台上识别的意义是不同的,所以当A电脑(windows系统)执行的代码后生成的东西,无法直接在一台配置不同的B电脑(LInux系统)上直接运行,这就意味这当你在A电脑上写了项目后,要想在B电脑运行时,就得重新根据B电脑的系统和设备考虑重新写修改,大大加重了负担。

所以很多资料为什么说C语言不能实现跨平台运行,就是因为它编译出来的 输出文件的格式,只适用于某种系统的cpu,其他cpu不认识啊

那么,如何解决这种问题?

根源其实还是上述思考的:不同的平台在运行代码时,最终应为各个的差异性,存在没有达成的共识!

根据上面的思路,A和B未能达成共识,于是应该有一个既能知道A又能知道B的C来帮助我们完成沟通,从而达成共识!

那么有没有一个东西能帮助我们解决这种跨平台的问题呢?

换句话说就是,我只需要在一个系统上写一段代码,然后它可以在不同的操作系统设备上都能识别!大大减少了开发成本!

于是,很顺其自然的引出今天的主角-----JVM

创造的意义

先看定义:

       “它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序

        可能有些抽象,结合我们上面分析的道理,不难明白,它是抽象的,虚拟的,可以帮助我们在不同的各种系统和硬件平台适配,从而我们在写高级语言的时候,就不用考虑底层硬件无法识别我们代码所要表达的意思的问题了,只需要专注本身开发的业务即可,是不是类似有一个中间的过程,帮助两个互不认识的人达成共识

        所以,哪有岁月静好,只是有人在替我们负重前行!

        接着看总结

        "java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。"

        上面的意思可以如何理解呢?就是意味着你的代码运行不直接和具体电脑的操作系统和硬件有直接关联,而是直接面向JVM,那么换句话说,只要你的不同系统和设备的电脑有JVM这个东西,那么你写的代码不用修改就可以在不同的电脑设备上去运行,于是实现跨平台的效果,注意,前提是要有jvm等环境!不然就不谈!

        请看下图:

      

         如果我们想在Windows系统下开发Java项目,就需要去Oracle官网下载安装一个Windows版的JVM;若是Linux系统,那么就下载安装一个Linux版本的,其他系统以此类推。

        综上,也就是当你在windows系统上开发了一个项目后,在linux服务器上去部署服务的时候,其中一个环节需要安装一个linux的jvm虚拟机,那么你的项目就可以完全的跑起来了,是不是很方便。

        这个也就是我们所谓的java是一个跨平台的语言,本质其实就是有一个中间的环节(jvm)来帮助我们适配不同的系统,从而达到跨平台的效果,从而减少开发项目的成本(硬件适配等底层知识),只需要关注其产品的业务逻辑等方面即可。

       当然,上面所有的描述其实都是一个更多偏向jvm的诞生过程思路,不涉及到具体jvm的组成结构,后面再细致对其进行研究,于是当你明白了它的组成后,又很自然回去考虑一个问题就是jvm的优化等情况

        所以,知识是连贯的,也是循序渐进的,不断更新的,不断学习的,任重而道远,共勉之

     

         感谢观看,欢迎批评斧正

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值