有些技术原理你完全看不懂
上一篇文章写了 为什么 JVM 叫做基于栈的 RISC 虚拟机,看评论里不少人反馈一脸懵逼。
但我相信应该也有不少读者会觉得我整篇文章都在讲废话。
为什么会有这么两极分化的差异呢?
因为如果你知道什么是 ISA,并且把 x86、arm 等指令集都了解过,并且切实感受到了 RISC 和 CISC 指令集的区别,同时也知道基于栈的和基于寄存器的指令集的区别。那么整篇文章就除了标题外全都是废话了。
但如果这些你都不了解的话,那么标题就是天书,整篇文章看下来也只能明白个马马虎虎,除非你把我里面提到的所有手册和源码都浏览过。
所以为什么底层的这些知识非常重要,它能让你秒懂一个技术的原理,而且还能比别人理解得更透彻,上篇文章就是个很好的例子。
------
在咱们国家,计算机底层的教育是十分不重视的,整个环境也不太乐观,大部分人急功近利,只想尽快掌握到能直接提升薪资的上层技术。
同时,网上充斥大量的二手三手四手的博客,被那些专门研究搜索引擎的网站占据了半壁江山。
在公司,也动不动就讲业务价值,把没有的说成有的,把别人的说成自己的,欺骗业务,欺骗自己,还引以为傲。
------
算了,不说这些了。
曾经我因为寻找一手资料而苦恼,一搜就被一大堆二手信息覆盖掉了。
当然,这一部分锅要百度来背,用谷歌搜索一手技术资料会好很多。
于是,我给自己建立了一个一手资料索引的 Github,并且按照顺序自底向上排列了起来。
https://github.com/sunym1993/computer-all
对,名字起得有点大,叫关于计算机的一切。
我希望这里成为我今后学习技术或分享技术的唯一资料入口,这里会保留所有最原汁原味的一手信息,包括手册、官方文档、源码,以及个别非常优质的对一手资料进行简化、格式化、结构化,而不是自行理解和篡改的网站或博客。
当然这个小天地才刚刚开始建立,也非常需要大家的智慧来一起进行完善!
------
有同学觉得,读手册是不是太浪费时间了,直接百度找个博客能快速把知识点学会。
不,暂且不说知识体系的系统性问题,就光拿一个知识点来说,网上博客你看了一圈又一圈,写成啥样的都有,尤其是需要严谨性的一些底层技术,到头来还不如花点时间看看手册。
比如我之前搞不懂 GNU C 和 ANSI C 的关系,网上搜一圈后你会发现更加一头雾水,还得忙着辨别真伪。
但只要你打开 GNU C 的手册,开头就把这个问题说的一清二楚。
如果对这些抽象的描述无法具象化,那么只需要手册再翻一页,看一下具体例子就明白了。
------
再比如上篇文章里讲的,JVM 执行引擎在执行字节码的时候,一种是用古老的字节码解释器,用纯"软件"的方式来模拟执行,效率很低,另一种是用模板解释器,将每个字节码指令都映射为一个函数,直接写入机器码来执行,可针对不同 CPU 体系结构进行优化,效率很高。
这句话你背面试八股文的时候一定听过,而且你可能觉得挺高大上的,但如果你看过源码之后再理解这句话,就觉得它很可笑。
用纯软件的方式模拟执行的字节码解释器,就是用一个 topOfStack 数组来实现所谓的操作数栈,压一个值数组的一个指针就往后挪一下,弹一个值那就往前挪一下,就操作个数组嘛~
模板解释器将每个字节码指令都映射为一个函数,就是按每个字节码来命名一个函数。
直接写入机器码就是查各种 CPU 的手册,拼好二进制的值写进去。
所谓查手册,就和人家的接口说明文档一样,那可比公司里别人写的接口文档好看多啦~
不同 CPU 就是不同的 .cpp 文件,分布在不同文件夹下面,简单粗暴,每个都是查手册写二进制数值,辛苦一点罢了。除非你是专门搞这些指令集的,比如把 OpenJDK 改造一下让它适配龙芯 CPU,那可能是个工程量很大的活,但原理很简单。
里面的 x86 就是我们常用的 Intel x86 CPU 嘛~
看到了这些底层的本质,你还觉得刚刚那句话高大上么?呵呵。
------
好啦,最后希望大家能够尊重技术,重视底层,养成查阅一手资料的好习惯。
老读者可能也发现了我文章的变化,从一开始的破玩意风格文章,变成现在的从一手资料里找论据并推理类型的文章。
我觉得,这样类型的文章并不代表会失去生动和形象,它反而能让你更容易理解到技术的本质,至于如何把它写的更生动,更易读,这就是我要努力的方向了,但这条路准没错。
最后,希望大家和我一起共建这块小天地,关于计算机的一切,靠你们啦~
https://github.com/sunym1993/computer-all
下方阅读原文可以直接跳转过去。