CheerpX:使用 WebAssembly 在浏览器中运行任何编程语言


我们都知道 WebAssembly 支持多种语言,但是 CheerpX 有点特别。CheerpX 是 x86 处理器架构本身的模拟器 - 允许您直接在 WebAssembly 运行时上执行 x86 二进制文件。
CheerpX构建了一个基于 WebAssembly 的虚拟机来在浏览器中运行 X86 二进制文件。您可以使用它运行任何 REPL 环境。示例:https : //repl.leaningtech.com/?python3
 
从历史上看,JavaScript 一直是  Web的编程语言。这随着 WebAssembly 的引入而改变,尽管是以一种相当间接的方式。
从根本上说,WebAssembly 是一个 编译器:由来自不同源语言的专门程序发出的二进制表示 。
这也反映在 WebAssembly 引擎本身的设计中,它假设传入的字节码已经被很好地优化,并且它们的大部分内部优化管道被禁用。这与 JavaScript 编译形成鲜明对比,JavaScript 编译在该领域内最优秀的头脑数十年的工作投入到让低质量的 JavaScript快速运行 。
在撰写本文时,WebAssembly 最常使用基于 LLVM 的工具链从 C/C++ 代码生成。当努力移植现代动态编程语言(如 Python)时,首选的解决方案是编译 C/C++ 实现。为了实现这一点,可以使用精简版本,例如禁用 JIT 支持或依赖于本地构建组件的模块。
将重要的 C/C++ 代码库移植到 WebAssembly 并不一定是一项简单的工作。编程语言实现很可能有多个依赖于目标的代码路径或定义,因此所需的工作与将语言移植到新的本机架构没有什么不同。
如果在移植 Python 之后,你还想移植 Ruby……嗯,你需要从头开始。
 
CheerpX 的核心是 X86 架构的模拟器
显然,一个简单的模拟器在性能方面不会让你走得太远,所以我们实现了一个复杂的 JIT 编译器,它能够为热代码生成高效的 WebAssembly 表示。整个过程是 100% 自动化的,不需要任何元数据或假设。该系统非常健壮,它实际上可以处理在运行时在内部生成新代码的应用程序,甚至可以处理自修改代码。这意味着您实际上可以运行 NodeJS 之类的东西,包括完整的 V8 引擎及其卓越的 JIT 和代码垃圾收集。
可以想象,这是一个极其复杂的问题。在设计 CheerpX 时,我们决定只关注用户模式代码(Ring 3),忽略(目前)系统级(Ring 0)功能的复杂性。为了缩小差距并让真实世界的应用程序运行,我们实现了 Linux 系统调用接口的(子集)。
到现在为止,可能很清楚 CheerpX 可用于在浏览器中运行任何编程语言 REPL。我们没有将每种语言环境手动移植到 WebAssembly,而是让整个 Linux/X86 构建运行在 CheerpX VM 之上。
。。。
  
Flash 模拟器
CheerpX 是CheerpX for Flash的基础技术, 它是一种 Flash 模拟器,可在纯 HTML5 中运行旧版 Adob​​e Flash 内容。CheerpX for Flash 通过运行 Flash 播放器(Linux 的 X86 二进制文件)来工作,其运行方式与我们在本文中展示的方式并无不同。
原文点击标题