那天,电脑里的两个家伙吵起来了···

某天周末,CPU和JVM聊了起来···




905fc8426ef559fdf3c20b794a16f57f.png

小兄弟,最近听说你风头很猛啊

大哥见笑了,岂敢岂敢

6d2af2aec17e9b7e203f8581ed37352e.png



2f5047d0002b46bac0a5803df234da3f.png

岂敢?我看你敢的很嘛,自己搞了一套虚拟机,都快把我架空了

大哥你看你说的,我就是一Java虚拟机,最终还得把代码指令发给您来执行。根本离不开你,怎么会架空你呢

1477929206e1ce1783310b7f55fd17e0.png



6d2af2aec17e9b7e203f8581ed37352e.png

我倒是很好奇,既然最终还是得靠我来执行指令,那你存在的意义又是什么呢?

这您就有所不知了。我作为中间商,为程序们提供了最优质便捷的服务,要是让他们直接跟你打交道,那还得了解你的指令集,你的I/O方式、你的内存管理方式,可麻烦了。

6d2af2aec17e9b7e203f8581ed37352e.png




1477929206e1ce1783310b7f55fd17e0.png

别蒙我了,你说的这些,操作系统都封装好了,程序们直接调用就好了,哪有那么麻烦?

。。。。。。

1477929206e1ce1783310b7f55fd17e0.png

你说的不错,不过有一个致命的问题,就是操作系统也帮不上忙。

1477929206e1ce1783310b7f55fd17e0.png





1477929206e1ce1783310b7f55fd17e0.png

什么问题?

跨平台移植

6d2af2aec17e9b7e203f8581ed37352e.png




6d2af2aec17e9b7e203f8581ed37352e.png

你是说在移植到不同的操作系统上吗?

不仅仅是操作系统,还可能移植到别的架构CPU上。这样原来的程序就没法执行了。

1477929206e1ce1783310b7f55fd17e0.png




550e7b5576e461698f345fefba76ae97.jpeg

6d2af2aec17e9b7e203f8581ed37352e.png


1477929206e1ce1783310b7f55fd17e0.png

提问题当然容易,那你有什么好的解决办法?

我的办法就是不要让程序代码编译成你的指令集的指令,而是生成一个我定义的中间码。运行的时候再由我来负责把它们翻译成当前平台下对应的CPU指令,交给你们CPU来执行。

6d2af2aec17e9b7e203f8581ed37352e.png




6d2af2aec17e9b7e203f8581ed37352e.png

好家伙,还说不是把我架空,这样一来,你这个中间商好赚差价啊。

不过这对您也没什么损失嘛,反正最后还是躲不开您这一层。

1477929206e1ce1783310b7f55fd17e0.png



6d2af2aec17e9b7e203f8581ed37352e.png

c9fc5742a25cca715a19a21a023858fc.png759d585f8616700f3a48bea9fa7bc22b.png44af75a1ed5ea50c079555f8d4d15379.png71107a96a8140c39db7d7170152b7e92.png


6d2af2aec17e9b7e203f8581ed37352e.png

我听你这意思,那如果其他语言能编译成你的中间码,你也能执行了?

那可不,除了Java,咱还能执行Groovy、Scala,对了,Python咱也能执行。这不跟您一样嘛,不管是什么高级语言,最终编译成你的指令集,你就能执行了,这不一个道理嘛

1477929206e1ce1783310b7f55fd17e0.png




1477929206e1ce1783310b7f55fd17e0.png

有点6啊,你这个中间码是什么样的?有这么厉害,跟我的指令集有什么不同呢?

跟您的指令集很像,不同的是我的“指令”不像您的指令有长有短,我的统一都是一个字节,所以也叫字节码!

1477929206e1ce1783310b7f55fd17e0.png




6d2af2aec17e9b7e203f8581ed37352e.png

都是一个字节?别蒙我了,光内存地址都不止一个字节。

真的,我基本上都是零地址指令,要用的数据都在栈顶,直接操作就是了

6d2af2aec17e9b7e203f8581ed37352e.png




303c5db5df7950a19a525e67ad634a87.png

都在栈顶?不用寄存器怎么进行数据操作呢?

谁说一定要有寄存器?我就不用寄存器,您是基于寄存器架构的,而我是基于栈式架构的。运算的时候直接操作栈顶的数据就行了


6d2af2aec17e9b7e203f8581ed37352e.png

1477929206e1ce1783310b7f55fd17e0.png




1477929206e1ce1783310b7f55fd17e0.png

基于栈?你是说你的指令用到的数据都放在栈里是吗?这栈是在内存中,这样的话数据不停进进出出就要频繁访问内存,肯定很慢吧?

那肯定是比您慢了,不过我也有优化办法。

6d2af2aec17e9b7e203f8581ed37352e.png




1477929206e1ce1783310b7f55fd17e0.png

什么办法,说来听听

Top-Of-Stack-CAching,简称TOSCA,就是栈顶缓存。在栈顶的数据虽然名义上是在栈顶,但实际我在实现的时候,偷偷的放在了你的寄存器里,不仅可以减少访问内存的次数,你到时候执行的时候访问起来也快得多。

6d2af2aec17e9b7e203f8581ed37352e.png




6d2af2aec17e9b7e203f8581ed37352e.png

好家伙,你这小子当面一套,背后一套啊。

1477929206e1ce1783310b7f55fd17e0.png

2646a7e57e7d8243f3c9b2c1225e4195.png




1477929206e1ce1783310b7f55fd17e0.png

你开始说到了“翻译”,你是怎么翻译执行这些字节码的呢?

我们为每个字节码都准备了对应的汇编指令,来完成这个字节码定义的行为。然后把所有字节码的汇编指令入口整合到一张表里来,我来统一派遣分发就可以了。这些汇编指令到时候就直接交给你CPU来执行就好啦。

6d2af2aec17e9b7e203f8581ed37352e.png



0ada451c175c55e9c2d36c76ea7a52a4.png

1477929206e1ce1783310b7f55fd17e0.png

我知道了,你们的跨平台关键就是在不同平台生成对应的的汇编指令,是吧!

6d2af2aec17e9b7e203f8581ed37352e.png

5a81af4f18731bdc3e31259de880b677.png




1477929206e1ce1783310b7f55fd17e0.png

不过这听起来有点像是解释执行啊,跟那些脚本语言解释执行差不多嘛

你说的那些脚本语言底层是用高级语言在“模拟”执行,而我是直接把字节码翻译成了汇编指令,比他们快多了。

6d2af2aec17e9b7e203f8581ed37352e.png




6d2af2aec17e9b7e203f8581ed37352e.png

再快,那也是解释执行fa922b4fae7312bd9a210e5ab5e00651.png

好吧,看来得亮出绝活了!

1477929206e1ce1783310b7f55fd17e0.png




6d2af2aec17e9b7e203f8581ed37352e.png

啥?

JIT,just-in-time compilation,即时编译技术。

1477929206e1ce1783310b7f55fd17e0.png




6d2af2aec17e9b7e203f8581ed37352e.png

这是啥,看上去很厉害的样子

我在派遣分发的过程中,发现有频繁执行的函数或者代码块,我就会启动即时编译机制,将这部分代码直接编译成你CPU的指令,后面就不用再走字节码派遣表执行了

1477929206e1ce1783310b7f55fd17e0.png




6d2af2aec17e9b7e203f8581ed37352e.png

频繁执行的函数好理解,频繁执行的代码块是什么意思?

比如函数中某个循环体,循环执行很多次,虽然可能这个函数调用次数不多,但循环执行要是很多,也会触发我的即时编译机制





6d2af2aec17e9b7e203f8581ed37352e.png

你是怎么判定是否是频繁呢,不会是凭直觉吧

当然不是,频不频繁,我心里是有“数”的。这个数就是计数器,我会统计函数的调用次数和循环体的执行次数。

1477929206e1ce1783310b7f55fd17e0.png



6d2af2aec17e9b7e203f8581ed37352e.png

好小子,有两把刷子啊,没少花心思

雕虫小技,不敢班门弄斧639b8c67cf2d6ac3071cdb8456df9535.gif

d413bd8c31f0fdd60c1e99149434ab88.png




1477929206e1ce1783310b7f55fd17e0.png




f8c0e9d1f6f3db638d25df5b8ed33a31.png

呀!别聊了,程序员开机了,要去干活了

今天不周末吗,他咋还来6d2af2aec17e9b7e203f8581ed37352e.pngf8c0e9d1f6f3db638d25df5b8ed33a31.png

5ebc270849872aeef26eb4c7b73e0fb8.png




猜你喜欢

转载自blog.51cto.com/14886635/2550036