3

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

 2 years ago
source link: https://www.jdon.com/58059
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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 二进制文件)来工作,其运行方式与我们在本文中展示的方式并无不同。

原文点击标题


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK