Lars bak

(1)先从smalltalk说起

上回书《阿伦凯(Alan Kay)》咱们说到世界上第一个基于语言虚拟机的编程语言Smalltalk,以及它的创造者:Alan kay。今天我再沿着语言虚拟机这条路,再走向系统虚拟机《虚拟机:IBM-S/360-OS/2》,最后走向今天我们要讲的容器技术,而我仍然是通过一个神人来串起这些事,这个人就是:Lars bak。

这位神人和Alan Kay一样同样出身于施乐实验室。Alan虽然创造了Smalltalk和语言虚拟机,但是由于当时计算机的性能太差无法高性能地跑语言虚拟机,所以Smalltalk只能待在实验室里玩而无法大规模普及给工商业界。我想了想我在1999年学习Java的时候都觉得java虚拟机很慢,记得我也是在2004年之后Java虚拟机才感觉快起来,所以对于80年代编程语言用虚拟机技术那更是痴心妄想。所以说Alan Kay的主要贡献不在于Smalltalk和语言虚拟机,而是GUI-MVC-面向对象。

我上回书说到:

C++是借鉴的面向对象编程语言鼻祖Simula,而不是Smalltalk。我想根源可能是C++作者觉得欣赏面向对象思想而不欣赏语言虚拟机,毕竟C语言以高性能而著称。

而苹果的Object C则是借鉴了SmallTalk。我一开始不明白这个关联,而且我过去看见苹果公司搞LLVM也不是很明白。现在,Ojbect C-Smalltalk-LLVM,这么一串联,我就对上了。你对上了没有?你是否明白苹果做LLVM的用意?

其实一个语言虚拟机分为好几层:

  • 编程语言层

  • 前向编译器:其实含检查器-优化器-编译器-链接器四大部分。这个前向编译器就是把源代码编译成中间字节码

  • 中间字节码-虚拟指令集层

  • 后向编译器:比如编译成机器能识别的二进制代码,或者目标代码(如JS代码)

  • 执行虚拟机:其实就是和一台虚拟的计算机一样,搞核心的应用程序加载-执行、计算(线程-并发-锁)、内存(内存分配-回收)

至于其他如文件系统、内存-文件交换都交给操作系统,还有IO驱动控制也都交给操作系统。

所以大家看,搞编程语言-编译器-语言虚拟机-操作系统的人,都是知识共享的。所以微软一个搞个人电脑上的BASIC解释器的公司也后来搞了操作系统。

(2)JVM

言归正传,咱们还是回来说咱们的大神Lars bak。

这位大神接手了Smalltalk,一直有个梦想就是把这门编程语言推广给工商业界,所以他树立了一个目标:让Smalltalk的运行速度达到C语言的75%性能。

所以他一阵魔改:在编程语言级别-前向编译器级别-后向编译器级别-执行虚拟机级别到处修改,改来改去就改出一个东西:StrongTalk。所以我想了想Java、Scala、Kotlin,不也是殊途同归么?

我为啥这里说起Java呢?嗯,大家都知道,Java搞JVM其实就是借鉴的是Smalltalk语言虚拟机的思路,是为了统一屏蔽硬件差异巨大的日本家电的。但是Sun公司的人搞操作系统拿手(Unix-Solaris),搞编程语言-虚拟机还不擅长。所以Java虚拟机在1997年的时候还是解释型的,就如同我们早年玩的Dbase、VBasic、JavaScript一样,那当然性能慢啊。

咋办?还得找鼻祖,谁发明的就找谁。于是,Sun公司就把大神Lars bak给并购过来了。这就是后来Sun公司官方的JVM:Hotspot JIT即时编译器。

这位大神先搞定了java最大的性能问题后也没闲着,就在Sun公司负责了J2ME的规范设计。要知道J2ME可是Java发源的初心,也是最最苛刻的硬件条件,能把慢如牛的java在最小的硬件资源上高性能地运转起来,那就把Java的初心实现了。于是,lars就开始搞J2ME CLDC。CLDC指的是Connected Limited Device Configuration,有限连接设备配置,此版本主要针对电池小、尺寸小、硬件资源有限的设备。如移动手机。

而J2ME CLDC版本中包含的语言虚拟机,就是大家过去听说过的KVM。这就是大神的杰作。想想当年在iPhone和安卓之前,多少游戏是用KVM写的啊。不过想想大神连续搞了这么多次语言虚拟机也就理解了,大神算是把虚拟机都玩透了。

(3)V8

大神搞完J2ME和KVM之后,了然无趣,就飘然而去去了谷歌。去了谷歌就一鸣惊人,Chrome浏览器横空出世,以闪电性能立马席卷IE的市场。Chrome为啥这么快?就是因为大神搞了一个JS执行引擎:V8。

咱们刚才说,JavaScript是解释型的,在浏览器中内置了一个JS解释器,所以肯定性能慢啊。但是你想让广大程序员把解释型JavaScript换成编译型JavaScript这比较难。这就是习惯的力量。大神当时还不敢动众人的奶酪。所以大神想了想:不能在编程语言-编译器级别搞事,那我就在再往下层级搞事。大神当年魔改Smalltalk的劲头又出来了。

大神搞了一个V8语言虚拟机,其实原理就是:浏览器把JS代码从服务器端下载下来后,就进入了大神的视野。大神把JS源代码当Java源代码看待,搞检查器-优化器-前向编译为字节码-后向编译为机器码-语言虚拟机来加载执行。也就是说,你看到的是JS源代码,其实内部执行的是二进制代码。别看大神多了这么多环节步骤,但我们一点都不感觉到慢,可想大神在搞编译器-语言虚拟机方面的工程功力。

2004年,ADSL网速加快,Web2.0风潮兴起,AJAX带来了丝滑般的数据刷新的体验。Adobe的心痒痒了。同样为三大插件技术:Flash、Applet、ActiveX,最先退场的是Applet(Java走上了Servlet-JSP道路),ActiveX不甘心走上Silverlight道路,Flash走上Flex RIA道路。谷歌也不甘心啊,就搞了一套GWT,也是RIA 富网页应用,但是谷歌没有搞插件模式,而是用Java开发网页富UI,然后提供编译器把Java源代码编译成Javascript代码。嘿嘿嘿,我们老看见把源代码编译成二进制,很少看见把源代码编译成另一种编程语言的源代码,谷歌也是真绝了。

但我个人也理解谷歌的做法。毕竟谷歌的渲染引擎一开始用的是Opera的Presto渲染引擎,后来换成了苹果公司Safari浏览器用的Webkit WebCore渲染引擎,后来苹果公司把Webkit引擎换成Webkit2引擎,谷歌又把Webkit2魔改成Blink渲染引擎。而苹果公司Safari浏览器的渲染引擎Webkit其实是来自大名鼎鼎的Unix GUI桌面团队KDE在互联网时代的作品:KHTML技术,就是希望把网页UI搞的和本地GUI一样。

但谷歌把Java源代码经过检查器-优化器-编译器翻译成JavaScript源代码,交给浏览器V8 JS引擎,V8再接力把JS搞检查器-优化器-前向编译为字节码-后向编译为机器码。

所以我也想明白了谷歌为啥在搞安卓的时候要放屁脱裤子,先把安卓代码编译成Java字节码,再把Java字节码编译成自己的dex字节码,然后把dex字节码交给自己魔改的语言虚拟机DavlikVM去执行,而且从安卓5.0版本开始把JIT编译换成AOT前置编译成二进制。你能想明白谷歌为啥要脱裤子放屁多加一层的意义了吗?嘿嘿嘿,这个问题留给你,我先不告诉你答案。

我不知道GWT是不是有Lars大神参与,但是这思路和大神的思路很像啊。当然大神不甘心在编程开源框架-编译器-语言虚拟机层级搞事。要想把事情搞彻底就要在编程语言层级动手,这空缺的一环必须补上。

大神们都是说要有光,于是光就有了。所以Dart开发语言就在2010年发布了。这自然是大神Lars的作品了。这不再是Java强类型语言翻译成JavaScript弱类型语言,而是魔改JavaScript成强类型语言。终于,JavaScript在开发阶段就需要有编译器,不过自然是编译成中间字节码啊,再交给Chrome浏览器中的V8语言虚拟机去执行。

所以大家才会看到V8从套壳Chrome中能够独立出来,成为NodeJS执行环境,可以部署到服务器端,用NodeJS编程语言(类JavaScript)来编写业务逻辑代码。我记得我在windows时代就是用Delphi既开发客户层UI又开发中间层业务逻辑,一门语言打天下。现在程序员需要JavaScript+Java两门编程语言才能举事。

想了想谷歌作为Web时代的大佬也是真能折腾,几乎把Web各层都折腾了个遍:

  • GWT UI组件-编译器-字节码、Flutter UI组件、安卓UI组件

  • AngularJS MVVM编程框架

  • WebGPU渲染技术标准

  • Dart编程语言-编译器-字节码、Kotlin编程语言-编译器-字节码

  • Chrome浏览器-V8执行引擎-JS语言虚拟机、DavlikVM语言虚拟机

  • HTTP/2传输技术、gRPC-Protobuf调用技术

顺便说一声,Flutter UI组件就是采用大神发明的Dart编程语言开发的。

(4)万物互联

大家都知道,网景当年是浏览器的老大啊,被微软IE免费捆绑windows给干死了。2003年,网景公司解散,随即,Mozilla基金会成立。而Firefox就是Mozilla基金会出品的开源浏览器。也就是说:Mozilla就相当于网景,Firefox就相当于网景浏览器。

Firefox浏览器由几大部分构成:

  • 渲染引擎:Gecko

  • JS前向编译器:Rhino,可以把JS源代码编译成Java字节码

  • 代码优化器:IonMonkey

  • 后向编译器:OdinMonkey,把asmJS字节码编译成二进制

  • 语言虚拟机:JaegerMonkey

你看这思路,这不就是大神搞V8的思路么?

现在这项技术统称为WebAssembly,像V8语言虚拟机技术一样被从浏览器中剥离出来,现在被另外用于边缘云的容器技术,比服务器端运行的Docker容器技术更快更小。你看,一项技术本来是用来解决JS安全和JS性能的,现在却被解决容器安全和容器性能去了。作者如果知道现在,不知道是该哭还是该笑。

Docker联合创始人Solomon Hykes在一条Twitter里表示,如果 Wasm + WASI 在 2008年就存在了,就没有必要创建 Docker了。

其实Docker容器是个包装,思路很巧妙,借助的主要是谷歌在2007年提交给Linux内核的一个修改:Cgroups。嘿嘿嘿,你看做芯片的Intel在芯片级支持虚拟机技术,你看做操作系统的Linux在操作系统内核级支持多用户资源配额,你看做系统虚拟机的VMWare在系统虚拟机级做多用户资源配额,而Docker既吸收了多用户资源配额的思想又吸收了JAR统一打包的思想。大家都在自己擅长的领域各显身手。

你说谷歌领导的这套WASM+K8S+Servless+服务网格发展的风风火火,那大神去哪里了?。

大神现在成立了一个创业公司作为联合创始人和首席科学家,搞ToitWare,物联网平台:

  • Toit编程语言-字节码虚拟指令集

  • 检查器-优化器-编译器

  • 语言虚拟机

仿佛我们又回到了大佬折腾J2ME-CLDC-KVM的好时光。

f4c4b8e2266ee521225f3b2b4839299f.jpeg

猜你喜欢

转载自blog.csdn.net/david_lv/article/details/130120523
bak