虚拟机技术综述-3 应用程序虚拟机
3 应用程序虚拟机 应用程序虚拟机提供给用户一个虚拟的应用程序二进制接口环境,也称作高级语言虚拟机。它能够使应用程序与平台相对独立。因为可以开发针对不同平台的虚拟机版本,所以任何针对该虚拟机的应用程序都能在实现了该虚拟机的平台上运行,而不是为具体的应用程序开发出针对众多平台的版本。应用程序在虚拟机上的运行可以采用解释或即时编译的方式。 通过设计一个完整而通用
·
应用程序虚拟机提供给用户一个虚拟的应用程序二进制接口环境,也称作高级语言虚拟机。它能够使应用程序与平台相对独立。因为可以开发针对不同平台的虚拟机版本,所以任何针对该虚拟机的应用程序都能在实现了该虚拟机的平台上运行,而不是为具体的应用程序开发出针对众多平台的版本。应用程序在虚拟机上的运行可以采用解释或即时编译的方式。
通过设计一个完整而通用的运行时框架可以实现较好的跨平台可移植性。在设计一个进程级虚拟机的同时,定义好一个应用程序开发环境便可以达到这个目的。这个虚拟机环境不直接对应于任何一种真实的平台,但它符合应用程序开发的高级语言特性,并有很好的可移植性。这种应用程序虚拟机与进程虚拟机很相似,但它尽可能地减少与硬件和操作系统相关的特性,因为这些特性降低了平台无关性。
应用程序虚拟机是随着Pascal语言环境而流行起来的。在传统的编译系统中,如图7,包含一个前端和代码生成器,它执行词法、语法、语义分析,以得到一种简单的中间代码,这种中间代码不与机器码相似但的机器码更为抽象工厂的,这种中间代码不不包含具体的寄存器分配。代码生成器则把中间代码转换成二进制代码,这种二进制代码就包含了某种特定的指令集和与操作系统相关的机器码。这个二进制文件便能够在支持该种指令集和操作系统的平台上执行。为了能让程序能够在另外一种平台上执行,必须将源程序编译成另外一个平台的二进制代码。
图7 编译器发布的流程
在虚拟机系统下开发,则过程稍有不同,主要是程序的发布的时机不同。如图8,一个经典的编译器前端产生中间形式的抽象机器码。在应用程序虚拟机中,这里产生的是基于栈的指令集代码。这种虚拟指令集本质上就是虚拟机的机器代码。这种可移植的虚拟指令集代码可以发行到不同的平台上执行。对于每一个平台,能够执行这种虚拟指令集的虚拟机都需要被实现。以简单的形式来说,这个虚拟机包含一个解释器,能够取指令、译码、执行对应的状态转换(可能涉及内存和栈操作)。输入输出功能则是通过作为该虚拟机一部分的标准库来实现。对于高性能的虚拟机来说,虚拟机代码可以转换成宿主机机器码,以便在宿主平台上直接运行。
图8 虚拟机发布的流程
应用程序虚拟机可以使软件移植性变得容易。虽然实现虚拟机需要付出一些成本,但是与在每一个平台上开发一个编译器并且将所有应用程序重新编译相比,这仍然是一个相对简单的工程,甚至也比为一个典型的真实指令集开发一个进程虚拟机更简单。
太阳微系统公司的JAVA虚拟机和微软公司.NET框架的通用语言接口是广泛使用的应用程序虚拟机的例子。平台无关性和安全性是JAVA虚拟机和通用语言接口的核心。这两种系统的指令集都是基于字节码的,也就是说,指令被解码为字节序列,每个字节是一个操作码,一个单字节操作数或者是多字节操作数的一部分。这些字节码指令集是基于堆栈的,并且有抽象数据规范和内存模型,而且内存大小在理论上是无限的,因为垃圾收集通常是实现的一部分。因为任何一种硬件平台都可能是执行JAVA或者基于通用语言接口程序的平台,所以程序不会编译成面向特定操作系统的代码,同时,一个标准库会是整个执行环境的一部分。其它的应用程序虚拟机有Forth virtual machine、Glulx、Inferno、Low Level Virtual Machine (LLVM)、Lua、Adobe Flash Player、MMIX、O-code machine、p-code machine、Parrot、Perl virtual machine、Portable.NET、Python virtual machine、ScummVM、SECD machine、Smalltalk virtual machine 、Sqlite virtual machine、Squeak virtual machine、TrueType virtual machine、Valgrind、VX32 virtual machine、Waba、Warren Abstract Machine、Z-machine等。
更多推荐
已为社区贡献50条内容
所有评论(0)