虚拟机的作用(手机最好用的虚拟机)

作者:松本幸弘,摘自《松本幸弘:编程语言的设计与实现》本文将介绍程序设计语言处理器的核心部分虚拟机的实现。源代码编译的结果是运行时的,有很多种实现方式。本文中的

作者:松本幸弘,摘自《松本幸弘:编程语言的设计与实现》

本文将介绍程序设计语言处理器的核心部分虚拟机的实现。源代码编译的结果是运行时的,有很多种实现方式。本文中的虚拟机就是其中之一。

用软件实现的 CPU 来运行

虚拟机这个词有很多不同的意思。在本文中,它指的是“由软件(没有实际硬件)实现的计算机”。

这与虚拟机软件和云计算的语境中虚拟机的含义是不同的。在虚拟机软件的上下文中,虚拟机是指用某种软件包将实际的硬件虚拟化,从而实现多个系统的同时运行以及系统在硬件之间的迁移。维基百科把这个虚拟机归类为“系统虚拟机”,而本文要介绍的虚拟机归类为“进程虚拟机”。

Ruby直到1.8版本才实现(处理)虚拟机,而是通过遍历编译器生成的语法树(一种支持Ruby程序语法的树结构,由指针链接的结构实现)(图1-12)来运行程序。这种方法虽然很简单,但是每次执行一条指令都需要访问指针,代价不可小觑。在Ruby 1.8出来之前,大家都说Ruby慢,这也是原因之一。

int VM(node * node){ while(node){ switch(node-& gt;Type) {case NODE_ASSIGN: /*赋值处理*/...打破;Case NODE_CALL: /*方法调用处理*/...打破;..}/*跳转到下一个节点*/node = node->;接下来;/* ←此处慢*/}}图1-12语法树解释器(摘要)

为什么以前的 Ruby 很慢

我认为有必要解释一下为什么这么简单的结构运行得这么慢。大家都知道硬盘的访问速度比内存慢很多,但是内存的访问速度呢?大家平时写代码的时候,很少关注内存的速度。

但实际上CPU和内存的距离出乎意料的长。相对于CPU的执行速度,通过内存总线读取指定地址的数据的速度要慢很多。在访问内存时,CPU只能等待数据的到来,而这个等待时间会影响执行速度。

为了减少这样的等待时间,CPU内置了一种“内存缓存”的机制,简称“缓存”。Cache是嵌入在CPU电路中的小容量高速存储器。通过预先将数据从主存储器读入缓存,将对存储器的读写转化为对缓存的读写,可以减少访问存储器的等待时间,提高处理速度。

由于缓存必须嵌入CPU,其容量受到严格限制,可以提前读取的数据很少。(现在CPU把缓存分成多级,增加缓存容量。即便如此,容量还是比主存小很多,并没有解决预先将要访问的内存空读入缓存困难的问题。)

为了有效利用缓存,需要提前将下一个内存空读入缓存,但这是非常困难的。一般来说,只有形成了内存访问局部性才能做到。也就是说,由于程序一次访问的内存空很小,距离很近,所以一次访问到缓存的内存空会被多次读写。

在虚拟机上灵活运用缓存

不幸的是,从缓存访问的角度来看,如图1-12所示的语法树解释器是最差的。组成语法树的节点都是独立的结构,它们的地址不一定是相邻或连续的。这使得很难提前将下一个内存空读入缓存。

这里如果把语法树转换成指令序列,存储在连续内存空中,那么内存访问的局部性就会增强,性能也会因为缓存的作用而大大提高。

Ruby 1.9中引入的名为YARV的虚拟机使用这种方法来提高性能。YARV是另一个Ruby VM(另一个Ruby虚拟机)的缩写。之所以叫这个名字,是因为在Ruby刚开发出来的时候,已经有很多虚拟机在开发中,目的是运行Ruby。起初,YARV只是一个实验项目,但只有它能在这些虚拟机上运行Ruby的所有功能,所以YARV最终取代了Ruby自己的虚拟机。

虚拟机的优点和缺点

Java可能是最著名的使用虚拟机的语言,但是虚拟机的技术并不是最早出现在Java中,而是在60年代后期就已经存在了。比如20世纪70年代初出现的Smalltalk语言,因为早期采用字节码而出名(这只是一部分原因)。此外,后来设计Pascal语言的尼古拉斯·沃斯据说已经在Algol68语言的基础上用Eular语言完成了虚拟机实现。Smalltalk之父艾伦·凯(Alan Kay)表示,Smalltalk虚拟机的实现受到了欧拉虚拟机的启发。

一说到Pascal,就会想到UCSD Pascal。加州大学圣地亚哥分校开发的UCSD Pascal,将Pascal程序改为字节码P码后运行。将Pascal程序改为P-code,可以很容易地将UCSD Pascal移植到各种操作系统和CPU的计算机上,这也使得UCSD Pascal作为一种可移植性很强的编译器被广泛使用。

从这里我们可以看出,虚拟机最大的优势就是可移植性。编译器最复杂的部分是用各种CPU生成的机器语言进行代码生成处理。按照下面的CPU重新开发代码生成过程,对于语言处理器的开发者来说是一个很大的负担。

现在x86和ARM架构占主导,CPU的种类比以前少了很多。但是到了六七十年代,新的架构层出不穷,甚至同一家公司的同系列电脑也会根据型号使用不同的CPU。虚拟机在减轻这种负担方面发挥了很大作用。

此外,虚拟机可以用目标语言来设计,因此我们可以将指令集的范围限制为实现这种语言所必需的指令。与通用CPU相比,规格可以降低,开发变得更简单。

但是虚拟机不只是有优势。相比直接在硬件上执行,通过模拟虚拟CPU运行的虚拟机在性能上有很大问题。使用虚拟机的语言处理器会遭受数倍甚至上百倍的性能损失。但是,我们可以使用JIT编译等技术在一定程度上减少这种性能损失。

虚拟机的实现技术

硬件实现的真实CPU和软件实现的虚拟机在性能上是不一样的。让我们来看看与虚拟机性能相关的实现技术。以下是有代表性的。

(1) RISC和CISC

(2)堆栈和寄存器

(3)指令格式

(4)直接跳转

RISC是精简指令集计算机(Reduced Instruction Set Computer)的缩写,是通过减少指令类型、简化电路来提高CPU性能的框架。在80年代流行的架构中,代表CPU是MIPS和SPARC。移动设备广泛使用的ARM处理器属于RISC。

CISC是RISC的关联词,是复杂指令集计算机(Complex Instruction Set Computer)的缩写。简单来说就是“不是RISC的CPU”。CISC的每条指令都执行非常大的处理量,而且指令种类繁多,实现起来比较复杂。

然而,RISC和CISC之间的对立是在21世纪之前。在今天的硬件CPU中,RISC和CISC之间的对立已经没有任何意义。这是因为纯RISC CPU已经不流行了,现在已经很少了。即便如此,幸免于难,并被日本超级计算机“京”和其他设备采用。

在RISC方面前景不错的ARM也在增加指令,向CISC发展。Intel x86作为CISC的代表架构,通过在表面上提供复杂的指令集,在内部将指令转换成类RISC的内部指令(μ op)来保持与过去版本的兼容性,从而实现高速运行。

但是对于虚拟机来说,RISC和CISC之争有着不同的意义。如果是软件实现的虚拟机,我们不能忽略取指令(IF)处理的成本。也就是说,做同样的处理需要的指令越少越好。一个好的虚拟机指令集是一个类似CISC的指令集,它的所有指令都是高粒度的。

虚拟机的指令要尽量抽象,设计一个小一点的程序会更好。有些虚拟机以紧凑性为目标,提供复合指令,将多个频繁连续调用的指令集成为一个。这种技术被称为“指令融合”或“超级算子”。

栈与寄存器

虚拟机架构的两大流派是栈虚拟机和寄存器虚拟机。栈虚拟机原则上通过栈对数据进行操作(图1-13),而寄存器虚拟机的指令包含寄存器号,原则上对寄存器进行操作(图1-14)。

Push 1 ← ①将1推送到堆栈← ②将2推送到堆栈← ③将堆栈中的两个数相加,然后将结果推送到每条指令执行时堆栈的状态。

虚拟机的作用(手机最好用的虚拟机)插图

图1-13堆叠虚拟机的指令和结构

R1 1 ← ①将第一个寄存器赋值为1加载R2 2 ← ②将第二个寄存器赋值为2添加R1 R2 ← ③将第一个寄存器和第二个寄存器的值相加,并将结果保存到第一个寄存器图1-14注册虚拟机的说明

与寄存器虚拟机相比,堆栈虚拟机更简单,程序也相对更小。但由于所有指令都是通过栈交换数据,对指令的顺序有很大的依赖性,很难优化交换指令的顺序。

但是寄存器虚拟机在指令中包含寄存器信息,所以程序比较大。这里要注意的是,程序大小与取指令处理的开销没有必然联系,这一点我们后面也会提到。此外,由于寄存器虚拟机明确指定了寄存器,所以对指令顺序的依赖性更小,优化空区间更大。然而,高度优化的小规模语言的例子很少,所以这并不那么重要。

那么堆栈虚拟机和注册虚拟机哪个好呢?这个问题还没有定论。有许多虚拟机使用这两种体系结构。表1-2显示了这两种架构在各种语言的虚拟机中的用法。我们发现,即使是同一种语言,也会因实现不同而采用不同的架构,有时使用栈虚拟机,有时使用寄存器虚拟机。这个现象很有意思。

虚拟机的作用(手机最好用的虚拟机)插图(1)

表 1-2 各种语言的虚拟机架构表1-2各种语言的虚拟机架构

……

虚拟机的作用(手机最好用的虚拟机)插图(2)

本书由Ruby之父松本幸弘在日经Linux杂志上的连载集成而成。主要介绍了新语言流的设计和实现过程。作者从设计Streem这种新语言的动机入手,详细介绍了这种新语言开发的各个环节,以及语言设计中的纠结和取舍。其中不乏对其他编程语言的考察和思考,向读者展示了创造编程语言的乐趣。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/93350.html

发表回复

登录后才能评论