了解 Emscripten/ASM.js 和浏览器沙箱

Understanding Emscripten/ASM.js and the browser sandbox

很抱歉这里的基本问题。我正在尝试围绕 Emscripten,ASM.js,并将低级语言编译为 javascript。

这是我不明白的地方。你可以在原生 C 程序中做你不能(也不应该)在基于浏览器的 js 中做的事情。例如,在本机应用程序中,您可以访问文件系统或关闭计算机。

假设我写了一个 C 程序读取 /etc/passwd 然后关闭计算机。然后,我将该程序编译为 js 并将其弹出到 <script> 标记中。当我访问带有 <script> 标签的页面时会发生什么?很明显,它不会关闭计算机,但它甚至可以编译吗?

在我看来,与低级语言相比,浏览器中的 javascript 运行 是如此有限,以至于我看不出如何将任何有意义的应用程序简单地编译成 js 而完全没有打破它。

勾选Emscripten docs。例如,它说:

Applications compiled with Emscripten usually expect synchronous I/O, so Emscripten itself provides file systems with completely synchronous interfaces.

However, due to JavaScript’s event-driven nature, most persistent storage options offer only asynchronous interfaces. Emscripten offers multiple file systems that can be mounted with FS.mount() to help deal with persistence depending on the execution context.

如果向下滚动,您会发现:

MEMFS

This is the default file system mounted at / when the runtime is initialized. All files exist strictly in-memory, and any data written to them is lost when the page is reloaded.

我相信这应该可以回答您的问题。在一天结束时,Emscripten/ASM 将尝试使用基于 JavaScript 的 polyfill 来模拟低级细节。