wine:wine明确告诉你,wine不是VM也不是模拟器,甚至都写到名字里去了(Wine Is Not an Emulator)。他说他是兼容层(Compatibility Layer)。但是他和各种MRE也有相通之处,而且wine也提供了winelib用于开发用于Windows的程序(https://wiki.winehq.org/Winelib_User's_Guide)。在维基百科中也称wine为Windows Runtime Environment。不过wine和MRE的最大区别还是wine没有转换CPU平台的步骤(而很多时候人们把执行这个过程的程序叫VM的)。
由于有些概念争议很大,仅供参考。如果大家有不同意见可以讨论。
前文和原题链接:https://bbs.deepin.org/zh/post/256348
python:可能大家觉得用VM的语言就一定是Java那样的,实际上各种解释性的语言基本上都可以看作VM。大家可能疑惑的点在于,Java运行的是编译了的字节码,而python运行的是高级语言的脚本,这能看作一类吗?其实python也完全可以先编译再运行,而且python调用模块时为了提高效率都会自动编译的。想手动编译也可以用模块py_compile。在官方文档里运行字节码的程序也确实叫Python Virtual Machine。
几乎所有解释型语言都是有VM参与的。不过我认为shell语言应该不是。
flash:虽然这是一个过时的技术,但是他也是用VM的,名为Tamarin(曾用名是ActionScript Virtual Machine 2),内置在Flash Player里。有人会把他当成动画软件了,实际上他的主要功能还是编写程序。他运行的语言ActionScript是*的魔改版。另外一*自然也是用VM运行的,不过一般*引擎(engine)。
LLVM:这个自然也是很多人疑惑的点。为什么他一个编译器居然叫VM?其实他本身就是仿照Java的原理设计的,但是是把传统的编译型语言编译成通用的IR(相当于字节码),然后再运行到各个设备上,这个过程和JVM是类似的。其实现在大家也可以使用LLVM的解释器lli直接执行IR,但是由于效率很低,几乎没人去用,所以大家都把LLVM当作编译器了,也算是无心插柳吧。
另外,我们说的LLVM核心库只是LLVM项目的一部分,只是还在用LLVM当作名称而已。LLVM只负责从IR转换成各个平台的机器码,而Clang等程序才是真正的编译器(从源代码编译到IR,再调用LLVM)。LLVM项目现在已经发展成各种制作程序的基础设施集合,有替换GNU工具链的潜力。
问题来了,GCC算吗?其实任何编译器都会采用IR作为中间语言,GCC也不例外,但是GCC的IR显然不像LLVM一样通用,并且也不能解释运行。我认为不算的。
wine:wine明确告诉你,wine不是VM也不是模拟器,甚至都写到名字里去了(Wine Is Not an Emulator)。他说他是兼容层(Compatibility Layer)。但是他和各种MRE也有相通之处,而且wine也提供了winelib用于开发用于Windows的程序(https://wiki.winehq.org/Winelib_User's_Guide)。在维基百科中也称wine为Windows Runtime Environment。不过wine和MRE的最大区别还是wine没有转换CPU平台的步骤(而很多时候人们把执行这个过程的程序叫VM的)。
那么wine到底算不算VM呢?虽然他自己矢口否认,但是从VM的定义来说,我觉得他是的(毕竟我连Container都算到VM里面去了)。
WoW64:这个也被称为兼容层。但是有意思的是,微软官网上直接写他是模拟器了(https://learn.microsoft.com/en-us/windows/win32/winprog64/running-32-bit-applications)。既然他有转换CPU平台的功能,那么称为模拟器也是没有问题的。类似的程序有在ARM Linux上运行x86程序的box86、box64等。
chroot:其实很多容器的底层技术和chroot都是差不多的。虽然chroot功能比较简陋,但是还是很符合VM的理念。实际应用上chroot也是经常用于直接使用另一个已安装操作系统的资源。