Wasm 玩出花?在浏览器中运行虚拟机!
最近在 Github
上看到了一个挺有意思的项目:运行在浏览器环境中的虚拟机:WebVM
。
传统意义上的虚拟机(VM)是一种创建于物理硬件系统(位于外部或内部)、充当虚拟计算机系统的虚拟环境,它模拟出了自己的整套硬件,包括 CPU
、内存、网络接口和存储器,它依然需要运行在一个服务器上。
而 WebVM
和我们平时看到的传统的 WebShell
是完全不一样的,这个 WebVM
是没有服务器的,它单纯依赖于 HTML5/WebAssembly
就可以独自在浏览器客户端中运行一个基于 Debian
的完整虚拟机。
WebVM
是基于 CheerpX
实现的,CheerpX
是基于 Cheerp
编译器实现的... 别着急,我们先从 Cheerp
开始看, ~
Cheerp
WebAssembly
我们都知道,是一种二进制指令格式,简称为 Wsam
,它可以运行在适用于堆栈的虚拟机上。WebAssembly
存在的意义就是成为编程语言的可移植编译目标,让在 Web 上部署客户端和服务端应用成为可能。简单来说,它可以让我们在 Web
环境中运行服务端代码。
而 Cheerp
就是一个可以生成 WebAssembly
的 C/C++
编译器。
CheerpX
CheerpX
是一种 x86
到 WebAssembly
的虚拟化技术,声称可以完全在客户端运行任意的 x86
应用程序。
CheerpX
构建了一个基于 WebAssembly
的虚拟机来在浏览器中运行 X86
二进制文件。您可以使用它运行任何 REPL
环境。示例:https://repl.leaningtech.com/?python3
WebVM
而 WebVM
,是一个在浏览器中运行的基于 Debian
的完整虚拟机,由 CheerpX
提供支持,由以下几部分组成:
CheerpX
作为JavaScript API
执行引擎,特别是cx.run(…)
这样的代码,用于启动bash
进程。然后 bash 可以在用户键入命令时启动其他进程。Xterm.js
作为主要的 UI 组件:Xterm.js
负责解释vim
等应用程序使用的终端转义,并将用户输入发送回CheerpX
。输入通过应用程序的标准输入文件描述符提供给应用程序。一个 Debian buster
磁盘映像,采用ext2
格式并安装了一堆软件包。它们被放在CDN
上,这可以最大限度地提高可扩展性。
WebVM
的使命和愿景是让程序运行:
无需修改; 无需重新编译; 完全客户端模式。
你可以在 WebVM
上尝试下面这些操作:
# 运行一个简单的 python 程序
python3 examples/python3/fibonacci.py
# 使用 gcc 编译一个简单的 C 示例
gcc -o helloworld examples/c/helloworld.c
# 运行!
./helloworld
# 转储代码,验证这实际上是一个 x86 二进制
objdump -d ./helloworld
# 编辑 helloworld.c 文件,然后再试一次
vim examples/c/helloworld.c
目录中提供了各种语言的示例文件 examples
。
最后
这个应用虽然离生产还有很大一段距离,但它确实让我看到了 Web
的无限可能。
Web
平台正在成为应用程序分发的主导平台。特别是自从 WebAssembly
标准化以来,这样的趋势已经越来越明显了,想象一下:一种新的编程语言一旦被开发出来,就会被所有现代浏览器支持,这可以持续满足大型 Web
应用程序的性能需求。
WebAssembly
为浏览器世界带来了真正的创新,以及视角和责任的转变。
对此,你怎么看?