【问题标题】:Is there a way to run C program locally in a browser?有没有办法在浏览器中本地运行 C 程序?
【发布时间】:2020-05-21 00:25:26
【问题描述】:

是的,有a duplicate problem,不过是5年前问的,好久没更新了。

2020年随着WebAssembly的发展,有没有办法在浏览器本地编译运行一个简单的C程序?

有一个叫做WasmFiddle的平台可以在浏览器中编译C到wasm,但是它缺乏标准库的支持,例如stdio.h。我认为我们可以在 js 中实现标准库并将其导出到 wasm?但这需要大量工作。

我最初的目标是为学生构建一个基于 Web 的 IDE,让他们学习 C 编程,而无需在服务器上花费大量成本进行远程运行。因此,只需要 stdio.h、math.h、string.h 等库。

更新:this 似乎是 libc 到 wasm 的一个很好的实现。

不需要高性能,所以基于 wasm 的解决方案,也许还有一个用 JS 实现的运行 c 的 VM 都是很好的解决方案。

【问题讨论】:

  • 使用标准库在浏览器中运行 C 程序没有任何意义。即使你有整个 C 库可用,你也无法使用它。浏览器不允许直接从其 JavaScript 运行时与系统交互,这是一种安全措施。
  • 终极目标是什么?允许用户输入 C 程序?
  • 您想使用标准库的哪些功能?

标签: javascript c web webassembly


【解决方案1】:

EmscriptenWASM 是这里两种流行的解决方案。

不要期望出色的性能,但您应该能够将其与一些 JavaScript、CSS 和 HTML 链接起来,用于您的代码编辑和控制台视图。

如果您可以运行服务器,那么您可以使用这个Jupyter Notebook 内核:https://github.com/jupyter-xeus/xeus-cling

这是 WASM 中的示例,没有服务器:https://github.com/tbfleming/cib

【讨论】:

  • 性能不会有问题,因为这是初学者运行非常简单的程序,比如练习'if'语句。
  • CIB 是一个很好的解决方案,但现在有点问题?一个简单的 helloworld 程序导致我的浏览器出现“内存访问越界”。
【解决方案2】:

为了让您对 emscripten 和其他相关技术可以做些什么感到震惊,请查看 Fabrice BellardTiny C CompilerTiny EmuJsLinux 上的工作。

JsLinux,基本上是用 JavaScript 运行虚拟机,Bellard 有同时运行 Linux 和 Windows2000 的示例

【讨论】:

    【解决方案3】:

    你可以去核,把所有东西都放在一个虚拟机中,当二进制文件在一些输入代码上运行并编译一些二进制文件作为输出,然后再次在虚拟机中运行。所有客户端,由于虚拟化,性能会有所下降。

    示例:https://twitter.com/alexpignotti/status/1261357985617469442?s=20(我的一位同事正在研究这个问题)

    【讨论】:

      【解决方案4】:

      您有 2 个选择,要么获得某种在浏览器中运行的 VM,该 VM 能够运行 C 可以编译的某种架构,要么使用 EMScripten 编译为 WASM。

      WASM 显然是更好的选择,因为它在所有(体面的)浏览器中都受到原生支持

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-17
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 2017-06-08
        • 2011-10-27
        • 2022-06-23
        • 2020-03-20
        相关资源
        最近更新 更多